Roadmap¶
Versioning
The template and generated packages are at 0.1.0. A v1.0 will be
tagged once the surface has proven stable in real projects — the milestones
below track scope, not release versions.
Milestone 1 — foundation (shipped)¶
- [x] P1 Shippable skeleton — hexagonal core, FastAPI backend, Typer CLI, React web UI, CI, one-command dev
- [x] P2 Resource Vault demo — projects, notes, tags, search through every adapter
- [x] P3 Generated typed client — OpenAPI →
openapi-typescript+openapi-fetch+ TanStack Query - [x] P4 CLI as control plane — Alembic migrations,
db/buildgroups,info/fmt/version - [x] P5 Extension manager — dev-time plugins, registry, license gating, admin UI, 3 examples
- [x] P6 Rebranding & docs — Copier prompts +
copier update, this docs site, comparisons
Milestone 2 — licensing & desktop (shipped)¶
- [x] Real licensing — Ed25519 signed offline tokens, file + HTTP providers, vendor tooling (
opk license keygen|issue),require_plan/require_featureroute gates, frontenduseEntitlement()/LockedFeatureCard, a License admin tab and a gated demo feature. - [x] Desktop — pywebview shell calling the core in-process over a JS bridge (no HTTP sidecar, no port), per-user app-data storage,
opk build desktop(PyInstaller); signing/notarization documented, not solved.
Milestone 3 — agent-ready (shipped)¶
- [x] Agent-ready rework path — every demo line fenced with a grep-able
[demo]marker, the Make it yours recipe, andAGENTS.md+CLAUDE.mdshipped in every generated project, pre-rendered with the project's actual names so AI coding agents can replace the demo with the owner's product.
Milestone 4 — marketplace, desktop choice & one-command deploy (shipped)¶
- [x] Marketplace — a Marketplace tab and
/api/marketplacethat merge installed plugins with a vendor catalog (marketplace/catalog.json, or a hosted URL viaAPP_MARKETPLACE_URL); paid extensions unlock by pasting a signed license token, applied without a restart (plugin gates are checked per-request now). Ships a demo extension that lives in the repo but installs on demand. See Marketplace. - [x] Choose your desktop shell — a Copier question picks pywebview (in-process, PyInstaller — the default), Electron or Tauri (both thin native windows over a sidecar backend that serves the API and the web UI on one localhost origin), or none. The CLI keeps a single surface:
opk desktopandopk build desktopdo the right thing per framework. See Desktop. - [x] One-command deploy stack —
opk stack upruns the product in Docker: nginx serving the built UI and proxying/api, the backend, optional PostgreSQL (a Copier question), health checks and volumes wired.opk stack shareadds a Cloudflare quick tunnel and prints a publictrycloudflare.comURL for demos and device testing. See Deployment. - [x] Backend serves the web build — when
apps/frontend/distexists the FastAPI app serves it at/, so a single process (or single container) can deliver the whole product; this is what makes the sidecar desktop shells CORS-free.
Milestone 5 — sell it, host it, ship it (shipped)¶
- [x] Payments recipes — Payments: a complete Stripe webhook →
license issue→ email recipe, a Lemon Squeezy adapter that maps their native license API ontoHttpLicenseProvider(no license server at all), and the Paddle variant. The app side was already done; now the checkout side is copy-paste. - [x] Auth & multi-user — user accounts as a runtime switch (
APP_AUTH_ENABLED), not a Copier variant: scrypt passwords, hashed bearer sessions, first-run admin setup, a Users admin tab,user add|list|passwd|removeCLI, and admin-gated operator actions. The desktop/local story stays accountless. See Auth. - [x] Runtime plugin installation — catalog items with a
packagegain an Install button:POST /api/marketplace/installpip-installs, re-scans entry points and mounts routes live. Fenced honestly: opt-in (APP_MARKETPLACE_ALLOW_INSTALL), admin-only under auth, refused in frozen builds. Frozen desktop builds now bundle installed plugins (--copy-metadata+ hidden imports) instead of dropping them. - [x] Desktop release CI & auto-update story — a generated
release.yml: tag push → installers for Windows/macOS/Linux attached to a GitHub Release (dry-run via manual trigger). Electron ships its updater feed (latest*.yml+ GitHub publish config); Tauri and pywebview update paths are documented with exact steps. See Releases. - [x] Generated-client drift gate —
opk gen --checkin both the generated project's CI and this repo's CI. Unblocked by pinningopenapi-typescriptexactly — the format-drift concern was real, so the pin is the fix, not hope. - [x] Deploy recipes — copy-paste starts for Fly.io, Railway, Cloud Run (+ optional Firebase Hosting front), static hosts with
/apiproxying, VPS + Caddy, and named Cloudflare tunnels — recipes in docs, zero new host lock-in in the template.
Milestone 6 — AI products (shipped)¶
- [x] Optional AI SaaS profile — a Copier switch adds a provider-neutral runtime, mock/HTTP providers, durable queue worker, job reconciliation and a complete AI Studio. See AI SaaS.
- [x] Metered credits and payments — atomic tenant balances, immutable reserve/consume/refund ledger, idempotent client requests, Stripe Checkout credit packs and verified duplicate-safe webhooks.
- [x] Private assets — validated uploads, tenant ownership, expiring provider URLs and local or S3-compatible storage.
- [x] Tenant isolation — all project, note, generation, asset and credit access is scoped to the hosted user while local mode retains the
__local__tenant.
Next¶
- Plugin permissions & sandboxing — enforce the manifest's declared
permissions(today they are informational): restrict network/filesystem where feasible, and explore process isolation for untrusted extensions. - Signed catalogs & pinned packages — sign
catalog.jsonwith the vendor key and hash-pinpackagerequirements, so a hosted catalog compromise cannot push arbitrary code to installs. - SSO / OIDC — enterprise login for the hosted story;
enforce_authis the seam it plugs into. - Organizations and team tenancy — user ownership now ships; the next layer is shared workspaces, roles and organization billing.
- Turnkey update check for pywebview — promote the documented check-and-point snippet into a shipped, opt-in helper with UI.
Explicitly out of scope for now¶
To stay opinionated and avoid a "supports everything, supports nothing" repo, the template does not ship multiple databases beyond SQLite/PostgreSQL, multiple payment providers, or Kubernetes manifests. Payments and hosting arrived as documented recipes (Payments, Deploy recipes) rather than template code — that stays the pattern.