Skip to content
LACE
  • v0.1 Current
  • Python
  • TypeScript Soon

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?

PathBest forWhat happens
Builder UIFirst app, non-engineers, prompt → plan → build flowArchitect agent scaffolds app/, runs proof lanes, you publish from the UI
lace-app createEngineers who want a repo on disk immediatelyProvisions app row + mints git credential + scaffolds repo locally in one command
REST APIAutomation, CI, platform operatorsPOST /v1/apps then GET /v1/apps/{app_id}/git-credential + scaffold

1 — From the UI (App Builder)

  1. Open App Builder in LACE and describe the app in plain language (data you need, tools, agent behaviour).
  2. The architect model renders a plan: data collections, tools, agents, routes, pipelines, and UI stubs. Review and approve.
  3. The builder constructs the app in a sandbox, validates through proof lanes, and seals a package.
  4. Publish — the first release is created, the sidecar boots, routes mount at /apps/<app_id>/api/*.
  5. 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)

terminalbash
# 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|notesnotes copies the notes_app example (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

terminalbash
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.

pythonapp/manifest.py
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