BarakoCMS 2.2.0

There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package BarakoCMS --version 2.2.0
                    
NuGet\Install-Package BarakoCMS -Version 2.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BarakoCMS" Version="2.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="BarakoCMS" Version="2.2.0" />
                    
Directory.Packages.props
<PackageReference Include="BarakoCMS" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add BarakoCMS --version 2.2.0
                    
#r "nuget: BarakoCMS, 2.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package BarakoCMS@2.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=BarakoCMS&version=2.2.0
                    
Install as a Cake Addin
#tool nuget:?package=BarakoCMS&version=2.2.0
                    
Install as a Cake Tool

BarakoCMS

The AI-Native, High-Performance Headless CMS for .NET 8.

NuGet Documentation

License

<a href='https://ko-fi.com/T6T01CQT4R' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi3.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>

Hobby Project Disclaimer BarakoCMS is a passion project built for educational and portfolio purposes. While we strive for backward compatibility, breaking changes may occur as we introduce new features or refine the architecture. Use in production with this understanding.

๐Ÿ“š Full Documentation: https://baryo.dev/barakoCMS

Please visit our documentation site for Getting Started guides, API Reference, and Architecture Deep Dives.

BarakoCMS is engineered for Speed, Extensibility, and Robustness. Built on the bleeding edge with FastEndpoints and MartenDB, it delivers a developer-first experience that is both human-friendly and agent-ready.


๐Ÿ“ฆ Quick Start

Prerequisites

1. Clone & Setup

git clone https://github.com/yourusername/barakoCMS.git
cd barakoCMS
docker compose up -d  # Start PostgreSQL

2. Configure

Update barakoCMS/appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=barako_cms;Username=postgres;Password=postgres"
  },
  "JWT": {
    "Key": "your-super-secret-key-that-is-at-least-32-chars-long"
  }
}

3. Run

dotnet run --project barakoCMS

Open Swagger UI: http://localhost:5000/swagger


๐Ÿ–ฅ๏ธ Admin UI (New!)

BarakoCMS includes a full-featured Admin Dashboard built with Next.js 16.

Features

  • Dashboard: Health status, quick stats
  • Content Management: Create, Edit, List, Search, Filter
  • Schema Management: Define and view Content Types
  • Workflows: Create and manage automation rules
  • Roles & UserGroups: RBAC administration
  • Settings Management: Runtime configuration toggles (Kubernetes, HealthChecks UI, Logging)
  • Monitoring: System metrics, Kubernetes cluster status (when enabled)
  • Ops: Health Checks, Logs, Backups (Create, Download, Restore, Delete)

Running the Admin UI

cd admin
npm install
npm run dev

Open Admin Dashboard: http://localhost:3000

Default Login: arnex / password123 (or see seeded data)


๐Ÿš€ What's New in v2.2 (Security & Performance)

Enterprise-Ready: Authentication hardening + Performance optimizations

๐Ÿ” Authentication Hardening (v2.2)

Security Improvements:

  • Short-Lived Tokens: JWT access tokens now expire in 15 minutes (was 24 hours)
  • Refresh Token Rotation: New refresh token issued on each use, old tokens revoked
  • Token Revocation: Logout invalidates tokens immediately via blacklist
  • Rate Limiting: 5 login attempts per 15 minutes, 5 registrations per hour
  • Account Lockout: Automatic 15-minute lockout after 5 failed login attempts
  • Strong Password Policy: Minimum 12 characters with uppercase, lowercase, number, and special character

New Endpoints:

POST /api/auth/refresh          # Exchange refresh token for new access token
POST /api/auth/logout           # Revoke current tokens

โšก Performance Optimizations (v2.2)

  • Paginated Responses: All list endpoints now return paginated results (max 100 items)
  • Permission Caching: 5-minute cache for permission checks
  • Batch Role Loading: Eliminated N+1 queries in permission resolver
  • Database Indexes: Optimized queries for Content, Users, Roles
  • Response Times: All API endpoints respond in <200ms

Pagination Example:

GET /api/contents?page=1&pageSize=20

# Response
{
  "items": [...],
  "page": 1,
  "pageSize": 20,
  "totalItems": 150,
  "totalPages": 8,
  "hasNextPage": true,
  "hasPreviousPage": false
}

