content.voila.dev
v0.1 — now open source

Content infrastructure, defined in TypeScript.

A config-driven, type-safe content framework. Model your collections once and get a typed client, a REST API, and an admin UI — deployed to the edge.

Powered by
Workers D1 R2 TanStack Resend Better Auth
content.config.ts
import { defineContent, collection, fields } from "@voila/content";

export default defineContent({
  collections: {
    posts: collection({
      fields: {
        title:  fields.text({ required: true }),
        slug:   fields.slug({ from: "title" }),
        body:   fields.richText(),
        status: fields.select(["draft", "published"]),
      },
    }),
  },
});
The stack

Built on the modern edge

No proprietary backend. content.voila.dev runs on open, edge-native infrastructure you already trust.

Cloudflare Workers

Your entire app runs as a single Worker, deployed to Cloudflare's global edge.

Cloudflare D1

SQLite at the edge — your content database, replicated close to your users.

Cloudflare R2

Zero-egress object storage for media, uploads, and generated assets.

TanStack Start

Type-safe routing and data loading power the config-driven admin UI.

Better Auth

Sessions, magic links, and RBAC — secure auth wired in by default.

Resend

Transactional email for magic-link auth and content notifications.

Features

Everything you need to model content

One config drives the database, API, client, and admin. Add capabilities by flipping a flag.

Type-safe schema

Define collections and fields in TypeScript. Your content shape is inferred everywhere — no codegen step.

Typed client, zero codegen

A fully typed data client derived from your config. Autocomplete every collection, field, and query.

Built-in admin UI

A config-driven admin to author content, with forms, tables, and validation generated from your schema.

Edge-native

Runs on Cloudflare Workers with D1 and R2. Low-latency reads from anywhere, no servers to manage.

Drafts, revisions & i18n

Versioned content, draft/publish workflows, and per-locale fields are first-class, not bolted on.

Auth & RBAC included

Magic-link auth, sessions, CSRF, and per-field access control wired in by default.

Why content.voila.dev

A framework, not a vendor

Own your data and your runtime. Config-driven, fully typed, and yours to deploy.

Config-driven, no eject

Your content.config.tsis the source of truth. The database schema, REST routes, typed client, and admin screens are all derived from it.

DraftsRevisionsi18nMediaFull-text searchWebhooks

Edge-native by default

Cloudflare Workers, D1, and R2 — one worker, one database, one domain per site.

Typed end to end

From schema to client, types flow without a build step. Refactor with confidence.

Batteries included, swappable

Auth, RBAC, media storage, and search ship in the box — each behind a seam you can replace. Sensible defaults, no lock-in.

Auth
Storage
Search
Admin
Loved by builders

Teams ship faster with less glue

“We replaced a headless CMS and three glue services with one config file. The typed client alone paid for the migration.”
Dana Whitmore
Staff Engineer, Northwind
“Shipping content to the edge used to be a project. With content.voila.dev it's a deploy. Drafts and revisions just work.”
Marco Silva
Founder, Globex
“The admin UI is generated from our schema, so it never drifts. Our editors got a polished tool for free.”
Priya Nair
Product Lead, Initech
Open source

Free and open source, forever

No plans, no seats, no lock-in. content.voila.dev is MIT licensed — self-host it on your own edge, fork it, and make it yours.

$0/ forever

MIT licensed · self-hosted on Cloudflare Workers


  • All collections & fields
  • Typed client & REST API
  • Built-in admin UI
  • Auth, RBAC & CSRF
  • Media, search & i18n
  • Drafts & revisions
FAQ

Frequently asked questions

Is content.voila.dev a CMS or a framework?

A framework. You define content in TypeScript and own the runtime, database, and admin. There's no hosted black box — everything is derived from your config and runs in your infrastructure.

Where does my content live?

In your own database. The default runtime targets Cloudflare D1 with R2 for media, but the storage and database layers are seams you can swap.

Do I need a codegen step?

No. Types are inferred directly from your config, so the typed client and admin stay in sync without a generate command.

Can I customize the admin UI?

Yes. The admin is config-driven with an extension API for custom screens and fields, while sensible defaults are generated from your schema.

What about auth and permissions?

Magic-link auth, sessions, CSRF protection, and per-field role-based access control are built in and enabled by default.

Ship content infrastructure this afternoon

Scaffold a fully typed, edge-ready content backend with a single command.

$bun create content-voila