Two doors onto one press.

Packages and templates share assemble, scheduler, then press. Bearer POST /v1/render or OAuth on /mcp. The press only compiles typst-package.

Two kinds, one press

typst-package is files you send. typst-template is a web kind: a ref plus JSON, then the same scheduler and press. There is no press kind named template.

AxisNomadunbilledpresstypst-packagetypst-templatewebschedulerwallet
web

Forms, keys, and MCP on pdf.railman.io. Assembles templates. Never compiles.

scheduler

Queue, cache, retries, DLQ. Only R2 writer. Only wallet debit.

press-worker-typst

Typst WASM. No public URL, no D1. Service binding is the capability.

AxisNomad

Binds pdf-press-typst directly and is unbilled.

How kinds bill

Who writes data.json, and whose wallet pays.

typst-package

Caller sends the directory.

Caller wallet

typst-template

web writes data.json from a ref plus JSON.

Caller wallet

AxisNomad

Binds pdf-press-typst directly. Skips web.

Unbilled

Hops

Physical names stay frozen. Do not invent synonyms.

web

Session, API keys, MCP, and template assemble. Host pdf.railman.io.

scheduler

Queue, content-addressed cache, retries, DLQ. The only wallet debit. Public callers cannot force a cache miss.

press-worker-typst

Physical name pdf-press-typst. Typst WASM, no public hostname, no D1.

wallet

One Durable Object per userId. 8000 credits a month. web never subtracts.

egress

Isolated outbound HTTPS GET for CIMD. Physical name pdf-egress.

MCP

OAuth at /mcp. Same package and template shapes as HTTP. Third client path, not a third press.

PDF Railman

Fill, then generate. Invoice, quote, and receipt need no account.