๐Ÿ›ก๏ธ v2.0 Features (Advanced RBAC)

Production-Ready Enterprise Features: Advanced role-based access control with granular permissions

โœจ Advanced RBAC System

Complete Role & Permission Management:

  • Roles: Create roles with content-type-specific CRUD permissions
  • UserGroups: Organize users into groups for easier management
  • User Assignment: Assign roles and groups to users dynamically
  • Granular Permissions: Per-content-type Create, Read, Update, Delete controls
  • Conditional Access: JSON-based conditions (e.g., "author": { "_eq": "$CURRENT_USER" })
  • System Capabilities: Global permissions beyond content (e.g., view_analytics)

API Endpoints (18 new endpoints):

# Role Management
POST   /api/roles                  # Create role
GET    /api/roles                  # List roles
GET    /api/roles/{id}             # Get role
PUT    /api/roles/{id}             # Update role
DELETE /api/roles/{id}             # Delete role

# UserGroup Management  
POST   /api/user-groups            # Create group
GET    /api/user-groups            # List groups
GET    /api/user-groups/{id}       # Get group
PUT    /api/user-groups/{id}       # Update group
DELETE /api/user-groups/{id}       # Delete group
POST   /api/user-groups/{id}/users # Add user to group
DELETE /api/user-groups/{id}/users/{userId} # Remove user

# User Assignment
POST   /api/users/{id}/roles       # Assign role to user
DELETE /api/users/{id}/roles/{roleId} # Remove role
POST   /api/users/{id}/groups      # Add user to group
DELETE /api/users/{id}/groups/{groupId} # Remove user

Example - Create Role:

POST /api/roles
Authorization: Bearer {ADMIN_TOKEN}

{
  "name": "Content Editor",
  "description": "Can edit own articles",
  "permissions": [{
    "contentTypeSlug": "article",
    "create": { "enabled": true },
    "read": { "enabled": true },
    "update": {
      "enabled": true,
      "conditions": { "author": { "_eq": "$CURRENT_USER" } }
    },
    "delete": { "enabled": false }
  }],
  "systemCapabilities": ["view_analytics"]
}

๐Ÿ›ก๏ธ v1.2 Features (Still Available)

  • โœ… Optimistic Concurrency Control - Prevent data conflicts
  • โœ… Async Workflow Processing - Non-blocking background tasks
  • โœ… Resilience Patterns - HTTP retries, circuit breakers

๐Ÿงฉ v2.1 Workflow System (Phase 2)

BarakoCMS includes a powerful plugin-based workflow system:

  • 6 Built-in Actions: Email, SMS, Webhook, CreateTask, UpdateField, Conditional
  • Custom Plugins: Create your own actions without touching core code
  • Template Variables: Dynamic content substitution ({{data.FieldName}})
  • Dry-Run Testing: Test workflows without side effects
  • JSON Schema Validation: Catch errors before execution
  • Execution Logging: Full audit trail of workflow runs
  • Auto-Discovery: New actions automatically appear in API

Quick Example:

# Create custom plugin
public class SlackAction : IWorkflowAction
{
    public string Type => "Slack";
    public async Task ExecuteAsync(...) { /* send to Slack */ }
}

# Use in workflow
{
  "actions": [{
    "type": "Slack",
    "parameters": {
      "message": "New order: {{data.OrderNumber}}"
    }
  }]
}

See Advanced Documentation, Plugin Development Guide, and Migration Guide to get started.


๐ŸŒŸ Core Features

โšก Unmatched Speed

  • FastEndpoints: Minimal overhead, maximum throughput
  • MartenDB: PostgreSQL-backed JSON document store with event sourcing
  • Async-First: Non-blocking I/O throughout

๐Ÿงฉ Infinite Extensibility

  • Plugin Architecture: Swap IEmailService, ISmsService, ISensitivityService
  • Custom Content Types: No schema migrations needed
  • Workflow Engine: Event-driven automation
  • Projections: Transform events into read models

๐Ÿ›ก๏ธ Enterprise-Grade Robustness

  • โœ… Advanced RBAC: Granular role-based access control with conditions
  • โœ… Event Sourcing: Full audit trail, time travel, replay
  • โœ… Idempotency: Duplicate request protection
  • โœ… Optimistic Concurrency: Race condition prevention
  • โœ… Sensitive Data: Field-level masking/hiding
  • โœ… Resilience: Built-in retries, circuit breakers

