A self-hosted worldbuilding platform for tabletop RPG campaigns.
Chronicle gives game masters and players a shared space to build worlds, track lore, manage calendars, visualize timelines, and run campaigns — all on your own server, with no paywall, no forced public content, and full control over your data.
Screenshots coming soon — Chronicle features a rich entity editor, interactive calendar, D3.js timeline, Leaflet.js map viewer, drag-and-drop page layouts, and customizable dashboards.
Chronicle is purpose-built for tabletop RPGs, open source, and designed to be self-hosted from day one. No paywalls, no forced public content, no vendor lock-in — your world, your server, your data.
- Pages & Categories — Create any content type (characters, locations, factions, items, etc.) with custom categories and dynamic field schemas
- Rich Text Editor — TipTap-powered WYSIWYG with @mentions, backlinks, GM secrets, and an insert menu
- Relations — Bi-directional entity relationships with typed connections ("is spouse of", "leads", "enemy of")
- Entity Hierarchy — Parent/child nesting with tree views and breadcrumb navigation
- Tags — Color-coded tags with DM-only visibility controls
- Custom Attributes — Per-category field templates (text, number, select, checkbox, URL) with per-entity overrides
- Drag-and-Drop Page Layouts — Visual layout editor for entity profile pages — no other tool has this
- Custom Calendars — Define months, weekdays, moons, seasons, eras, and leap year rules for any fantasy calendar system
- Real-Life Sync — Optional Gregorian calendar mode synced to real-world dates
- Events — Single-day, multi-day, and recurring events with visibility controls, entity linking, and category icons
- Import/Export — Import from Simple Calendar, Calendaria, Fantasy-Calendar, or Chronicle JSON
- Interactive D3 Visualization — SVG-rendered timeline with zoom, pan, and minimap
- Eras — Named time periods with colored bars spanning year ranges
- Standalone Events — Calendar-free events for campaigns without formal calendars
- Event Clustering — Overlapping events automatically group for readability
- Leaflet.js Maps — Upload custom map images and place interactive markers
- Entity-Linked Markers — Pin entities to map locations with click-through navigation
- DM-Only Markers — Hide map pins from players
- Session Scheduling — Plan game nights with date, location, and status tracking
- RSVP — Going / Maybe / Can't buttons with attendee tracking
- Entity Linking — Tag which pages were relevant to each session
- Roles — Owner (GM), Scribe (co-GM), and Player roles with granular permissions
- Customizable Dashboards — Drag-and-drop dashboard blocks (recent pages, calendar preview, timeline, maps, stats)
- Customizable Sidebar — Reorder, rename, and add custom navigation links
- Category Dashboards — Per-category landing pages with their own layouts
- Public Campaigns — Optionally make campaigns publicly viewable
- "View as Player" — Toggle to see your campaign as players see it
- Per-Entity Notes — Private notes attached to any page
- Shared Notes — Share notes with the campaign (with edit locking)
- Version History — View and restore previous note versions
- Checklists — Quick checklist blocks within notes
- API v1 — Full CRUD for entities, entity types, tags, relations, calendar, events, maps, drawings, tokens, layers, fog, media, and notes
- API Key Auth — Per-campaign API keys with read/write/sync permissions and device fingerprint binding
- Addon Discovery — External tools can detect which features are enabled per campaign
- Bulk Operations — Bulk tag assignment and entity type reassignment (up to 200 per request)
- Sync Protocol — Sync mappings, WebSocket real-time events, and bidirectional Foundry VTT integration
- Startup Health Checks — Automatic migration validation, schema verification, DB connectivity checks, and security audit on every server start
- Pre-Migration Backups — Optional mysqldump with gzip before schema changes, with automatic rotation
- User Management — Admin dashboard for users, campaigns, storage, and security
- Audit Logging — Full activity trail for all campaign mutations
- Rate Limiting — Per-route rate limits on auth and upload endpoints
- Session Security — Redis-backed sessions with force-logout and session termination
- Database TLS — Configurable TLS encryption for database connections (
DB_TLS_MODE) - IDOR Protection — Campaign-scoped access checks on every route
- Argon2id — Password hashing with modern algorithm
- Worldbuilding with custom entity types and rich text editor
- Interactive calendar with events, seasons, moons, and eras
- Map viewer with markers, drawings, and fog of war
- Timeline visualization
- Session planning with RSVP tracking
- Bestiary with community sharing and ratings
- Full REST API for integrations
Screenshots coming soon — see the feature list above for what Chronicle offers today.
# Clone the repository
git clone https://github.com/chronicle-app/chronicle.git
cd chronicle
# Set required secrets
export SECRET_KEY=$(openssl rand -base64 32)
export DB_PASSWORD=your-secure-password
export MYSQL_ROOT_PASSWORD=your-root-password
# Start the full stack
docker compose up -d
# Chronicle is now running at http://localhost:8080
# The first user to register becomes the site admin.Prerequisites: Go 1.24+, Node.js (for Tailwind), MariaDB 10.11+, Redis 7+
# Clone and setup
git clone https://github.com/chronicle-app/chronicle.git
cd chronicle
cp .env.example .env # Edit with your database credentials
# Start dependencies
make docker-up # MariaDB + Redis via Docker
# Generate templates and CSS
make generate # Runs templ generate + tailwindcss
# Run the server
make dev # Hot reload with air
# or
make run # Direct runDatabase migrations run automatically on startup. The first user to register becomes the site admin.
make help # Show all available commands
make dev # Start dev server with hot reload (air)
make build # Production binary build
make test # Run all tests
make test-unit # Unit tests only
make lint # Run golangci-lint
make generate # Regenerate Templ + Tailwind
make docker-up # Start MariaDB + Redis
make docker-down # Stop containerscmd/server/ # Application entrypoint
internal/
plugins/ # Feature apps (auth, campaigns, entities, calendar, ...)
modules/ # Game system content packs (dnd5e)
widgets/ # Reusable UI components (editor, tags, relations, notes, ...)
templates/ # Templ layouts and shared components
middleware/ # HTTP middleware (auth, CSRF, logging, recovery)
apperror/ # Domain error types
config/ # Environment configuration
database/ # Database connection and helpers
static/
js/ # Client-side JavaScript (boot.js, widgets, search, shortcuts)
css/ # Tailwind input + compiled output
img/ # Static assets
db/migrations/ # Sequential SQL migration files
Chronicle uses a three-tier extension architecture:
| Tier | Purpose | Example |
|---|---|---|
| Plugin | Feature app with handler/service/repo/templates | auth, campaigns, entities, calendar, maps |
| Module | Game system content pack (read-only reference data) | dnd5e, pathfinder |
| Widget | Reusable UI component (self-contained JS + API) | editor, tags, relations, notes |
Request flow: Router → Middleware → Handler → Service → Repository → MariaDB
See .ai/architecture.md for the full architecture document.
| Layer | Technology |
|---|---|
| Backend | Go 1.24, Echo v4 |
| Templates | Templ (type-safe Go templates) |
| Frontend | HTMX, Alpine.js |
| Editor | TipTap (ProseMirror-based) |
| CSS | Tailwind CSS |
| Timeline | D3.js |
| Maps | Leaflet.js |
| Database | MariaDB 10.11 |
| Cache/Sessions | Redis 7 |
| Deployment | Docker, multi-stage builds |
Chronicle was developed with reference to several existing worldbuilding and note-taking platforms in the TTRPG space. We're grateful to the broader community for establishing patterns and conventions that inform what users expect from tools like these.
Notable platforms we studied during development include World Anvil, Kanka, LegendKeeper, and Obsidian. All design and code in Chronicle is original work.
Chronicle is in active early development (pre-alpha). Contribution guidelines will be established as the project matures. In the meantime, feel free to open issues for bug reports or feature suggestions.
This project is licensed under the GNU Affero General Public License v3.0.