BarakoCMS 2.2.0
See the version list below for details.
dotnet add package BarakoCMS --version 2.2.0
NuGet\Install-Package BarakoCMS -Version 2.2.0
<PackageReference Include="BarakoCMS" Version="2.2.0" />
<PackageVersion Include="BarakoCMS" Version="2.2.0" />
<PackageReference Include="BarakoCMS" />
paket add BarakoCMS --version 2.2.0
#r "nuget: BarakoCMS, 2.2.0"
#:package BarakoCMS@2.2.0
#addin nuget:?package=BarakoCMS&version=2.2.0
#tool nuget:?package=BarakoCMS&version=2.2.0
BarakoCMS
The AI-Native, High-Performance Headless CMS for .NET 8.
<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
- .NET 8 SDK
- Docker Desktop (or PostgreSQL 16+)
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:
/healthmonitors 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
- Event Triggered - Content created/updated/status changed
- Async Processing - Background daemon picks up event (no API delay)
- Workflow Matched - System finds workflows matching content type + event
- 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 createdUpdated- When content is modifiedStatusChanged- When content status changesDeleted- 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:
IDocumentSessionabstracts 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:
- Check PostgreSQL is running:
docker ps - Start database:
docker compose up -d - Verify connection string in
appsettings.json - Check port 5432 is not blocked
Port Already in Use
Error: IOException: Failed to bind to http://localhost:5000
Solutions:
- Change port in
Properties/launchSettings.json - 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:
- Refresh content to get latest version
- Retry update with new version number
Health Check Returns Unhealthy
Error: /health endpoint shows database unhealthy
Solutions:
- Verify PostgreSQL is running
- Check connection string
- 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:
- Open Docker Desktop
- Go to Settings (gear icon)
- Click on Kubernetes in the left sidebar
- Check "Enable Kubernetes"
- Click "Apply & Restart"
- 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:
- Open Admin UI at
http://localhost:3000/settings - Toggle Kubernetes Monitoring to ON
- Visit
/ops/healthpage 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
- DEVELOPMENT_STANDARDS.md - Field types, naming conventions, validation
- CHANGELOG.md - Version history
- CONTRIBUTING.md - Contribution guidelines
- CODE_OF_CONDUCT.md - Community standards
For AI Agents
- llms.txt - Codebase context for LLMs
- .cursorrules - Coding standards for AI assistants
- CITATIONS.cff - Citation metadata
๐ค 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
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
After Signing:
- Your GitHub username is permanently recorded
- No need to sign again for future PRs
- Start contributing immediately!
See CLA.md for full agreement text.
Development Workflow
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Make changes and add tests
- Ensure tests pass:
dotnet test - Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - 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 | Versions 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. |
-
net8.0
- AspNetCore.HealthChecks.Npgsql (>= 8.0.0)
- AspNetCore.HealthChecks.System (>= 9.0.0)
- AspNetCore.HealthChecks.UI (>= 8.0.0)
- AspNetCore.HealthChecks.UI.Client (>= 8.0.0)
- AspNetCore.HealthChecks.UI.InMemory.Storage (>= 8.0.0)
- BCrypt.Net-Next (>= 4.0.3)
- FastEndpoints (>= 5.21.2)
- FastEndpoints.Security (>= 5.21.2)
- FastEndpoints.Swagger (>= 5.21.2)
- IdentityModel (>= 7.0.0)
- KubernetesClient (>= 18.0.13)
- Marten (>= 8.16.1)
- Microsoft.Extensions.Http.Resilience (>= 10.1.0)
- prometheus-net.AspNetCore (>= 8.2.1)
- Serilog.AspNetCore (>= 10.0.0)
- Serilog.Sinks.Console (>= 6.1.1)
- Serilog.Sinks.File (>= 7.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.