apistockdocs
Decisions

Product shape, presets and creation prompts

ADR-0014Accepted

Status: Accepted (2026-09-14) · Amends: ADR-0001 · Amended by: ADR-0035 (interactive prompts with flag parity), ADR-0041 (Full preset generated from examples/full-single), ADR-0050 (Custom preset out of v0.5; presets are whole golden trees)

Context#

apistock must let a developer run one command and get a working, production-grade API they own, similar in spirit to create-next-app, but with far more built in (authentication, database, jobs, audit, operations APIs). At the same time, security fixes must reach existing apps, and not every project wants every feature.

Options#

  1. Template only: copy a large starter repository into the project. Fast to build; fixes never reach existing apps.
  2. Framework only: apps import a runtime that hides everything. Upgradable; developers lose ownership and understanding.
  3. Library + CLI + recipes: logic in versioned library modules; the CLI generates thin owned glue from recipes; presets choose which recipes apply.

Decision#

Option 3.

  • Library apistock.dev/...: all reusable and security-sensitive logic.
  • CLI aps: new, add, gen, dev, upgrade, doctor.
  • Recipes: declarative, versioned with the library they call.

aps new <name> offers three presets:

PresetContents
MinimalHTTP server, config, logging, tracing, health, security defaults, OpenAPI + /docs, Dockerfile. No database; Docker not required.
FullEverything: PostgreSQL, jobs, email, authentication (ADR-0024), users/roles, tenancy choice (ADR-0023), audit, operations APIs (ADR-0026), seed data, tests, CI option.
CustomA checklist of features. Dependencies are added automatically (for example, passkeys ⇒ auth ⇒ PostgreSQL, email, jobs).

Prompts (each with a flag for non-interactive use: --preset, --tenancy, --mail, --github, --yes; interaction rules in ADR-0035):

  1. Preset.
  2. Tenancy, asked in business language (default single-tenant).
  3. Email provider: Resend or SMTP.
  4. GitHub repository and CI.

aps new applies base-minimal plus the selected feature recipes using the same engine as aps add (ADR-0021). The selection is stored in apistock.yaml.

Why#

  • The first run shows real value: signup, login and docs work immediately.
  • Keeping logic in the library keeps apps secure and upgradable.
  • One engine for new and add means a feature chosen at creation and the same feature added later are identical.

Trade-offs#

  • Three products to version and test together.
  • The Full preset is large; it is delivered over pre-release milestones (roadmap).
  • Every recipe combination the Custom preset allows must be tested; the CLI restricts combinations to valid dependency sets.

Consequences#

  • Golden reference apps (examples/minimal, examples/full-single, examples/full-multi) are hand-written and CI verifies the generator reproduces them.
  • Adding a feature to Full requires a recipe, a library module or extension, docs, and upgrade tests.
esc
↑↓ move↵ openesc close