Problem Solved: Prevents data loss when multiple users edit the same content simultaneously.

How It Works:

// Client sends version with update
PUT /api/contents/{id}
{
  "id": "...",
  "data": { "title": "Updated Title" },
  "version": 1  // โฌ…๏ธ Must match current DB version
}

// โœ… If version matches โ†’ Update succeeds (version becomes 2)
// โŒ If version mismatches โ†’ 412 Precondition Failed

User Experience:

User A: Saves changes (v1 โ†’ v2) โœ…
User B: Tries to save with v1 โŒ 
        Gets error: "Content modified by another user. Please refresh."
User B: Refreshes, sees latest content (v2)
User B: Makes changes, saves (v2 โ†’ v3) โœ…

Developer Usage:

# Get current content (includes version in event stream)
GET /api/contents/{id}

# Update with version check
PUT /api/contents/{id}
{
  "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "data": { "Name": "Updated Name" },
  "version": 2  # Current version from DB
}

โšก Async Workflow Processing

Problem Solved: Heavy workflows (emails, notifications) no longer block API responses.

Architecture:

sequenceDiagram
    participant Client
    participant API
    participant DB
    participant AsyncDaemon
    participant WorkflowEngine
    
    Client->>API: PUT /api/contents/{id}
    API->>DB: Save ContentUpdated event
    API-->>Client: 200 OK (instant response)
    
    Note over AsyncDaemon: Background Processing
    AsyncDaemon->>DB: Poll for new events
    AsyncDaemon->>WorkflowProjection: Process event
    WorkflowProjection->>WorkflowEngine: Execute workflows
    WorkflowEngine->>WorkflowEngine: Send emails, notifications

Performance Impact:

  • Before: 500-2000ms (includes email sending)
  • After: 50-100ms (instant API response)
  • Workflows: Process in background within 1-2 seconds

๐Ÿ›ก๏ธ Resilience & Health Checks

  • HTTP Retries: Automatic retry with exponential backoff for external services
  • Circuit Breaker: Prevents cascade failures
  • Health Endpoint: /health monitors database connectivity

๐ŸŒŸ Core Features

โšก Unmatched Speed

  • FastEndpoints: Minimal overhead, maximum throughput
  • MartenDB: PostgreSQL-backed JSON document store with event sourcing
  • Async-First: Non-blocking I/O throughout

๐Ÿงฉ Infinite Extensibility

  • Plugin Architecture: Swap IEmailService, ISmsService, ISensitivityService
  • Custom Content Types: No schema migrations needed
  • Workflow Engine: Event-driven automation
  • Projections: Transform events into read models

๐Ÿ›ก๏ธ Enterprise-Grade Robustness

  • โœ… Event Sourcing: Full audit trail, time travel, replay
  • โœ… Idempotency: Duplicate request protection
  • โœ… Optimistic Concurrency: Race condition prevention
  • โœ… RBAC: Role-based access control
  • โœ… Sensitive Data: Field-level masking/hiding
  • โœ… Resilience: Built-in retries, circuit breakers

๐Ÿ“– Developer Guide

Content Management Workflow

1. Define Content Type (Schema)
POST /api/content-types
Authorization: Bearer <TOKEN>

{
  "name": "Blog Post",
  "fields": {
    "title": "string",
    "body": "richtext",
    "author": "string",
    "publishDate": "datetime",
    "tags": "array"
  }
}
2. Create Content (Draft)
POST /api/contents
Authorization: Bearer <TOKEN>
Idempotency-Key: unique-request-id-123

{
  "contentType": "blog-post",  # Auto-generated slug
  "data": {
    "title": "Getting Started with BarakoCMS",
    "body": "<p>Welcome to our CMS...</p>",
    "author": "Jane Doe",
    "publishDate": "2024-01-15T10:00:00Z",
    "tags": ["tutorial", "cms"]
  },
  "status": 0,  # 0=Draft, 1=Published, 2=Archived
  "sensitivity": 0  # 0=Public, 1=Sensitive, 2=Hidden
}

