Documentation
ohne is a zero-dependency TypeScript framework for the web. It gives you a database, an HTTP API, internationalization, and a dashboard, with no build step and no runtime dependencies. The framework ships .ts source, your app is .ts source, and Node 26 runs both directly. What you write is what runs.
Start here
New to ohne? Read these two in order:
The project
How a project is put together - the config file, the CLI, and the layer system that lets one project extend another.
Database
Declare your data as collections of fields. ohne keeps the schema in step with your code and gives you a typed query builder for reads and writes.
- Collections and fieldsThe built-in field types and their options.
- Custom field typesDefine a field type once, use it in any collection.
- Conditional fieldsFields that activate on a condition.
- BlocksOrdered lists of mixed, reusable shapes.
- TranslationsOne value per locale.
- Reading recordsThe fluent query builder: filter, sort, paginate, populate.
- Writing recordsCreate, update, and delete.
- Schema syncHow your collections become tables, safely.
- MigrationsIntentional data changes the sync guard would refuse.
- The databaseThe SQLite engine, connections, and raw SQL.
- Cluster locksRun work exactly once across instances.
Uploads
An optional layer for files: storage behind a pluggable backend, an `Uploads` collection, upload and serve routes, media fields, and the dashboard's Media page.
HTTP API
Define endpoints as files. Handlers read the request and return a value ohne serializes for you.
- RoutesThe file convention and `defineHandler`.
- Reading the requestParams, search params, body, cookies, negotiation.
- Shaping the responseStatus, headers, redirects, caching, files, events.
- HTTP errors`HTTPError` and the wire shape a client receives.
- MiddlewareCode that wraps every matching request.
- HooksReact to framework lifecycle events.
- Querying over HTTPTurn a URL query into a safe, filtered read.
- The collections APIREST endpoints a collection opts into.
Authentication
Email and password accounts, sessions, and the helpers to gate a route. Shipped by the ohne layer, so an app opts out by not stacking it.
Internationalization
Two independent systems: message catalogs for your UI strings, and content locales for your data (covered in [translations](./database/translations.md)).
Dashboard
A browser UI for your app, served by ohne with no build step. Pages are `.ts` modules that ship to the browser as type-stripped JavaScript.
- Dashboard pagesThe pages convention and how they are served.
- Rendering`h`, `mount`, `each`, `when`, and the router.
- Reactivity`ref`, `computed`, and `effect`.
- Data in the dashboardThe typed `api()` fetch helper and translations.
- Account settingsEach user's language, time zone, date and time formats, and smart clipboard.