# Guides

Each guide does one common job in a Jadpo app from start to finish: the
code to write, the commands to run and what they print, and the
reference topics that have the full rules. Every guide's code is
compiled and its tests run, so each one works as shown. Read the one
for the job in front of you; they don't depend on each other. To learn
Jadpo from the start, follow the [Learn path](/learn.md)
instead.

## Building

From a route to stored records, sign-in and customers kept apart.

| Guide | You end with |
|---|---|
| [Build an API](/guides/guide-build-an-api.md) | routes with typed input and output, the committed API record, and the OpenAPI document |
| [Store and change a record](/guides/guide-store-and-change-a-record.md) | an entity, its migration, and actions that add, change and delete records |
| [Query records](/guides/guide-query-records.md) | a query for one record, and a list a caller narrows and pages through |
| [Handle failures](/guides/guide-handle-failures.md) | a failure of your own, refused with the right status, handled where a caller wants to |
| [Add sign-in](/guides/guide-add-sign-in.md) | sign-in by emailed link and with Google, and routes that know who is calling |
| [Run background work](/guides/guide-run-background-work.md) | a schedule that starts a batch, an event with its subscriber, and a test of the whole run |
| [Keep customers' data apart](/guides/guide-keep-customers-data-apart.md) | a tenant named once, memberships and roles, and tests proving one company can't reach another's records |
| [Translate your app's text](/guides/guide-translate-your-apps-text.md) | typed messages in two languages, chosen from the browser's header, with stale translations caught by `jadpo check` |

## Services

Using what Jadpo has built in.

| Guide | You end with |
|---|---|
| [Send an email](/guides/guide-send-an-email.md) | a welcome email with typed templates, sent over SMTP after commit, tested and read in the dev inbox |
| [Ship a change behind a flag](/guides/guide-ship-a-change-behind-a-flag.md) | a change deployed switched off, both sides tested, turned on with no deploy, and the flag removed |
| [Limit how often a route is called](/guides/guide-limit-how-often-a-route-is-called.md) | a public form limited to five requests a minute, an API's own limit, and clients counted properly behind a proxy |
| [Add search to a list](/guides/guide-add-search-to-a-list.md) | a searchable entity, its migration, and a route giving the best matches first, a page at a time |
| [Keep a record of who changed what](/guides/guide-keep-a-record-of-who-changed-what.md) | an audited entity, its history read back with what each caller may see, and a route that sends it |
| [Export records to a file](/guides/guide-export-records-to-a-file.md) | a query's records written to a spreadsheet-safe CSV in the background, with its run tracked on a record |
| [Ask a model for a typed answer](/guides/guide-ask-a-model-for-a-typed-answer.md) | a checked prompt, a decoded answer with every failure named, a daily budget, and tests that never reach a model |

## Reaching outside

Other companies' APIs, in both directions.

| Guide | You end with |
|---|---|
| [Call an outside API](/guides/guide-call-an-outside-api.md) | a typed description of another service, called through a connection and faked in tests |
| [Receive a webhook](/guides/guide-receive-a-webhook.md) | a sender described as a package, its signed requests checked and de-duplicated, and a subscriber keeping each event |

## Shipping

Checking a change and putting it live.

| Guide | You end with |
|---|---|
| [Write tests](/guides/guide-write-tests.md) | action and route tests, fixtures, a fixed clock and tests signed in as someone |
| [Get a person's sign-off](/guides/guide-get-a-sign-off.md) | an acceptance for a change that could break someone, with a person's reason |
| [Deploy natively](/guides/guide-deploy-natively.md) | the app built into one program, running against a real database |
| [Deploy to Cloudflare Workers](/guides/guide-deploy-to-workers.md) | the app built as a Worker, reaching its database through Hyperdrive |
