"One Core. Infinite Skins."
A polymorphic workflow engine that adapts its business logic, security constraints, and UI to the domain it servesβfrom strict government bureaucracy to agile software development.
Ticket Masala is not just a ticketing system; it is a Configuration-Driven Multi-Instance Platform.
Instead of building separate applications for different departments (HR, IT, Government), Ticket Masala uses a single Modular Monolith core that injects different "Personalities" at runtime.
The system supports Physical Isolation (for security) and Logical Partitioning (for efficiency).
graph TD
Config[YAML Configuration] -->|Injects Strategy| Core[Ticket Masala Core]
subgraph "The Ecosystem"
Core -->|Tenant: Desgoffe| NodeA[Node A: Gov Tech]
Core -->|Tenant: Whitman| NodeB[Node B: Infra]
Core -->|Tenant: Liberty| NodeC[Node C: SaaS]
end
NodeA -->|Strategy| Strict[Strict Validation & Hierarchy]
NodeC -->|Strategy| Agile[Agile Workflows & Git Integration]
The system behaves differently based on the active domain:
- Government Mode (Desgoffe): Enforces strict hierarchy, formal language, and bureaucratic steps (e.g., "Mayor's Stamp" approval).
- Tech Mode (Liberty): Enables agile workflows, git-style commits, and rapid iteration.
Not just a chatbot. GERDA is an embedded heuristic agent that:
- Triages Tickets: Analyzes sentiment and complexity to route tickets to the correct "Hemisphere" (e.g., Support vs. DevOps).
- Estimates Effort: Uses historical data to predict resolution time.
- Enforces Compliance: Automatically flags requests that violate domain-specific rules (e.g., GDPR violations in the Tax domain).
Ticket Masala publishes domain events for downstream integrations:
- Outbox Pattern: Ensures atomic transaction between ticket updates and event publishing.
- Reliable Delivery: Background service (
OutboxPublisher) drains messages to RabbitMQ with retry logic. - Event Schema: Follows
integration-contractssnake_case convention.
Published Events:
| Event | Routing Key | Description |
|---|---|---|
ticket.resolved |
event.ticket.resolved |
Ticket completed, triggers billing workflow |
ticket.created |
event.ticket.created |
New ticket created |
ticket.assigned |
event.ticket.assigned |
Ticket assigned to agent |
Configuration:
"RabbitMQ": {
"HostName": "localhost",
"Port": 5672,
"UserName": "guest",
"Password": "guest",
"ExchangeName": "garamatic.events"
}- Federated Deployment: Supports air-gapped deployment for high-security environments.
- SQLite WAL Mode: Optimized for single-file deployment with high concurrent read performance.
- Role-Based Access Control (RBAC): Granular permissions down to the field level.
- Core: .NET 10
- Web Framework: ASP.NET Core MVC with HTMX for high-performance interactivity.
- Database: Entity Framework Core + SQLite (Write-Ahead Logging enabled).
- AI/ML: Local Heuristic Engine (GERDA).
- Containerization: Docker & Fly.io.
- .NET 10.0 SDK
- Docker (Optional)
No external database required. The app initializes a local SQLite instance on first run.
# Clone the repository
git clone https://github.com/garamatic/ticket-masala.git
cd ticket-masala
# Build
dotnet build
# Run (Seeds database automatically with 'Desgoffe' and 'Liberty' data)
dotnet run --project src/TicketMasala.Web/
Access the portal at http://localhost:5054.
docker-compose up --build- API Documentation: Access the Swagger UI at
http://localhost:5054/swagger - Full Documentation: See docs/index.md for complete documentation
- Deployment Guide: See docs/deployment_guide.md for production setup
Passwords are configurable via environment variables:
MASALA_SEEDED_ADMIN_PASSWORD, MASALA_SEEDED_EMPLOYEE_PASSWORD, MASALA_SEEDED_CUSTOMER_PASSWORD.
Click to expand User List
| Role | Domain | Password | Context | |
|---|---|---|---|---|
| The Bureaucrat | Desgoffe | gustave@desgoffe.gov |
Admin123! |
Mayor. Can stamp permits. Strict view. |
| The Citizen | Desgoffe | jean.dupont@citoyen.be |
Customer123! |
Can only file complaints. No dashboard. |
| The DevOps Lead | Liberty | arthur@liberty.tech |
Employee123! |
Sees PRs, Bugs, and CI/CD pipelines. |
| The Support Rep | Liberty | sarah@liberty.tech |
Employee123! |
Sees Customer Tickets and SLAs. |
| The Foreman | Whitman | jack@whitman.infra |
Employee123! |
High contrast UI. Big buttons. |
# Run all tests
./scripts/test.sh
# Run with coverage report
./scripts/test-coverage.sh
# Run specific test class
dotnet test --filter "FullyQualifiedName~TicketTests"
# Run only unit tests (fast)
dotnet test --filter "FullyQualifiedName~UnitTests|FullyQualifiedName~Domain.Tests"- Unit Tests: Fast, isolated tests using in-memory database (
UnitTests/namespace) - Integration Tests: Full stack tests with WebApplicationFactory (
IntegrationTests/namespace) - Architecture Tests: Enforce code structure with NetArchTest (
Architecture/namespace) - Domain Tests: Pure domain logic tests without infrastructure (
TicketMasala.Domain.Tests/)
Coverage reports are generated in TestResults/CoverageReport/. Open index.html to view the detailed report.
Tests run automatically on pull requests with coverage reporting. The CI workflow:
- Builds the solution
- Runs unit tests (fast feedback)
- Runs all tests with coverage collection
- Generates and uploads coverage reports
A Modular Monolith designed for separation of concerns:
src/
βββ TicketMasala.Web/
β βββ Engine/ # THE BRAIN
β β βββ GERDA/ # AI & Heuristics Logic
β β βββ Tenants/ # Tenant Resolution Strategy
β β βββ Workflows/ # State Machines (Gov vs Tech)
β βββ Controllers/ # MVC Endpoints
β βββ Views/ # Razor Pages (Polymorphic UI)
βββ config/
β βββ masala_domains.yaml # The "Brain Transplant" Config
β βββ seed_data.json # Mock Data
- Architectural Deep Dive: masala-doc.fly.dev
- Live Ecosystem Demo: ticket-masala.fly.dev
- Garamatic Industries (Vendor): garamatic-web.fly.dev
Engineered by Garamatic Industries (Student Team):
- Charlotte SchrΓΆer: Pixel Perfectionist (Frontend Architecture)
- Maarten GΓΆrtz: C# Centurion (Core Logic)
- Wito De Schrijver: Guardian of the Zeros (Security & Infra)
- Juan Benjumea: Architecture & Integration
Educational Project for Applied CS (2025-2026). Incorporates architectural patterns for Project Atom.
