18 modules, all included, all free
Core stays lean. You compose the rest.
Every capability that names a vendor, a business domain or a dependency ships as an opt-in NuGet package on the same IBarakoModule contract you can implement yourself. Reference the ones you want; AddBarakoCMS finds them in the dependency context.
ExternalAuth
Auth4.2.1External / social sign-in module for barakoCMS: "Continue with Facebook / Google / LinkedIn / GitHub" via OAuth, matched to a global user by verified email, issuing the same tenant-scoped, device-bound token as the built-in flows. Captures profile details (photo, birthday, location) per provider.
Email · Resend
Email4.0.0Resend email-provider module for barakoCMS: implements IEmailService via the Resend HTTP API, plus a delivery webhook that records bounces/complaints as EmailEvent documents.
Accounting
Domain4.0.0Optional double-entry accounting module for barakoCMS: accounts, balanced journal entries, and reporting.
Analytics · Umami
Analytics4.0.0Umami web-analytics module for barakoCMS: proxies a self-hosted Umami instance behind admin-only endpoints so the CMS admin can show visitors, top pages, referrers and countries, and register new tracked sites, without exposing an Umami API key to the browser.
Diagnostics
Ops4.1.1Client error logging for barakoCMS: apps POST captured browser errors (message, stack, page, user, club) to /api/client-errors; they're deduplicated by fingerprint with an occurrence count and browsable by Admin/SuperAdmin at GET /api/client-errors so you can retrieve and fix them later.
Import
Content4.1.1Optional bulk-import module for barakoCMS: analyze .xlsx/CSV uploads and bulk-create content. Zero-dependency parsing via Talaan.
Files
Storage4.2.1Optional file-attachment module for barakoCMS: upload and retrieve files (receipts, photos, documents) stored in Postgres via Marten.
DeviceTrust
Auth4.0.0Optional trusted-device module for barakoCMS: records the device behind each sign-in, binds sessions to devices, and can require OTP approval for new devices.
Portability
Ops4.2.1Content portability for barakoCMS: export content-type definitions and their content data as a JSON bundle, and import a bundle into another instance (upsert types by name, recreate content via events). For backup, migration, seeding, and sharing content-type templates.
Pwa
Analytics4.0.0PWA install tracking for barakoCMS: records when the app is added to the home screen / run as an installed app, anonymously or tied to the signed-in user, so the admin can see adoption and who installed it.
FeatureFlags
Ops4.0.0Lean feature-flag module for barakoCMS: create a flag, toggle it on/off, and target it ("true for this and that") by club, by user, or by percentage rollout. Global flags with per-tenant targeting, evaluated server-side and exposed at GET /api/feature-flags for the UI.
AI
Content4.1.1AI module for barakoCMS: semantic (vector) search over published content using a self-hosted embedding model (Ollama by default). Indexes only public fields, searches only published, document-Public entries, and needs no third-party API key.
Files · S3
Storage4.1.1S3-compatible object storage provider for the barakoCMS Files module. Works with AWS S3, Cloudflare R2, and self-hosted S3-compatible stores such as SeaweedFS. Public files get a direct, CDN-friendly URL; private files are proxied through the API.
Templates
4.2.1dotnet new templates for barakoCMS. barakocms-module produces a module with one capability-gated endpoint, one document type, configuration read from its own section, packaging metadata that inherits from a shared props file, and a test project on BarakoCMS.Testing.
Email · Smtp
Email4.0.0SMTP email-provider module for barakoCMS: implements IEmailService over any SMTP relay (a host's mail server, Google Workspace, Amazon SES, a corporate relay) using MailKit. Registers itself only when a host is configured.
Testing
4.0.0A test host for barakoCMS modules: a real barakoCMS over a Testcontainers PostgreSQL with the module under test registered, an HTTP client signed in as the seeded admin, and a tenant helper. Use it as an xunit class fixture.
Pages
4.2.0Page tree for barakoCMS: refuses a parent cycle, a page too deep or a reserved root slug on a configured content type, and serves the nested navigation, path resolution with breadcrumbs, and an authenticated tree with drafts for the console.
Forms
4.2.0Public forms for barakoCMS: a content type marked as a form accepts anonymous submissions at POST /api/public/forms/{slug}, validated against its own schema and stored as a Sensitive entry that delivery never serves, with a per-client rate limit, a honeypot and optional Cloudflare Turnstile.
The question every contribution runs into
Module, or core?
It is a module if any of these is true
Two sensible projects would disagree about wanting it
Core is what nobody gets a choice about
It names a vendor, a product or a business domain
Core’s vocabulary is content, users, tenants and permissions
It brings a dependency core does not already carry
Core’s dependency list is a promise to everyone who installs it
Removing it still leaves a working CMS
If content, auth, tenancy and delivery survive, it was never core
It is core if any of these is true
Something else cannot work without it
Content, content types, auth, tenancy, permissions
Core would need to know it exists
The moment core needs an if for your feature, it is not a module
It changes the shape of content, auth, tenancy or delivery
Those are contracts other people’s modules depend on
When it is genuinely borderline, build it as a module. Moving one into core later is additive; pulling a feature out of core breaks everyone who installed it.
Where core stands against its own rules
The rules were applied to core itself. One feature failed them and is already gone: Features/Club/ was product vocabulary rather than CMS vocabulary, and the Membership model it operated on stayed, because a feature failing the rules does not mean the model under it is wrong. The two below look like they fail the rules and are correctly core.
Features/Workflows/Looks like a module, is correctly core: it runs as a Marten projection, and IModuleSchema exposes only For<T>(). A limit of the contract, written down rather than implied.
Features/Audit/Looks optional, is correctly core: one read endpoint, but fifteen core files write audit entries. A module here would leave core writing records nothing could read.
Build your own the same way
A module is one contract and the hooks it needs
Contribute DI services, your own Marten documents, FastEndpoints endpoints and seed data. Core knows none of them by name. Discovery finds the assembly, so installing yours is a package reference and a restart.
Turning a module off leaves its data alone
GET /api/modules lists every module with enabled.
A name that matches nothing refuses to start
And lists the names it does know, rather than booting without it.