Quickstart
We’ll scaffold an app, run it locally, and deploy it to the platform. Pick your language — the rest of the docs covers both.
1. Install the CLI
Section titled “1. Install the CLI”pip install linkworld# verifylinkworld --version2. Scaffold
Section titled “2. Scaffold”linkworld init hello-world --lang python --github-owner youcd hello-worldOr TypeScript:
linkworld init hello-world --lang typescript --github-owner youcd hello-worldYou’ll get a working app with:
linkworld.app.yaml— the manifestmain.py/app.ts— handlers (on_install+on_inbound)requirements.txt— pinned to the latest publishedlinkworld-sdkDockerfile— for image buildsAGENTS.md— primer your IDE LLM (Cursor / Claude Code / Codex) reads automatically; tells it which platform tools exist and how to discover the rest via the MCP serverlinkworld.eval.yaml— passing eval suite out of the box. Runlinkworld evaland you should see ✓ on every scenario before you write any code yourself..github/workflows/deploy.yml— CI that pushes to GHCR + registers with the platformweb/index.html+app.js+styles.css— frontend bundle that mounts at/apps/<slug>in the tenant shell, wired to the postMessage bridge. See Building app UIs.
3. Run locally
Section titled “3. Run locally”# Pythonpip install -r requirements.txtLINKWORLD_LOCAL=1 python main.py# TypeScriptnpm installnpm run devLocal mode boots a local HTTP server on port 8080 with MockTools and
MockSecrets in place of the real platform. Trigger a tool:
curl -XPOST localhost:8080/tool/classify_text \ -H 'Content-Type: application/json' \ -d '{"text":"Q4 invoices"}'Stub a platform tool the app calls back to:
curl -XPOST localhost:8080/__mock/tool \ -d '{"name":"email_send","result":{"sent":true}}'Trigger an inbound:
curl -XPOST localhost:8080/event/on_inbound \ "subject":null,"received_at":"2026-04-26T10:00:00Z", "attachment_ids":[],"metadata":{}}'4. Run the eval suite
Section titled “4. Run the eval suite”Before deploying, verify the scaffold’s handlers behave as advertised:
linkworld evalYou should see all scenarios ✓ in green. The scaffold’s
linkworld.eval.yaml exercises the install handler and one
representative path per template (sweep + bot-noise filter for
email-triage, etc.). Add a scenario whenever you add a new code
path — it’s faster than re-deploying to test classification logic.
5. Sign in
Section titled “5. Sign in”linkworld loginOpens a browser → GitHub OAuth. Falls back to linkworld login --token <jwt>
if you’ve been issued an admin token.
6. Document for end users
Section titled “6. Document for end users”linkworld init scaffolded app_docs/user.md next to your manifest.
Open it and replace the placeholders with a 30-second elevator pitch +
the 2-3 things a non-developer end-user actually needs to know about
your app.
$EDITOR app_docs/user.mdWhen you deploy, linkworld deploy auto-uploads everything under
app_docs/**/*.md; docs.linkworld.ai/apps/<your-slug>/ renders the
narrative + an auto-generated Reference section (your tools, scopes,
agents, install settings) on the next docs build. The same content
also appears in the in-app Help tab.
Apps without a user.md don’t show up on the docs site at all —
the marketplace listing covers app discovery, the docs site is
reserved for apps with real end-user content. See
Documenting your app for the full
spec, caps, and the canonical Pipeline example.
7. Deploy
Section titled “7. Deploy”git init && git add . && git commit -m "init"git push -u origin maingit tag v0.1.0 && git push --tagsThe included GitHub Actions workflow builds the image, pushes to GHCR,
and runs linkworld deploy --skip-build --version 0.1.0 against the
platform. You’ll see the new version in
the dev console.
What’s next
Section titled “What’s next”- Read Concepts to understand manifests, scopes, and lifecycle hooks
- Building app UIs — ship a frontend bundle that mounts inside the tenant shell
- Documenting your app —
app_docs/convention + how it renders on docs.linkworld.ai - Manifest v2 reference for every field you can set
- Scope catalog for the platform tools you can call
- SDK — Browser bridge for the iframe
tools.call/ resize / navigate API - Best practices — idempotency, error handling, secret rotation