Substrukt substrukt

Schema-driven CMS
built in Rust

Define content types with JSON Schema. Edit through a web UI. Store as files. Serve via API.

Features

Schema-driven forms

Define content types with JSON Schema. The UI generates forms automatically from your schema, including nested objects, arrays, and file uploads.

File-based content

Content is stored as JSON files on disk, not in a database. Easy to inspect, version control, and migrate. In-memory caching keeps reads fast.

REST API

Every content type gets full CRUD endpoints. Bearer token auth. Export and import bundles for syncing between environments.

Content-addressed uploads

Files are stored by SHA-256 hash with automatic deduplication. Upload the same file twice, it is stored once.

Single binary

One Rust binary, no runtime dependencies. SQLite for auth. Templates and static assets are served directly. Docker image included.

Observability

Prometheus metrics endpoint, structured logging with tracing, and a separate audit log database tracking all mutations.

How it works

1

Define a schema

Create a JSON Schema with an x-substrukt extension that sets the title, slug, and storage mode.

2

Edit content

The web UI generates a form from your schema. Create, edit, and delete entries through the browser.

3

Consume via API

Content is served as JSON through the REST API. Use bearer tokens for authentication.

4

Sync and deploy

Export/import bundles to move content between local and production. Automate with CI.

Quick start

# Build from source
git clone https://github.com/wavefunk/substrukt.git
cd substrukt
cargo build --release
./target/release/substrukt serve

# Or run with Docker
docker build -t substrukt .
docker run -p 3000:3000 -v substrukt-data:/data substrukt