# Response
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "message": "Content created successfully"
}
3. Update Content (with Concurrency Check)
PUT /api/contents/550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer <TOKEN>
Idempotency-Key: unique-request-id-456

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "data": {
    "title": "Getting Started with BarakoCMS (Updated)",
    "body": "<p>Welcome! This guide has been updated...</p>",
    "author": "Jane Doe",
    "publishDate": "2024-01-15T10:00:00Z",
    "tags": ["tutorial", "cms", "getting-started"]
  },
  "version": 1  # โฌ…๏ธ IMPORTANT: Current version
}

# Success: 200 OK
# Conflict: 412 Precondition Failed
4. Publish Content
PUT /api/contents/550e8400-e29b-41d4-a716-446655440000/status
Authorization: Bearer <TOKEN>

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "newStatus": 1  # Publish
}
5. Query Content
# Get all published blog posts
GET /api/contents?contentType=blog-post&status=1

# Get specific content
GET /api/contents/550e8400-e29b-41d4-a716-446655440000

Authentication & Authorization

Login
POST /api/auth/login

{
  "username": "admin",
  "password": "SecurePassword123!"
}

# Response
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expiry": "2024-01-16T10:00:00Z"
}
Use Token
# Include in every authenticated request
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Workflow Automation

Create event-driven workflows that trigger automatically when content changes.

How Workflows Work
  1. Event Triggered - Content created/updated/status changed
  2. Async Processing - Background daemon picks up event (no API delay)
  3. Workflow Matched - System finds workflows matching content type + event
  4. Actions Executed - Email, SMS, webhooks, etc. run automatically
Create a Workflow
POST /api/workflows
Authorization: Bearer {ADMIN_TOKEN}

{
  "name": "Attendance Confirmation Email",
  "description": "Send email to attendee after record creation",
  "triggerContentType": "AttendanceRecord",
  "triggerEvent": "Created",
  "conditions": {
    "status": "Published"
  },
  "actions": [
    {
      "type": "SendEmail",
      "config": {
        "to": "{{data.Email}}",
        "subject": "Attendance Record Created - {{data.FirstName}} {{data.LastName}}",
        "body": "Hello {{data.FirstName}},\n\nYour attendance record has been successfully created.\n\nThank you!"
      }
    }
  ]
}
Template Variables

Use dynamic values from the content in your workflows:

{
  "to": "{{data.Email}}",              // Field from record data
  "subject": "Record {{id}} Created",  // Record ID
  "body": "Status: {{status}}"         // Record status
}
Example: Email to Record's Email Field

When creating an attendance record:

POST /api/contents
{
  "contentType": "AttendanceRecord",
  "data": {
    "FirstName": "John",
    "LastName": "Doe",
    "Email": "john.doe@company.com",  # Email recipient
    "BirthDay": "1990-01-01"
  },
  "status": 1  // Published
}

The workflow automatically sends email to john.doe@company.com using the {{data.Email}} template variable.

Available Actions (Current)
  • SendEmail - Email notifications with templates
  • SendSms - SMS alerts (via ISmsService)
Supported Events
  • Created - When content is first created
  • Updated - When content is modified
  • StatusChanged - When content status changes
  • Deleted - When content is removed
Conditional Execution

Add conditions to control when workflows run:

{
  "conditions": {
    "status": "Published",              // Only for published content
    "data.Salary": { "_gt": 100000 }   // Only if salary > 100k
  }
}
Multiple Actions

Chain multiple actions in one workflow:

{
  "actions": [
    {
      "type": "SendEmail",
      "config": {
        "to": "{{data.Email}}",
        "subject": "Record Created"
      }
    },
    {
      "type": "SendEmail",
      "config": {
        "to": "manager@company.com",
        "subject": "New Submission: {{data.FirstName}}"
      }
    }
  ]
}

Performance: All workflows run asynchronously in background - zero impact on API response time.


Advanced Features

Event Sourcing & Time Travel
# View all versions
GET /api/contents/{id}/history

# Response
[
  {
    "version": 1,
    "eventType": "ContentCreated",
    "timestamp": "2024-01-15T10:00:00Z",
    "data": { ... }
  },
  {
    "version": 2,
    "eventType": "ContentUpdated",
    "timestamp": "2024-01-15T11:30:00Z",
    "data": { ... }
  }
]

