Timbl
Schema-defined headless CMS on Bun — Zod-validated collections, draft/publish REST, plugins, and SQLite persistence without a hosted platform.
Overview
Most CMS options bundle hosting, heavy admin UIs, or runtime baggage. Timbl is a minimal self-hosted CMS: write a TypeScript content.config.ts, run Bun, and get a REST API with lifecycle hooks and optional Scalar/Swagger docs.
Capabilities
defineCMS,defineCollection, anddefineGlobalwith Zod-backed schema validation- REST CRUD with draft/publish workflow and relation/upload fields
- SQLite + Drizzle ORM; Docker deploy with mounted
db/anduploads/ - Lifecycle hooks:
beforeValidate,beforeSave,afterSave,afterPublish,afterDelete,afterRead - Plugin system:
registerRoute, extend collections/globals/routes/queries - Better Auth integration; Markdown field pipeline via unified/remark/rehype
export const CMSConfigSchema = z.object({
adapters: CMSAdaptersSchema.optional(),
apiDocs: z.optional(ApiDocsConfigSchema),
collections: z.array(CollectionDefinitionSchema).default([]),
globals: z.array(GlobalDefinitionSchema).default([]),
plugins: z.array(PluginDefinitionSchema).default([]),
}).strict();