Live Content System
Versioned content delivery platform for PsycatGames mobile apps – Truth or Dare, Would You Rather, Never Have I Ever, and others. The system manages the full lifecycle from authoring statements to delivering them as encrypted, versioned payloads to mobile clients.
How content flows
Author statements → Organize into categories → Create snapshot → Map to app version → App fetches via API
- Statements are created (manually or via CSV import) following a schema that defines their text structure
- Categories use filter rules to dynamically group statements – no manual assignment
- Snapshots freeze the current state of all categories and their resolved statements into an immutable payload
- Version mappings tie a published snapshot to a specific app version (semver)
- Mobile apps call the client API with their bundle ID and version. The API resolves the correct snapshot, filters by platform and locale, encrypts the response, and returns it
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Admin UI (content-tool.vanilla.nl) │
│ Hugo + Tailwind + Vanilla JS │
└──────────────────────┬──────────────────────────────────────┘
│ REST API
┌──────────────────────▼──────────────────────────────────────┐
│ Admin Backend (content-backend.vanilla.nl) │
│ Express 5 + TypeScript │
│ Content CRUD, snapshots, imports, translations, auth │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────▼──────────────┐
│ PostgreSQL 16 + pgvector │
│ Redis 7 (cache + nonces) │
└──────────────┬──────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ Client API (content-api.vanilla.nl) │
│ Express 5 + TypeScript │
│ HMAC auth, AES-256-GCM encryption, version resolution │
└──────────────────────┬──────────────────────────────────────┘
│ Encrypted responses
┌────────▼────────┐
│ Mobile Apps │
│ iOS / Android │
└─────────────────┘
Services
| Service | URL | Purpose |
|---|
| Admin UI | content-tool.vanilla.nl | Browser-based content management |
| Admin Backend | content-backend.vanilla.nl | REST API for the admin UI (Google OAuth) |
| Client API | content-api.vanilla.nl | Content delivery to mobile apps (HMAC + encryption) |
Roles
Every user is assigned one or more roles that control what they can see and do:
| Role | Content | Snapshots | Schemas | Imports | Users | Logs |
|---|
| ADMIN | Full | Full | Full | Full | Full | Full |
| DEV | Full | Full | Full | Full | – | – |
| CONTENT | Full | Full | – | – | – | – |
| DESIGN | Read + Edit | – | – | – | – | – |
What’s in this documentation
Creating and editing statements, organizing content with categories, running AI translations, and collaborating through Google Sheets.
Client API reference (HMAC auth, encryption, endpoints), schema types, snapshot publishing, version mapping, and release workflow.
User and role management, system logs, and monitoring.
If you’re new, start with the Getting Started guide.