# Rollback to version 1
POST /api/contents/{id}/rollback/1
Sensitive Data Protection
# Create content with sensitive fields
POST /api/contents
{
  "contentType": "employee-record",
  "data": {
    "name": "John Doe",
    "ssn": "123-45-6789",
    "salary": 75000
  },
  "sensitivity": 1  # Sensitive
}

# Standard user gets masked data
GET /api/contents/{id}
# Response
{
  "name": "John Doe",
  "ssn": "***-**-6789",  # Masked
  "salary": "****"      # Masked
}

# SuperAdmin gets full data
GET /api/contents/{id}
Authorization: Bearer <SUPERADMIN_TOKEN>
# Response
{
  "name": "John Doe",
  "ssn": "123-45-6789",  # Full
  "salary": 75000        # Full
}
Idempotency Protection
# Prevent duplicate submissions
POST /api/contents
Idempotency-Key: unique-client-generated-uuid

# If retried with same key โ†’ Same response, no duplicate
POST /api/contents
Idempotency-Key: unique-client-generated-uuid  # Same key
# Returns: 409 Conflict (already processed)

๐Ÿงช Testing

Run Full Test Suite

dotnet test

Run Specific Tests

# Stabilization tests (concurrency, async workflows)
dotnet test --filter "FullyQualifiedName~StabilizationVerificationTests"

# Attendance POC tests
dotnet test AttendancePOC.Tests/AttendancePOC.Tests.csproj

Test Coverage (v2.2)

  • โœ… Authentication: Login, refresh, logout, rate limiting, lockout
  • โœ… Password Policy: Strong password enforcement
  • โœ… Pagination: All list endpoints paginated
  • โœ… Permission Caching: Cached permission checks
  • โœ… Optimistic Concurrency: Verified via StabilizationVerificationTests
  • โœ… Async Workflows: Infrastructure verified, daemon operational
  • โœ… Sensitive Data Masking: Multiple role-based tests
  • โœ… Idempotency: Duplicate request handling
  • Overall: 173/174 tests passing (99%)

๐Ÿ“ฆ Use as NuGet Package

Installation

dotnet add package BarakoCMS

Setup

// Program.cs
using barakoCMS.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Register BarakoCMS services
builder.Services.AddBarakoCMS(builder.Configuration);

var app = builder.Build();

// Use BarakoCMS middleware
app.UseBarakoCMS();

app.Run();

Configure

// appsettings.json
{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=your_db;Username=postgres;Password=postgres"
  },
  "JWT": {
    "Key": "your-secret-key-minimum-32-characters-long"
  }
}

๐Ÿ—๏ธ Architecture

Technology Stack

  • Framework: .NET 8
  • API: FastEndpoints (high-performance minimal API)
  • Database: PostgreSQL + MartenDB (Event Sourcing)
  • Authentication: JWT Bearer Tokens
  • Resilience: Polly (retry, circuit breaker)
  • Testing: xUnit + TestContainers

Key Design Patterns

  • Event Sourcing: All changes stored as events
  • CQRS: Separate read/write models via projections
  • Repository Pattern: IDocumentSession abstracts data access
  • Dependency Injection: Constructor injection throughout
  • Async/Await: Non-blocking I/O

๐Ÿงช Attendance POC (Real-World Example)

See how BarakoCMS handles a real-world scenario with sensitive data and workflows.

Features

  • Sensitive Fields: SSN (Hidden), BirthDate (Masked)
  • RBAC: Different views for SuperAdmin, HR, Standard users
  • Workflows: Auto-email on submission
  • Idempotency: Duplicate submission prevention

Run POC

cd AttendancePOC
dotnet run

# Seeds sample data automatically
# Try: GET /api/contents with different role tokens

๐Ÿ› Troubleshooting

Database Connection Failed

Error: Npgsql.NpgsqlException: Failed to connect

Solutions:

  1. Check PostgreSQL is running: docker ps
  2. Start database: docker compose up -d
  3. Verify connection string in appsettings.json
  4. Check port 5432 is not blocked

Port Already in Use

Error: IOException: Failed to bind to http://localhost:5000

