An open-source, block-based headless CMS built with Nuxt
Zeitword is a modern headless CMS that empowers developers to build content-rich applications while providing an intuitive interface for content creators. It combines the flexibility of a headless architecture with the simplicity of block-based editing.
- π¨ Block-Based Editing - Intuitive content creation with modular blocks
- π§ API-First - Build with your preferred stack using our simple API
- π User-Friendly - Let content creators work without understanding technical details
- π Developer-Focused - Easy to integrate, customize, and extend
- π» Open Source - Transparent, community-driven development
- β‘ Performance - Built with modern technologies for speed
Zeitword is built with modern and reliable technologies:
- Frontend: Nuxt.js, Vue, TypeScript
- Backend: Nitro
- Database: PostgreSQL
- ORM: Drizzle
- Storage: MinIO/S3-compatible
- Development: Node.js and npm, managed with mise
- mise (activate it in your shell)
- Docker
- Docker Compose
-
Clone and Install
# Clone the repository git clone https://github.com/yourusername/zeitword.git cd zeitword # Trust and install Node.js 26.12.1 mise trust mise install # Install dependencies mise exec -- npm ci
-
Start the Infrastructure
docker compose up -d
This will start:
- PostgreSQL database on port 5432
- MinIO S3-compatible storage on port 9000
- MinIO Console on port 9001
-
Configure Environment
cp .env.example .env
The example configuration includes default values for local development with PostgreSQL and MinIO.
-
Run Migrations
mise exec -- npm run db:migrate -
Start Development Server
mise exec -- npm run dev
- Host:
localhost:5432 - User:
postgres - Password:
postgres
- API Endpoint:
http://localhost:9000 - Console UI:
http://localhost:9001 - Access Key:
admin - Secret Key:
password - Default Bucket:
zeitword
You can access the MinIO Console at http://localhost:9001 to manage your storage directly.
Zeitword uses Drizzle ORM for database operations. Here are common commands:
# Generate migrations after schema changes
mise exec -- npm run db:generate
# Apply migrations to the database
mise exec -- npm run db:migrateFor local development, the .env.example comes pre-configured for the included Docker services. For production, you'll need to update these values according to your deployment environment.
-
Database Configuration
NUXT_DSN="postgresql://postgres:postgres@localhost:5432/postgres?sslmode=disable" NUXT_AUTH_SECRET="your-random-auth-secret-at-least-32-characters" NUXT_PUBLIC_APP_URL="http://localhost:3000"
NUXT_DSN: PostgreSQL connection stringNUXT_AUTH_SECRET: Random Better Auth signing secret, at least 32 charactersNUXT_PUBLIC_APP_URL: Canonical app origin (the public HTTPS origin in production), used for auth cookies, origin validation and recovery linksNUXT_AUTH_TRUSTED_PROXY_IPS: Optional comma-separated socket IPs of reverse proxies that overwriteX-Forwarded-For, used for auth rate limiting
Existing installations must follow the Better Auth migration rollout.
-
S3 Storage Configuration
# Default values for local MinIO setup NUXT_S3_ACCESS_KEY_ID="admin" NUXT_S3_SECRET_ACCESS_KEY="password" NUXT_S3_ENDPOINT="http://localhost:9000" NUXT_S3_BUCKET="zeitword" NUXT_S3_REGION="us-east-1"
- For local development, these values work with the included MinIO service
- For production, replace with your preferred S3-compatible service credentials
-
Waitlist Configuration
NUXT_RESEND="your-resend-api-key" NUXT_PUBLIC_SITE_URL="https://your-site-url.com"
NUXT_RESEND: API key for email serviceNUXT_PUBLIC_SITE_URL: Your site's public URL
-
Create your
.envfile:cp .env.example .env
-
Generate a secure session password:
openssl rand -base64 32
-
For production S3 storage:
- Create an S3 bucket or use an S3-compatible service
- Configure CORS settings for your bucket
- Add your credentials to the
.envfile
-
Configure email service:
- Sign up for Resend
- Add your API key to the
.envfile
Note
Never commit your .env file to version control. It's included in .gitignore by default.
We welcome contributions! Please feel free to:
- Submit bug reports
- Propose new features
- Create pull requests
- Improve documentation
Check our Contributing Guidelines for more details.