A modern game server control plane for customer-owned hardware
Meridian Console (codebase: Dhadgar) is a multi-tenant SaaS platform that orchestrates game servers on hardware you control. Think of it as a mission control center that talks to agents running on your servers—whether they're in your basement, a colo facility, or spread across multiple clouds.
What makes it different: We don't host your servers. You do. We just give you the tools to manage them at scale.
Prerequisites:
- Windows 10/11 (or Linux/macOS—scripts work everywhere)
- 16GB RAM recommended
- PowerShell 7+ (Windows) or bash (Linux/macOS)
# 1. Clone the repo
git clone https://github.com/SandboxServers/MeridianConsole.git
cd MeridianConsole
# 2. Run the bootstrap script (installs .NET, Docker, etc.)
.\scripts\bootstrap-dev.ps1
# 3. Start local infrastructure (PostgreSQL, RabbitMQ, Redis, Grafana, Prometheus, Loki)
docker compose -f deploy/compose/docker-compose.dev.yml up -d
# 4. Build everything
dotnet build
# 5. Run the Gateway (API entry point)
dotnet run --project src/Dhadgar.Gateway
# 6. Try it out!
curl http://localhost:5000/
curl http://localhost:5000/healthz
open http://localhost:5000/scalar/v1 # API docs (aggregated from all services)That's it! You now have the entire platform running locally.
Observability dashboards:
- Grafana: http://localhost:3000 (admin/admin)
- Prometheus: http://localhost:9090
- RabbitMQ Management: http://localhost:15672 (dhadgar/dhadgar)
- What is Meridian Console?
- Current Status
- Getting Started
- Architecture Overview
- Services
- Development Guide
- Testing
- Contributing
You have game servers. Maybe you're running Minecraft for friends, hosting Valheim for a guild, or managing a fleet of ARK servers for a community. You want:
- Centralized control: See all servers in one dashboard
- Automated management: Start, stop, update servers without SSH
- Multi-tenancy: Let others manage their servers through your instance
- Your hardware: Run on your gaming PC, dedicated server, or cloud VMs
That's Meridian Console. It's the control plane—the brain that coordinates everything—while your hardware does the actual work.
It IS:
- A web UI + API for managing game servers
- A platform for running on your hardware (SaaS or self-hosted)
- Multi-tenant (SaaS edition) or single-tenant (KiP edition)
- Microservices architecture with modern observability
It IS NOT:
- A game server hosting provider (we don't run your servers for you)
- A finished product (it's actively being built)
- A monolithic app (services are independent and communicate via APIs)
The design philosophy: Agents run on customer hardware and are high-trust components. The control plane issues commands and receives telemetry, but never reaches beyond what the customer installed.
- Network: Agents make outbound connections (no inbound firewall holes needed)
- Security: mTLS everywhere (in progress), certificate rotation, audit trails
- Data: Collect only what's needed (health, metrics, events)—not game content
📋 Full state-of-the-project review (2026-07): see docs/PROJECT-STATE.md for the verified per-service maturity matrix, known divergences, and the beta roadmap.
Core Platform:
- ✅ Full solution builds with .NET 10 (
dotnet build) - ✅ ~1,640 tests (
dotnet test); 12 AppHost tests skip without Docker - ✅ Local infrastructure with Docker Compose
- ✅ API Gateway with YARP reverse proxy
- ✅ OpenTelemetry distributed tracing + metrics
- ✅ Grafana/Prometheus/Loki observability stack
- ✅ Centralized middleware (correlation IDs, RFC 7807 errors, request logging)
Core Services (substantial implementation, some TODOs remain):
- Gateway: YARP reverse proxy with rate limiting, circuit breaker, CORS, Cloudflare IP integration (production-ready)
- Identity: User/org management, roles, OAuth providers (Steam, Battle.net, Epic, Xbox), sessions; MFA returns 501
- Nodes: Agent enrollment with mTLS, Certificate Authority, heartbeat monitoring, capacity reservations
- Secrets: Claims-based authorization, audit logging, rate limiting, Azure Key Vault integration
- BetterAuth: Social OAuth authentication (Node.js/Express service using the Better Auth SDK)
- Notifications: Email (Office 365/SMTP), alert dispatch, MassTransit event consumers
- Discord: Discord.Net bot with slash commands, webhook delivery, platform health reporting
- CLI (
dhadgar): Global .NET tool for managing identity, secrets, nodes, enrollment, and more
Frontend Apps (Astro/React/Tailwind stack):
- Scope: Documentation site with 19 sections and interactive dependency graphs (functional)
- Panel: Control plane UI with OAuth integration (scaffolding, dashboard skeleton)
- ShoppingCart: Marketing site with pricing tiers (wireframe, OAuth flow only)
Development Experience:
- ✅ Hot reload with
dotnet watch - ✅ Scalar API documentation for all services (at
/scalar/v1) - ✅ EF Core migrations for database services
- ✅ User secrets for local config
- ✅ Bootstrap script for environment setup
- Game server provisioning workflows (Servers service — implementation open in PR #88)
- Real-time server console via SignalR (Console service — implementation open in PR #88)
- Mod registry and versioning (Mods service — implementation open in PR #88)
- Agent runtime: enrollment bootstrap, command handlers, SignalR transport (Windows internals are substantial; Linux agent is a stub — see docs/PROJECT-STATE.md)
- Billing and subscription management (SaaS edition)
- Production UI features (Panel dashboard, ShoppingCart checkout)
Bottom line: The foundation is solid, but the integration seams (agent ↔ control plane, token refresh, server lifecycle) are the current work — see the beta roadmap.
Required:
- OS: Windows 10/11, Linux, or macOS
- RAM: 16GB recommended (8GB minimum)
- .NET SDK: 10.0.100 (pinned in
global.json) - Docker: For local infrastructure
- Git: For cloning the repo
Optional:
- Node.js 20+: If you want to work on the Scope documentation site
- Azure CLI: If you're setting up Azure resources
- Visual Studio 2022 or VS Code: For development
The bootstrap script installs everything you need:
# Run from the repo root
.\scripts\bootstrap-dev.ps1
# Options:
# -SkipDocker # Skip Docker Desktop installation
# -SkipMinikube # Skip minikube installation
# -SkipOptional # Skip VS Code, psql client tools
# -Status # Show what's already installedWhat it does:
- Checks for required tools (.NET, Docker, Git)
- Installs missing tools via Chocolatey (Windows) or package managers (Linux/macOS)
- Configures Docker Desktop
- Sets up minikube (Kubernetes for local testing)
- Starts local infrastructure
- Verifies everything works
Checkpoint system: If it needs a reboot (like after Docker install), it saves progress and resumes after restart.
1. Install .NET SDK 10.0.100
# Windows (winget)
winget install Microsoft.DotNet.SDK.10
# macOS (Homebrew)
brew install --cask dotnet-sdk
# Linux (see https://dotnet.microsoft.com/download)2. Install Docker
# Windows
winget install Docker.DockerDesktop
# macOS
brew install --cask docker
# Linux
curl -fsSL https://get.docker.com | sh3. Verify Installation
dotnet --version # Should show 10.0.100
docker --version # Any recent version
git --version # Any recent versionThe platform needs PostgreSQL, RabbitMQ, Redis, and observability tools:
# Start everything
docker compose -f deploy/compose/docker-compose.dev.yml up -d
# Verify it's running
docker ps
# Stop everything
docker compose -f deploy/compose/docker-compose.dev.yml downWhat you get:
- PostgreSQL (port 5432): Database for services
- RabbitMQ (ports 5672, 15672): Message bus + management UI
- Redis (port 6379): Caching and sessions
- Grafana (port 3000): Metrics dashboards (admin/admin)
- Prometheus (port 9090): Metrics collection
- Loki (port 3100): Log aggregation
- OpenTelemetry Collector (ports 4317, 4318): Telemetry pipeline
Default credentials: dhadgar / dhadgar for everything
Troubleshooting: See deploy/compose/README.md for common issues and solutions.
# Standard run
dotnet run --project src/Dhadgar.Gateway
# With hot reload
dotnet watch --project src/Dhadgar.Gateway
# Gateway runs on http://localhost:5000# Identity service (user/org management)
dotnet run --project src/Dhadgar.Identity
# BetterAuth service (authentication)
dotnet run --project src/Dhadgar.BetterAuth
# Run any service with hot reload
dotnet watch --project src/Dhadgar.{ServiceName}cd src/Dhadgar.Scope
npm install
npm run dev
# Scope runs on http://localhost:4321# Full solution
dotnet restore
dotnet build
# Specific service
dotnet build src/Dhadgar.Gateway
# Run all tests
dotnet test
# Run specific tests
dotnet test tests/Dhadgar.Gateway.Tests
dotnet test tests/Dhadgar.Gateway.Tests --filter "FullyQualifiedName~HealthCheckTests"If you're deploying to Azure or using Azure services (Key Vault, Container Registry, etc.), you'll need to set up Azure resources.
# Test Azure workload identity federation authentication
.\scripts\Test-WifCredential.ps1Azure resources (Key Vault, App Registration, etc.) are created manually or via Terraform (planned).
Azure Container Registry (already set up):
- Name:
meridianconsoleacr - Login Server:
meridianconsoleacr-etdvg4cthscffqdf.azurecr.io - Auth:
az acr login --name meridianconsoleacr
Use user secrets for local development (keeps secrets out of source control):
# Initialize user secrets for a service
dotnet user-secrets init --project src/Dhadgar.Identity
# Add Azure Key Vault URL
dotnet user-secrets set "Azure:KeyVaultUrl" "https://your-vault.vault.azure.net/" --project src/Dhadgar.Identity
# Add connection strings
dotnet user-secrets set "ConnectionStrings:Postgres" "your-connection-string" --project src/Dhadgar.Identity
# Optional: Enable OpenTelemetry export to observability stack
dotnet user-secrets set "OpenTelemetry:OtlpEndpoint" "http://localhost:4317" --project src/Dhadgar.Gateway
# List all secrets
dotnet user-secrets list --project src/Dhadgar.IdentityWhy user secrets?
- They're stored in your user profile (not the repo)
- Different developers can have different values
- They override
appsettings.jsonautomatically
Internet
↓
Cloudflare (WAF, CDN, DDoS protection)
↓
Gateway (YARP reverse proxy)
↓
┌─────────────────────────────────────────────┐
│ Microservices (running in Kubernetes) │
│ ├─ Identity (users, orgs, roles) │
│ ├─ Servers (game server lifecycle) │
│ ├─ Nodes (hardware inventory) │
│ ├─ Tasks (orchestration) │
│ └─ ... (see Services section) │
└─────────────────────────────────────────────┘
↕
RabbitMQ (async messaging)
↕
Customer Agents (Windows/Linux)
↓
Game Servers (running on customer hardware)
1. Microservices (No Monolith)
- Each service is independent
- Services communicate via HTTP APIs or message bus
- No compile-time dependencies between services
- Shared libraries only for contracts, utilities, and middleware
2. Database-per-Service
- Each service owns its data schema
- No shared database access
- Communication via APIs ensures proper boundaries
3. API Gateway Pattern
- Gateway is the single public entry point
- Handles: routing, rate limiting, CORS, authentication enforcement
- Uses YARP (Yet Another Reverse Proxy) for performance
4. Centralized Middleware
- Correlation IDs for distributed tracing (every request gets tracked)
- RFC 7807 Problem Details for errors (standard error format)
- Request logging with OpenTelemetry integration
5. Observability-First
- OpenTelemetry traces, metrics, and logs
- Grafana dashboards for visualization
- Prometheus for metrics, Loki for logs
- Correlation IDs connect everything
These services have substantial implementations (some TODOs remain):
What it does: Single entry point for all API traffic. Routes requests to backend services.
Tech stack: YARP reverse proxy, rate limiting, circuit breaker, CORS, OpenTelemetry
Key features:
- Routes 17 route configurations to 12 backend clusters
- Rate limiting (global, per-tenant, per-agent, auth endpoints)
- Circuit breaker with configurable failure thresholds
- Active health checks for backend services (30s interval)
- Session affinity for SignalR connections (Console service)
- Security headers, correlation tracking, Cloudflare IP integration
Endpoints:
GET /- Service bannerGET /healthz- Health checkGET /scalar/v1- Aggregated API documentation (Scalar)GET /scalar/gateway- Gateway-only API docs/api/v1/{service}/*- Proxies to backend services
Runs on: Port 5000 (configurable)
Database: None (stateless proxy)
What it does: User and organization management, role-based access control.
Tech stack: ASP.NET Core, PostgreSQL, Entity Framework Core
Key features:
- User CRUD operations (org-scoped)
- Organization (tenant) management
- Role system (org-scoped and custom roles)
- Membership management (invite/remove users from orgs)
- Search API (users, orgs, roles)
- OAuth provider integration (Steam, Battle.net, Epic, Xbox)
- Session management
- Activity tracking and audit logging
Endpoints (all user/role endpoints are org-scoped):
POST /organizations- Create organizationGET /organizations/{orgId}/users- List users in orgPOST /organizations/{orgId}/users- Create user in orgPOST /organizations/{orgId}/members/invite- Invite member to orgPOST /organizations/{orgId}/roles- Create custom roleGET /organizations/search- Search organizationsGET /organizations/{orgId}/users/search- Search users in orgPOST /webhooks/better-auth- BetterAuth webhook
Runs on: Port 5010
Database: PostgreSQL (dhadgar_identity)
What it does: Social OAuth authentication using the Better Auth SDK.
Tech stack: Node.js/Express + Better Auth SDK (not .NET — wrapped in a NoTargets .csproj so dotnet build covers it)
Key features:
- Social OAuth sign-in (Google, GitHub, Discord, Twitch, Facebook, Apple; Microsoft via WIF)
- Cross-provider account linking and session management
- ES256 exchange token (60s TTL, single-use) redeemed at Identity's
/exchangefor platform JWTs
Endpoints:
- Better Auth standard endpoints (handled by SDK)
- Proxied through Gateway at
/api/v1/betterauth/*
Runs on: Port 5130
Database: PostgreSQL (shared with Identity)
What it does: Secure access to platform secrets stored in Azure Key Vault.
Tech stack: ASP.NET Core, Azure Key Vault SDK
Key features:
- Claims-based authorization with permission hierarchy
- Comprehensive audit logging (SIEM-compatible)
- Rate limiting (read/write/rotate tiers)
- Input validation (Key Vault compatible naming)
- Break-glass emergency access
- Service account vs user account distinction
Endpoints:
GET /api/v1/secrets/{name}- Get single secretPOST /api/v1/secrets/batch- Get multiple secretsGET /api/v1/secrets/oauth- Get all OAuth secretsPUT /api/v1/secrets/{name}- Set/update secretPOST /api/v1/secrets/{name}/rotate- Rotate secretDELETE /api/v1/secrets/{name}- Delete secret
Runs on: Port 5011
Database: None (stateless, uses Azure Key Vault)
What it does: Hardware inventory, agent enrollment, health monitoring, and capacity management.
Tech stack: ASP.NET Core, PostgreSQL, Entity Framework Core, MassTransit
Key features:
- Node lifecycle management (Enrolling, Online, Degraded, Offline, Maintenance, Decommissioned)
- One-time enrollment tokens (SHA-256 hashed, configurable expiry)
- Certificate Authority for mTLS agent authentication (90-day validity, auto-renewal)
- Heartbeat-based health monitoring with stale node detection
- Capacity reservations to prevent over-provisioning
- Background services for reservation cleanup and node status updates
- Comprehensive audit logging
Endpoints:
POST /api/v1/agents/enroll- Agent enrollment with token (anonymous)POST /api/v1/agents/{nodeId}/heartbeat- Health check from agent (mTLS)POST /api/v1/agents/{nodeId}/certificates/renew- Certificate renewal (mTLS)GET /api/v1/agents/ca-certificate- Get CA certificate for trust store (anonymous)POST /organizations/{orgId}/enrollment/tokens- Create enrollment tokenGET /organizations/{orgId}/nodes- List nodes with filteringPOST /organizations/{orgId}/nodes/{nodeId}/reservations- Reserve node capacity
Runs on: Port 5040
Database: PostgreSQL (dhadgar_platform)
What it does: Command-line tool for managing the platform without the UI.
Tech stack: System.CommandLine, Spectre.Console, Refit (typed HTTP clients)
Key commands:
dhadgar auth- Authentication and token managementdhadgar identity- Organization/user/role managementdhadgar member- Organization membership operationsdhadgar secret- Secret managementdhadgar keyvault- Azure Key Vault operationsdhadgar nodes- Node managementdhadgar enrollment- Agent enrollment tokensdhadgar me- Self-service operations
Installation: dotnet tool install -g dhadgar
Config: Stored in ~/.dhadgar/config.json
These services have basic scaffolding (hello world, health checks) but core functionality is planned:
Planned: Subscription management, usage metering, invoicing
Planned: Game server lifecycle management, configuration, start/stop/restart
Planned: Background job orchestration, scheduling, status tracking
Planned: File upload/download, transfer orchestration, mod distribution
Planned: Real-time server console via SignalR, command execution
Planned: Mod registry, versioning, compatibility tracking (implementation open in PR #88)
Note: Notifications (port 5090) and Discord (port 5120) were previously listed here but are implemented services — see Core Services.
MeridianConsole/
├── src/
│ ├── Dhadgar.Gateway/ # API Gateway (YARP) ✅
│ ├── Dhadgar.Identity/ # Users, orgs, roles ✅
│ ├── Dhadgar.Nodes/ # Agent enrollment, mTLS CA ✅
│ ├── Dhadgar.Secrets/ # Secret management ✅
│ ├── Dhadgar.Cli/ # CLI tool (dhadgar) ✅
│ ├── Dhadgar.BetterAuth/ # Social OAuth (Node.js/Express) ✅
│ ├── Dhadgar.SharedAuth/ # Browser auth client (TypeScript, used by Panel/ShoppingCart)
│ ├── Dhadgar.Notifications/ # Email + alert dispatch ✅
│ ├── Dhadgar.Discord/ # Discord bot ✅
│ ├── Dhadgar.AppHost/ # .NET Aspire orchestration (partial — no BetterAuth)
│ ├── Dhadgar.{Service}/ # Other services (stubs)
│ ├── Shared/
│ │ ├── Dhadgar.Contracts/ # DTOs, message contracts
│ │ ├── Dhadgar.Shared/ # Utilities, data layer patterns
│ │ ├── Dhadgar.Messaging/ # MassTransit conventions
│ │ ├── Dhadgar.Testing/ # Shared test helpers
│ │ └── Dhadgar.ServiceDefaults/ # Middleware, observability
│ ├── Agents/
│ │ ├── Dhadgar.Agent.Core/ # Shared agent logic
│ │ ├── Dhadgar.Agent.Linux/ # Linux agent (stub)
│ │ ├── Dhadgar.Agent.Windows/ # Windows agent (Job Objects, services, IPC)
│ │ └── Dhadgar.Agent.GameServerWrapper/ # Per-server Windows service wrapper
│ ├── Dhadgar.Scope/ # Documentation site ✅
│ ├── Dhadgar.Panel/ # Main UI (scaffolding)
│ └── Dhadgar.ShoppingCart/ # Marketing & profile (auth working)
├── tests/ # 1:1 test projects (25 total, ~1,640 tests)
├── deploy/
│ ├── compose/ # Docker Compose for local dev
│ ├── kubernetes/helm/ # Helm charts for K8s deployment
│ └── terraform/ # Infrastructure as Code (planned)
├── scripts/ # PowerShell/bash automation
└── docs/ # Architecture and runbooks
See the existing services for patterns. Key steps:
-
Create the project
dotnet new webapi -n Dhadgar.YourService
-
Add to solution
dotnet sln add src/Dhadgar.YourService/Dhadgar.YourService.csproj
-
Add dependencies (in
.csproj)<ItemGroup> <ProjectReference Include="../Shared/Dhadgar.Contracts/Dhadgar.Contracts.csproj" /> <ProjectReference Include="../Shared/Dhadgar.ServiceDefaults/Dhadgar.ServiceDefaults.csproj" /> </ItemGroup>
-
Add to Gateway routing (
src/Dhadgar.Gateway/appsettings.json) -
Create test project
dotnet new xunit -n Dhadgar.YourService.Tests
For services that use databases (Identity, Billing, etc.):
# Add a migration
dotnet ef migrations add YourMigrationName \
--project src/Dhadgar.Identity \
--startup-project src/Dhadgar.Identity \
--output-dir Data/Migrations
# Apply migrations
dotnet ef database update \
--project src/Dhadgar.Identity \
--startup-project src/Dhadgar.Identity
# Remove last migration (if not applied yet)
dotnet ef migrations remove \
--project src/Dhadgar.Identity \
--startup-project src/Dhadgar.IdentityNote: Some services auto-apply migrations in Development mode (see Program.cs).
All services inherit these middleware components from Dhadgar.ServiceDefaults:
- CorrelationMiddleware: Adds
X-Correlation-Id,X-Request-Id,X-Trace-Idheaders - ProblemDetailsMiddleware: Converts exceptions to RFC 7807 Problem Details responses
- RequestLoggingMiddleware: Logs HTTP requests/responses with correlation context
To use in your service:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddServiceDefaults(); // Adds middleware automaticallyASP.NET Core loads configuration in this order (later overrides earlier):
appsettings.json- Defaults for all environmentsappsettings.Development.json- Development overrides- Environment variables - Server/container config
- User secrets - Local development secrets
- Kubernetes ConfigMaps/Secrets - Production secrets
Example:
// appsettings.json
{
"ConnectionStrings": {
"Postgres": "Host=localhost;Database=dhadgar"
}
}
// appsettings.Development.json (overrides)
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
}
}
// User secrets (overrides)
dotnet user-secrets set "ConnectionStrings:Postgres" "Host=localhost;Database=dhadgar;Username=dev;Password=secret"# All tests
dotnet test
# Specific project
dotnet test tests/Dhadgar.Gateway.Tests
# Specific test
dotnet test --filter "FullyQualifiedName~CorrelationMiddlewareTests"
# With detailed output
dotnet test --verbosity detailed- 1:1 mapping: Every project has a corresponding test project
- xUnit framework: All .NET tests use xUnit
- Integration tests ready: Services expose
public partial class ProgramforWebApplicationFactory
Example integration test:
public class GatewayIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly WebApplicationFactory<Program> _factory;
public GatewayIntegrationTests(WebApplicationFactory<Program> factory)
{
_factory = factory;
}
[Fact]
public async Task HealthCheck_ReturnsOk()
{
var client = _factory.CreateClient();
var response = await client.GetAsync("/healthz");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}- Read the architecture docs (
docs/architecture/) to understand the design - Check CLAUDE.md for AI-specific guidance (if you're using Claude Code)
- Run the bootstrap script to set up your environment
- Build and test to ensure everything works
-
Create a feature branch
git checkout -b feature/your-feature-name
-
Make changes (write code, tests, docs)
-
Ensure tests pass
dotnet test -
Commit with conventional commits
git commit -m "feat: add user search endpoint" git commit -m "fix: correct correlation ID propagation" git commit -m "docs: update README with new service info"
-
Push and create PR
git push -u origin feature/your-feature-name # Then create PR on GitHub
This repo has multiple code review bots:
- CodeRabbit: Automatic reviews on every commit
- spirit-of-the-diff: Comment
/spiriton a PR for deep-dive review - GitHub Actions: CI/CD pipeline runs tests, builds, linting
- Latest C# with nullable enabled: All new code must handle nullability
- Microservices pattern: No
ProjectReferencebetween services (only to shared libraries) - OpenAPI/Swagger: All HTTP endpoints documented
- Tests required: New features need tests
- Security-first: Review CLAUDE.md security guidelines
- CLAUDE.md: AI-assisted development guide (for Claude Code users)
- GEMINI.md: AI-assisted development guide (for Gemini users)
- docs/adr/: Architecture Decision Records (ADRs)
- docs/architecture/: Architecture decisions and design docs
- docs/implementation-plans/: Service implementation plans
- deploy/compose/README.md: Local infrastructure troubleshooting
- API docs: Run any service and visit
/swagger
It's a code name (like "Dadgar" in the scope doc) to distinguish the codebase from the product name "Meridian Console." Think "Android" (code name) vs "Android OS" (product name).
Technically yes, but you'd need to install and configure PostgreSQL, RabbitMQ, Redis, Grafana, Prometheus, and Loki manually. Docker Compose is much easier.
No. Everything runs locally via Docker. Azure resources are only needed if you're:
- Deploying to Azure
- Using Azure Key Vault for secrets
- Pushing container images to Azure Container Registry
This is intentional. The codebase provides the shape (architecture, structure, patterns) while features land incrementally. It's easier to maintain a consistent architecture if the structure exists first.
See the Adding a New Service section. Follow existing patterns (Gateway, Identity) for consistency.
- SaaS: Multi-tenant, hosted by us, subscription billing
- KiP (Knowledge is Power): Self-hosted, single-tenant, open-source
The codebase supports both—configuration and deployment differ.
[To be determined]
- Issues: https://github.com/SandboxServers/MeridianConsole/issues
- Discussions: https://github.com/SandboxServers/MeridianConsole/discussions
- Discord: [Coming soon]
Built with ❤️ by the Meridian Console team
🤖 This README was crafted with assistance from Claude Code