Solutions:

  1. Change port in Properties/launchSettings.json
  2. Kill process using port 5000: lsof -ti:5000 | xargs kill -9 (macOS/Linux)

Concurrency Conflict (412)

Error: 412 Precondition Failed when updating content

Cause: Content version changed since you loaded it

Solution:

  1. Refresh content to get latest version
  2. Retry update with new version number

Health Check Returns Unhealthy

Error: /health endpoint shows database unhealthy

Solutions:

  1. Verify PostgreSQL is running
  2. Check connection string
  3. Ensure database user has proper permissions

Kubernetes Monitoring Not Working

Symptom: Admin UI shows "Kubernetes monitoring is disabled or not available in this environment"

Prerequisites:

  • Docker Desktop installed
  • Kubernetes enabled in Docker Desktop

Setup Kubernetes in Docker Desktop:

  1. Open Docker Desktop
  2. Go to Settings (gear icon)
  3. Click on Kubernetes in the left sidebar
  4. Check "Enable Kubernetes"
  5. Click "Apply & Restart"
  6. Wait for the green Kubernetes indicator (bottom left)

Verify Kubernetes is Running:

# Check if kubectl is working
kubectl cluster-info

# Should see something like:
# Kubernetes control plane is running at https://kubernetes.docker.internal:6443

Restart BarakoCMS:

docker compose restart app

Check Logs:

docker compose logs app | grep -i kubernetes

# Should see:
# Kubernetes client initialized using local kubeconfig

Enable in Settings:

  1. Open Admin UI at http://localhost:3000/settings
  2. Toggle Kubernetes Monitoring to ON
  3. Visit /ops/health page to see cluster status

Note: If you don't need Kubernetes monitoring, simply keep the toggle OFF in Settings. The feature is optional.


๐Ÿ“š Additional Resources

Documentation

For AI Agents


๐Ÿค Contributing

We welcome contributions! All contributors must sign our Contributor License Agreement (CLA).

Why CLA?

The CLA protects both you and the project:

  • โœ… You retain ownership of your contributions
  • โœ… You grant BarakoCMS permission to use your code
  • โœ… Prevents legal issues around commercial licensing
  • โœ… Enables future dual-licensing (CE/EE) without re-permission

How It Works

  1. First-Time Contributors:

    • Open a Pull Request
    • @cla-assistant will automatically comment
    • Click the link to sign the CLA (takes 30 seconds)
    • Your PR will be automatically updated
  2. After Signing:

    • Your GitHub username is permanently recorded
    • No need to sign again for future PRs
    • Start contributing immediately!

CLA Status: CLA assistant

See CLA.md for full agreement text.

Development Workflow

  1. Fork the repository
  2. Create feature branch: git checkout -b feature/amazing-feature
  3. Make changes and add tests
  4. Ensure tests pass: dotnet test
  5. Commit: git commit -m 'Add amazing feature'
  6. Push: git push origin feature/amazing-feature
  7. Open Pull Request (CLA will be requested automatically)

Code Standards

  • Follow existing code style (FastEndpoints vertical slices)
  • Add tests for new features
  • Update README if adding user-facing features
  • Keep PRs focused and small

See CONTRIBUTING.md for detailed guidelines.


๐Ÿ“„ License

Apache License 2.0

  • โœ… Commercial use allowed
  • โœ… Modification allowed
  • โœ… Distribution allowed
  • โœ… Patent use allowed
  • ๐Ÿ“ Attribution required

See LICENSE for full terms.


๐Ÿ’– Support This Project

<a href='https://ko-fi.com/T6T01CQT4R' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi3.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>

If BarakoCMS helps you build better applications, consider supporting the development!


๐Ÿ‘จโ€๐Ÿ’ป Author

Arnel Robles
GitHub: @arnelirobles

Built with โค๏ธ by developers, for developers.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.0.0-beta.1 57 12/27/2025
2.2.0 195 12/25/2025
2.1.11 174 12/23/2025
2.1.0 286 12/16/2025
2.0.2 130 12/12/2025
2.0.1 424 12/11/2025
2.0.0 420 12/11/2025
1.2.0 171 12/5/2025
1.1.0 207 12/5/2025
1.0.7 211 12/4/2025
1.0.5 210 12/4/2025
Loading failed