# Caramel 0.16.0 > Caramel is a Crystal web framework with PostgreSQL, typed HTML, and a clear place for every change. These are the Markdown editions of the 0.16.0 guides, references and recipes; each page's HTML is the same URL without index.md. ## Learn - [The Bookshelf path](https://caramelize.dev/docs/0.16.0/getting-started/index.md): Install Caramel 0.16.0, create a bookshelf, and check the generated feature with real application tests. - [The Box Office path](https://caramelize.dev/docs/0.16.0/box-office/index.md): Build a box office in SweetTalk: seats held for ten minutes, sold once, and offered to a waitlist when a hold runs out, with specs that prove the refusal, the timer and the waitlist. ## Guides - [Project structure](https://caramelize.dev/docs/0.16.0/project-map/index.md): Start with your intention. Caramel’s conventions give it a home, and its tools help you check the result. - [Working with an agent](https://caramelize.dev/docs/0.16.0/agents/index.md): Give an agent the conventions, release context and proof commands you use, so it changes the right file and shows its work. - [Internationalization](https://caramelize.dev/docs/0.16.0/internationalization/index.md): Add typed translations, choose a language for each request, and localize numbers, dates, and validation messages in Caramel 0.15.0. - [Multi-tenancy](https://caramelize.dev/docs/0.16.0/multi-tenancy/index.md): Give each account its own /SLUG path and its own rows, with queries that refuse to run outside a tenant. - [Observability](https://caramelize.dev/docs/0.16.0/observability/index.md): Every request and job gets a stable id, one log line and, when something fails, a report that stays out of your logs. - [Testing HTML](https://caramelize.dev/docs/0.16.0/testing-html/index.md): Describe rendered elements with Blueprint-shaped expectations while Corretto drives real requests and isolated database state. - [Current release](https://caramelize.dev/docs/0.16.0/releases/index.md): What to do when you upgrade an application to Caramel 0.16.0, release by release since 0.8.0, and what the release supports and still lacks. - [Production](https://caramelize.dev/docs/0.16.0/deployment/index.md): Build the release artifact, set the variables a compiled application needs, and run its process roles under the contract any deploy tool can rely on. - [SweetTalk](https://caramelize.dev/docs/0.16.0/sweettalk/index.md): SweetTalk is an opt-in language for Domain-Driven Design. Its words expand into SugarORM schemas and changesets and Cold Brew jobs, so the domain keeps its own vocabulary and Caramel keeps one way to store and run it. - [Best practices](https://caramelize.dev/docs/0.16.0/best-practices/index.md): The ten rules a Caramel application keeps for its inputs, writes, HTML, jobs, tests and text, and the checks that hold it to them. ## Cookbook - [Create a resource](https://caramelize.dev/cookbook/0.16.0/create-a-resource/index.md): Proved by scripts/check frappe-project: Generate a book catalog, then make the model, actions, views, and request specs your own. - [Submit the form your view renders](https://caramelize.dev/cookbook/0.16.0/rendered-forms/index.md): Proved by scripts/check page-forms: Post exactly the fields a page renders, so a request spec fails when a view and its action’s contract disagree. - [Read and write JSON](https://caramelize.dev/cookbook/0.16.0/return-json/index.md): Proved by scripts/check page-json: Answer a generated Book resource’s actions as JSON, bind a JSON object to their contracts, and let an update check the version it was sent with If-Match. - [Upload and keep a file](https://caramelize.dev/cookbook/0.16.0/uploads/index.md): Recipe needs validation: Bind an upload to a typed contract field and read it for the length of one request. Keeping it after the request is not covered yet. - [Mount a third-party component](https://caramelize.dev/cookbook/0.16.0/third-party-components/index.md): Draft recipe: Wrap a headless JavaScript library in a Caramel island. The worked example is a11y-dialog 8.1.5 as a navigation dialog: vendor its file, mount it with props the server renders, clean up after it, survive history navigation and refresh a region beside it. - [Give a task its own time](https://caramelize.dev/cookbook/0.16.0/background-jobs/index.md): Proved by scripts/check page-jobs: Enqueue a typed job inside the transaction that needs it, drain it in a request spec, and run Cold Brew workers without a web server. - [Receive a signed webhook](https://caramelize.dev/cookbook/0.16.0/webhooks/index.md): Proved by scripts/check page-webhooks: Use action ingress for the exact signed bytes, a bounded body, and provider authentication before the contract binds. - [Sign users in with revocable sessions](https://caramelize.dev/cookbook/0.16.0/revocable-sessions/index.md): Proved by scripts/check page-sessions: The signed cookie carries a random token. PostgreSQL holds its digest, expiry and revocation, and every request rechecks them. ## Reference - [Routes and contracts](https://caramelize.dev/docs/0.16.0/routes-and-contracts/index.md): Map each method and path to one action, and declare the typed fields that action accepts. - [Actions and responses](https://caramelize.dev/docs/0.16.0/actions-and-responses/index.md): How an action turns a valid contract into a page, a fragment, a redirect, a stream or JSON in Caramel 0.15.0. - [Views](https://caramelize.dev/docs/0.16.0/views/index.md): A view is a Crystal class whose methods write HTML, and everything it writes is escaped unless you mark it as trusted. - [SugarORM](https://caramelize.dev/docs/0.16.0/sugarorm/index.md): Declare each table as a typed schema, query it with checked names, guard writes with changesets, and derive migrations from the declaration. - [Cold Brew](https://caramelize.dev/docs/0.16.0/cold-brew/index.md): Define typed jobs, run workers and schedules, publish notifications, and cache strings in your application’s PostgreSQL database. - [Corretto](https://caramelize.dev/docs/0.16.0/corretto/index.md): Corretto runs request specs in-process against a real PostgreSQL database, rolls back every example, and fakes third parties at the wire. - [Crema](https://caramelize.dev/docs/0.16.0/crema/index.md): Crema is Caramel’s observability: request ids, one log line for every request, job and schedule run, error reports, an owner-only ops socket, an opt-in recorder and exporter, and the development tools. - [Security defaults](https://caramelize.dev/docs/0.16.0/security/index.md): What Caramel checks on every request, and what your application must keep doing. - [Commands](https://caramelize.dev/docs/0.16.0/commands/index.md): Frappé, your application’s binary, and Latte, listed from the source of Caramel 0.15.0. - [Local environment](https://caramelize.dev/docs/0.16.0/local-environment/index.md): Latte runs PostgreSQL, DNS, and HTTPS on your Mac, and Frappé builds, serves, and checks each application at its own named origin.