What you need
- Node 22.18 or later. The starter runs its TypeScript directly on Node.
- A Tassyir account at app.tassyir.io.
- A tunnel that gives your machine a public https address on port
443, such as
cloudflared
or ngrok. Tassyir only calls https addresses on port
443 with a public hostname: never
localhost, an IP address or another port.
tassyir, is coming to do the console steps below from
a terminal. Until it ships, this guide uses the developer console in the
dashboard.
1. Create the project
review-requests/ and prints the next steps. The handle (the
folder’s name by default) is your app’s permanent, unique name on Tassyir: it
becomes the handle in tassyir.app.toml. Pass options after --:
AGENTS.md, a CLAUDE.md
and a Claude Code skill that explains the Tassyir contract.
Then install and set up:
npm run setup writes .env from .env.example, with a new random key that
encrypts the tokens the app stores.
2. Give your server a public address
Start the tunnel to port 3000 and leave it running:hosting.url in tassyir.app.toml
(no trailing /), then check the manifest with the Tassyir API’s own
validator:
3. Create the app in the developer console
- Open app.tassyir.io/en/developers and turn on developer mode. It is free, on every plan.
- Create an app and choose “Your own server”. Its handle must be exactly
the
handleoftassyir.app.toml. It never changes afterwards. - In the app’s Credentials tab, create a client secret. It is shown once: copy it now.
- Fill in
.env:TASSYIR_CLIENT_ID: the client id (app_…), on the Credentials tab;TASSYIR_CLIENT_SECRET: the secret (tsy_cs_…);TASSYIR_APP_ID: the app’s numeric id, the number at the end of the app’s address in the console (/developers/apps/<id>). Webhooks name your app by this id; it is not the client id.
- In the Versions tab, upload
tassyir.app.toml. Your first version is current at once: custom apps are not reviewed.
.env, and never put the secret in your page or a URL.
4. Create a dev store
In the console, open Dev stores and create one. A dev store is a business for testing: about 30 products, 200 orders in every state across the 58 wilayas, and buyers with fake phone numbers. It costs nothing, and nothing it does reaches the outside world: carriers, ad pixels, WhatsApp and payments are switched off, and its storefront takes no orders. See Dev stores.5. Start the server
http://localhost:3000, restarts when src/ changes, and
rebuilds the page. If a setting is missing, it names it and says where to
find it.
6. Install the app
On the app’s Overview tab in the console, copy the install link, open it, pick your dev store, and install. The install screen lists the scopes your manifest asks for, with your reason for each (Scopes and consent). The dashboard then opens your page: the dev store’s pending orders, and a setting saved in Tassyir through the dashboard’s save bar. Your page asked App Bridge for an ID token, your server verified it and exchanged it for an access token, then called the Admin API (Tokens).7. Watch webhooks
Create an order in the dev store’s dashboard: your server logsorders/created. In the console, the Installs tab sends a test delivery
to your endpoint, and the Webhook deliveries tab shows every attempt and
replays one (Webhooks).
Changing the manifest
Whenever you changetassyir.app.toml (a scope, a webhook topic, the
address):
npm run validate;- upload it in the Versions tab as a new version;
- accept the update on the dev store: Apps, Installed apps, Update.
Deploying
Any host that runs Node 22.18 or later behind https on port 443 works:- on the host,
npm ci,npm run build, thennpm start, with the variables of.envset in the host’s environment (never upload.env); - set
hosting.urlto the host’s address, upload the manifest, and accept the update.
When something fails
Next
- The manifest: every field of
tassyir.app.toml. - Admin API conventions: lists, errors, retries and rate limits, before you call more of the API.
- Webhooks: the topics, and handling them safely.