Skip to content

Choosing a sync source

appctl does not add a new CLI flag for every web framework. Long-term, that does not scale: each stack would need its own parser and tests. What scales is a small set of machine-readable inputs plus an extension point (plugins) for special cases.

You have…UseDetails
An OpenAPI 2/3 (or Swagger) documentappctl sync --openapiNest (@nestjs/swagger), Spring / springdoc, FastAPI, ASP.NET (often emits JSON), and many other stacks can expose a spec. Point --openapi at a URL or file.
Only a database and SQL accessappctl sync --dbIntrospection from information_schema (or equivalent) for supported engines. No HTTP layer required.
An MCP server (HTTP)appctl sync --mcpModel Context Protocol tools map 1:1. Good when the app already exposes an MCP surface or a bridge.
Something elseDynamic pluginRust cdylib that implements the plugin SDK. Use when there is no spec and you need custom discovery.
A browser-only or legacy HTML appappctl sync --urlCrawl + forms (limited; prefer an API with OpenAPI when you can).

Built-in framework flags (Django, Rails, Laravel, …) exist for projects that do not yet expose OpenAPI: appctl reads project files to build a best-effort contract. When you can export OpenAPI, prefer --openapi so tools match what the server actually documents.

Stacks without a dedicated flag (examples)

Section titled “Stacks without a dedicated flag (examples)”
EcosystemPractical approach
Next.js (App Router, Route Handlers)Export or generate an OpenAPI document from your API route layer (or a BFF) and sync --openapi. If you only have server actions with no spec, use --db or --mcp if you wrap the backend.
NestJSUse @nestjs/swagger and the generated JSON/YAML: --openapi to that file or URL.
Java / Spring BootUse springdoc (or similar); typically /v3/api-docs (often listed automatically when you pass a root base URL to --openapi—see OpenAPI).
Ruby (not using the Rails sync)If you use a gem that serves OpenAPI, use --openapi. Otherwise --db or a plugin.
gRPCNo first-class gRPC sync today; use a sidecar that exposes gRPC or REST, or a plugin.
  • One OpenAPI path matches how API gateways, gateways, and clients (Postman, Insomnia, code generators) already work: contract-first.
  • MCP is the “bring your own tool server” path that does not require appctl to know your repo layout.
  • Plugins keep odd integrations out of the core binary while still being first-class in the sync command.