A worked example
A permit-intake app, with a public submission portal, a reviewer dashboard, and the data behind both,
written out in full so every section appears at least once. It is an illustration rather than
something to clone, and it is deliberately larger than the everyday shape: it spans several languages,
which is why it does list its functions explicitly. Each name is its own
element folder, one per language, and that is what an explicit
functions list is for. Most backends are a single language in flat files: one
element, auto-discovered, with the list dropped entirely.
name: permit-intake
atomic:
function_memory: 32MB
function_timeout: 60s
rate_limit: 1000/min
functions:
- submit
- permit-types-list
- status-get
- reviewer-login
- reviewer-queue
- reviewer-submission
- reviewer-mailbox
- reviewer-blob
- decision-apply
- validator
- notifier
backbone:
blob_max_size: 10MB
blob_max_count: 200
queue_max_depth: 500
nosql:
- name: submissions
size: 200MB
- name: audit-log
size: 100MB
- name: mailbox
size: 50MB
- name: reviewers
size: 20MB
seed: ./backbone/reviewers.jsonl
- name: permit-types
size: 20MB
seed: ./backbone/permit-types.jsonl
blobs:
- name: uploads
size: 500MB
queues:
- validate
- notify
secrets:
MUNICIPALITY_NAME: "Amsterdam"
SUBMITTER_BASE_URL: "/status.html"
canvas:
canvas_size: 50MB
sites:
- ./canvas/public
- dir: ./canvas/reviewer
route: /reviewerEvery section it uses has a page of its own: Atomic, Backbone and Canvas.