lace-app-sdk
Create a new app — UI, API & CLI
Three entry points, same manifest, same contracts. Pick the one that fits your workflow — they converge at publish.
All three paths require a LACE tenant and an API key. Run lace-app auth login first, or set LACE_API_URL + LACE_API_KEY in the environment.
Which path should I use?
| Path | Best for | What happens |
|---|---|---|
| Builder UI | First app, non-engineers, prompt → plan → build flow | Architect agent scaffolds app/, runs proof lanes, you publish from the UI |
lace-app create | Engineers who want a repo on disk immediately | Provisions app row + mints git credential + scaffolds repo locally in one command |
| REST API | Automation, CI, platform operators | POST /v1/apps then GET /v1/apps/{app_id}/git-credential + scaffold |
1 — From the UI (App Builder)
- Open App Builder in LACE and describe the app in plain language (data you need, tools, agent behaviour).
- The architect model renders a plan: data collections, tools, agents, routes, pipelines, and UI stubs. Review and approve.
- The builder constructs the app in a sandbox, validates through proof lanes, and seals a package.
- Publish — the first release is created, the sidecar boots, routes mount at
/apps/<app_id>/api/*. - Iterate: prompt an edit, or switch to clone & local dev for code-level changes.
See the App Builder guide and the product walkthrough at App Builder product.
2 — From the CLI (lace-app create)
# already logged in via lace-app auth login
lace-app create acme.field_intake --name "Field Intake"
# → provisions app row, mints git credential, scaffolds repo at ./field_intake
cd field_intake && ls
Flags:
lace-app create <app-id> --name "Display Name"— scaffold a new app repo.--dir DIR— choose where to place the repo.--template minimal|notes—notescopies thenotes_appexample (data + routes + agent).
Under the hood, cmd_create in src/lace_app_sdk/cli.py calls POST /v1/apps, mints a short-lived git credential via GET /v1/apps/{app_id}/git-credential, and hands it to git through a one-shot credential helper — no raw token on the command line or on disk.
3 — From the REST API
curl -X POST https://api.laceplatform.com/v1/apps \
-H "Authorization: Bearer $LACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"app_id":"acme.field_intake","display_name":"Field Intake","template":"minimal"}'POST /v1/apps— create the app row (requires tenant-scoped API key with builder scope).GET /v1/apps/{app_id}/git-credential— mint a per-app, short-lived git credential for clone/push.GET /v1/apps/{app_id}/GET /v1/apps— inspect.
Prefer the CLI for the happy path — it handles credential mediation for you. Use the raw API when driving creation from CI or another service.
After creation — the manifest
All three paths produce the same artifact: an app repo with a manifest. The manifest is pure data — the platform can project it without importing your code.
from lace_app_sdk.manifest import LaceAppManifest
from app.data import TICKETS
MANIFEST = LaceAppManifest(
app_id="acme.field_intake",
display_name="Field Intake",
version="0.1.0",
data_collections=[TICKETS],
tool_providers=["app.tools:ToolProvider"],
agent_providers=["app.agents:AgentProvider"],
route_providers=["app.routes:RouteProvider"],
)Next steps
- Clone the repo & run locally —
lace-app clone+lace-app dev - What gets installed — the file tree and what each file owns
- Quickstart — the four-file governed app from scratch