A headless CMS suite for .NET 8: an event-sourced engine, opt-in modules, an admin UI, and a PWA kit.
BarakoCMS is a headless, API-first CMS built on FastEndpoints and Marten (event sourcing over PostgreSQL). The core stays small and generic; everything else — accounting, analytics, email, file storage, auth providers — ships as opt-in modules you compose per project. It comes with a Next.js admin UI that surfaces your content and every installed module, and it's multi-tenant out of the box.
The name Barako comes from kapeng barako, a bold Philippine coffee varietal — hence the coffee-bean mark. The full-module image is "Barako"; the lean core is "Decaf".
Note
BarakoCMS is a passion project built for learning and portfolio purposes. It's usable and maintained, but breaking changes can happen between versions. See CHANGELOG.md.
- Quick start · Live demo · The admin · Modules
- Frontend kit · Architecture · Sample app
- Docs · Support · License
The fastest path is the quickstart bundle — the full suite (core + every module),
the admin UI, and PostgreSQL, from prebuilt images, driven by one documented .env. No build, no
clone.
curl -O https://raw.githubusercontent.com/BaryoDev/barakoCMS/master/quickstart/docker-compose.yml
curl -O https://raw.githubusercontent.com/BaryoDev/barakoCMS/master/quickstart/.env.example
cp .env.example .env # then set DB_PASSWORD, JWT_KEY (32+ chars), ADMIN_PASSWORD
docker compose up -d- Admin UI → http://localhost:3000 · API → http://localhost:5005 · health at
/health - Every module ships in the image and stays off/mock until you add its keys, so you grow into Umami analytics, Resend email, social sign-in, and the rest without touching the compose.
See quickstart/README.md for every variable, enabling modules, and going behind a domain with TLS. To build from source instead, see the getting-started guide.
https://playground.baryo.dev/barakocms — sign in as demo_admin / BarakoDemo2026!. The API
is at https://playground.baryo.dev/barakocms-api (health).
A Next.js admin for modeling content, managing access, and running the system. Installed modules appear automatically as their own sections — the admin is a window into your whole deployment.
- Content — define content types with typed fields (including per-field sensitivity/masking), write and version entries, and automate with workflows.
- Access — users, roles, and groups with fine-grained RBAC.
- Multi-tenancy — auto-scopes to your tenant on sign-in, with a switcher to move between the tenants you belong to; all data reloads under the one you pick.
- Module sections — Accounting, Analytics, Email events, Feature flags, PWA installs, and more, each shown only when its module is installed.
![]() |
![]() |
![]() |
![]() |
Core stays lean and generic. Capabilities ship as optional NuGet modules you opt into per
project — the same IBarakoModule contract you can implement yourself.
| Module | Package | What it adds |
|---|---|---|
| Accounting | BarakoCMS.Accounting |
A double-entry ledger — chart of accounts, balanced journal entries, balances, and per-account ledgers. |
| Import | BarakoCMS.Import |
Bulk import .xlsx/CSV into content via Talaan, through the CMS's own validation, permissions, and event sourcing. |
| Files | BarakoCMS.Files |
File upload/download stored in Postgres via Marten — receipts, photos, documents. |
| Email.Resend | BarakoCMS.Email.Resend |
An IEmailService over the Resend API, plus a delivery webhook and an email-events feed (bounces/complaints). |
| DeviceTrust | BarakoCMS.DeviceTrust |
Remembers trusted devices; step-up OTP when a new one signs in. |
| ExternalAuth | BarakoCMS.ExternalAuth |
"Continue with Google / GitHub / Facebook / LinkedIn" via OAuth, behind one master switch. |
| FeatureFlags | BarakoCMS.FeatureFlags |
Create, toggle, and target flags by tenant, user, or percentage — viewable/toggleable in the admin. |
| Portability | BarakoCMS.Portability |
Export/import content-type definitions and data as a JSON bundle, for backup, migration, and seeding. |
| Diagnostics | BarakoCMS.Diagnostics |
Captures client-side (browser) errors and shows a deduped, resolvable error log in the admin. |
| Analytics.Umami | BarakoCMS.Analytics.Umami |
A server-side proxy over self-hosted Umami: visitors, pages, referrers, countries, devices — plus registering sites and verifying install. |
| Pwa | BarakoCMS.Pwa |
Tracks PWA installs / installed-app launches (anonymous or tied to the signed-in user) so the admin shows who installed the app. |
| AI | BarakoCMS.AI |
Semantic search over published content using a self-hosted embedding model (Ollama by default) — no third-party API key. Indexes only public fields; results are re-checked as published + public at query time. |
Enable the ones you want when you register the CMS:
builder.Services.AddBarakoCMS(builder.Configuration, modules =>
{
modules.Add(new BarakoCMS.Accounting.AccountingModule());
modules.Add(new BarakoCMS.Email.Resend.ResendEmailModule());
modules.Add(new BarakoCMS.Analytics.Umami.UmamiAnalyticsModule());
modules.Add(new BarakoCMS.Pwa.PwaModule());
modules.Add(new BarakoCMS.AI.AiModule()); // semantic search (Ollama)
// …add only what you need
});
await app.RunBarakoModuleSeedersAsync(); // module baseline data (roles, reference data)A module contributes DI services, its own Marten documents, FastEndpoints endpoints, and seed data,
implementing only the hooks it needs. See each module's page in the docs.
Want every module in one image? Use ghcr.io/baryodev/barako-cms (Barako, full suite); for the
lean core, ghcr.io/baryodev/barako-cms-decaf (Decaf) and add your own.
BarakoCMS is headless — you build the frontend. These BaryoDev packages help:
- @baryodev/pwa-kit — service-worker registration + versioned
caching, install hints, standalone viewport handling, and a PWA-install reporter that pairs with the
Pwamodule (reportPwaStatus). - @baryodev/read-aloud — "listen to this" using Microsoft Edge's free neural voices: a Node TTS endpoint plus a framework-free browser reader with word highlighting. Drop it into any frontend for accessible, read-aloud content.
- Talaan — a zero-dependency
.xlsx/CSV reader used by the Import module.
- Event-sourced — content changes are events in Marten; you get full version history, rollback, and async projections for free.
- Modular — core knows nothing about any module; the
IBarakoModulecontract wires services, documents, endpoints, and seeders. Build your own the same way. - Multi-tenant — conjoined tenancy: one deployment, many tenants; data scoped by tenant, with global users/roles and per-tenant memberships.
- RBAC — roles, groups, and per-content-type permissions, with field-level sensitivity/masking.
- MFA — optional TOTP second factor (authenticator app) with one-time recovery codes; enforced on every sign-in path (password, email code, social), with encrypted secrets and replay protection.
- Public delivery — anonymous, cacheable, published-only reads for any content type, with
keyword search (
/api/public/{type}/search), an RSS feed (/api/public/{type}/feed.xml), and, via the AI module, semantic search (/api/public/{type}/semantic). It emits only allowlisted public fields — fail-closed by design. - Scheduled publishing — arm any item with a publish and/or unpublish time; a background sweep promotes and retires content on schedule, per tenant, emitting real events so workflows fire.
- FastEndpoints + Kestrel — minimal-overhead HTTP; health checks and Prometheus metrics built in.
Deep dives live in the docs: event sourcing, concurrency, content modeling, extending BarakoCMS, and deployment.
BaryoClub composes the suite into a club membership and treasury manager — members, a double-entry ledger, statements, OTP sign-in, and a full PWA. It's the reference for building a real product on BarakoCMS.
Full docs: https://baryo.dev/docs — getting started, guides, module references, API reference, and architecture. Changelog: CHANGELOG.md.
How this project is built and shipped: AI Development Lifecycle — the breakable-staging discipline, version-gated releases, and how tests gate every promotion.
BarakoCMS is free and open-source under MPL-2.0. If it's useful to you:
- ⭐ Star the repo so others find it
- ☕ Ko-fi (one-time) or GitHub Sponsors (monthly)
- 🐛 Contribute — issues, PRs, docs
- 📧 Commercial/enterprise support: arnelirobles@gmail.com
MPL-2.0 — the core and every module, so there is one licence across the suite.
MPL is file-level copyleft: use it in commercial and closed-source products freely, and if you modify a barakoCMS source file, share that file's changes. Your own code stays yours.
Packages up to BarakoCMS 3.1.1 were released under Apache-2.0 and remain so; 3.2.0 onward is MPL-2.0.
Author: Arnel Robles · @arnelirobles · arnelirobles@gmail.com




