Rad - rethink your relationship with rows
rad<br>The relational database, redesigned. With one cohesive toolchain. True OLTP backed by durable object storage.<br>$curl -fsSL https://raw.githubusercontent.com/Southclaws/rad/main/install.sh | sh<br>COPY<br>Read the docs Star on GitHub
radnooo don't close me!<br>rad # radically simple!
serverun the database<br>validatecheck your schema<br>migratereconcile changes<br>generateemit typed clients
the loop<br>Everything starts with the schema.<br>Rad's declarative schema is the source of truth for your database, migrations and type-safe clients. Change it, and everything else follows.
01<br>define<br>schema.rad<br>Describe your data model.
02<br>migrate<br>automatic<br>The database itself handles it.
03<br>generate<br>rad generate<br>Generate type-safe clients.
04<br>build<br>your application<br>Write business logic, not database glue.
05<br>deploy<br>object store native<br>Backed by durable object storage.
06<br>repeat<br>stay in flow<br>Keep your momentum focused.
show, don't tell<br>Here's the whole thing.<br>You author a single declarative schema. Rad generates the exact clients for your database. No ORMs. No query builders. No string-gluing.
schema.radclient.goclient.ts<br>tables:<br>- name: boards<br>columns:<br>- { name: id, type: string, pk: true, default: uuid() }<br>- { name: team_id, type: string, ref: teams.id }<br>- { name: name, type: string }
- name: tasks<br>columns:<br>- { name: id, type: string, pk: true, default: uuid() }<br>- { name: board_id, type: string, ref: boards.id, index: true }<br>- { name: title, type: string }<br>- { name: status, type: string, default: todo }<br>- { name: priority, type: int64, default: 2 }<br>- { name: assignee_id, type: string, ref: users.id, nullable: true }<br>- { name: estimate, type: float64, nullable: true }<br>indexes:<br>- { columns: [board_id, status] }
what you get<br>Radically rethink your relationship with rows.<br>The whole stack, from code to columns. Built for today, not 1973.
clientsNo need for an ORM<br>Generated directly from your schema. Typed queries, typed rows and typed relationships. More than just a layer on top, Rad defines and enforces a contract between your data and your code.<br>db.Tasks.Query().StatusEq ("todo").OrderByPriority ().All(ctx)<br>readsJoins that make sense<br>Read data the way your application uses it. Parents, children and nested relationships without rebuilding from flattened results.
migrationsMigrations from a schema diff<br>Change the schema. Rad computes and runs the migration. Rename hints keep intent without unnecessary rewrites.<br>rad migrate --url rad://localhost<br>one binaryServer, devtool & codegen, all in one<br>Database, toolchain and code generation in a single executable. Runs anywhere you need it to.
storageDurable, stateless storage<br>Built for object storage from day one. Stateless compute, durable data.
interfaceStrings are not an API<br>Rad's lower level intermediary format is structured so you can build queries without gluing strings.<br>"SELECT * FROM users " + whereClause + " ORDER BY " + ... 🙅<br>protocolThe rad:// protocol<br>A simple JSON-over-HTTP protocol. Designed for generated clients, not hand-written requests.
one → many
Grab the binary for Windows, macOS or Linux. This includes the database server itself and the CLI developer tools.<br>$curl -fsSL https://raw.githubusercontent.com/Southclaws/rad/main/install.sh | sh<br>COPY<br>Documentation Source code