Krafter
A modern .NET 10 full-stack platform built with Vertical Slice Architecture (VSA), multi-tenancy, and Blazor WebAssembly — designed for efficient AI-assisted feature development.
Install / Use
/learn @AditiKraft/KrafterREADME
Krafter
<p align="center"> <img src="docs/krafter-logo.svg" alt="Krafter logo" width="560" /> </p>A modern .NET 10 full-stack platform built with Vertical Slice Architecture (VSA), multi-tenancy, and Blazor WebAssembly — designed for efficient AI-assisted feature development.
🚀 Demo
Try the live demo at https://krafter.getkrafter.dev/
Default Credentials:
- Email:
admin@getkrafter.dev - Password:
123Pa$$word!
Alternatively, log in with Google to create a new account.
⚡ TL;DR Quick Start
First local run:
- Run Aspire orchestration
dotnet run --project aspire/AditiKraft.Krafter.Aspire.AppHost/AditiKraft.Krafter.Aspire.AppHost.csproj
- Wait for startup to finish
krafter-migratorapplies checked-in migrations beforekrafter-apistarts
- Open URLs
- Aspire Dashboard: https://localhost:17285
- Backend API: https://localhost:5199
- Scalar API Reference: https://localhost:5199/scalar/v1
- Blazor UI: https://localhost:7291
📋 Table of Contents
- TL;DR Quick Start
- Overview
- Architecture
- Key Features
- Technology Stack
- Getting Started
- Project Structure
- Development Guide
- Deployment
- Contributing
- License
🎯 Overview
Krafter is a production-ready, enterprise-grade full-stack platform built with .NET 10, combining modern architectural patterns with cutting-edge technologies. It provides a solid foundation for building scalable, multi-tenant SaaS applications with rich user interfaces.
What Makes Krafter Special?
- 🏗️ Vertical Slice Architecture (VSA) - Backend organized by features, not layers
- 🌐 Hybrid Blazor - WebAssembly + Server rendering for optimal performance
- 🏢 Multi-Tenancy - Complete tenant isolation at the database level
- 🔐 Permission-Based Security - Fine-grained authorization with JWT
- ⚡ Real-Time Updates - SignalR integration for live notifications
- 📊 Observability - OpenTelemetry with Aspire orchestration
- 🎨 Modern UI - Radzen components with theming support
- 🔌 Refit API Client - Type-safe HTTP client with automatic token handling
🏛️ Architecture
Solution Architecture Diagram
Project Dependencies Diagram
✨ Key Features
🏗️ Architecture
- Vertical Slice Architecture (VSA) - Features organized by business capability
- Clean Code - Single Responsibility, DRY, SOLID principles
- Auto-Registration - Handlers, services, and routes discovered via markers
- Response Pattern - Consistent
Response<T>wrapper for all operations
🔐 Security
- JWT Authentication - Secure token-based authentication
- Google OAuth - External authentication integration
- Permission-Based Authorization - Fine-grained access control
- Multi-Tenancy - Complete tenant isolation at DB level
- Token Refresh - Automatic token rotation
🎨 User Interface
- Blazor Hybrid - WebAssembly + Server rendering
- Radzen Components - 70+ professional UI components
- Theme Support - Light/Dark/Auto modes with WCAG compliance
- Responsive Design - Mobile and desktop optimized
- Code-Behind Pattern - Clean separation of markup and logic
- Refit - Type-safe REST API client
📊 Data & Storage
- EF Core - PostgreSQL & MySQL support
- Multi-Database - Separate contexts for tenants, jobs, and main data
- Migrations - Code-first database schema management
- Soft Delete - Recoverable data deletion
⚡ Performance & Scalability
- Background Jobs - TickerQ for async processing
- SignalR - Real-time bi-directional communication
- Redis Cache - Distributed caching support
- Pagination - Efficient data loading
- Debouncing - Optimized search and filtering
🔍 Observability
- .NET Aspire - Orchestration and service discovery
- OpenTelemetry - Distributed tracing and metrics
- Structured Logging - Comprehensive application logs
- Health Checks - Service health monitoring
🚀 DevOps
- NUKE Build - Automated build pipeline
- Docker Support - Containerized deployment
- GitHub Actions - CI/CD automation
- Auto Deployment - Webhook-triggered updates
🛠️ Technology Stack
Backend
- .NET 10 - Latest .NET framework
- ASP.NET Core - Minimal APIs
- Entity Framework Core 10 - ORM
- ASP.NET Core Identity - User management
- FluentValidation - Input validation
- TickerQ - Background job processing
- SignalR - Real-time communication
Frontend
- Blazor WebAssembly - Client-side SPA
- Blazor Server - Server-side rendering
- Radzen Blazor - UI component library
- Refit - Type-safe REST API client
- Blazored LocalStorage - Browser storage
- FluentValidation.Blazor - Client-side validation
- Mapster - Object mapping
Infrastructure
- .NET Aspire - Cloud-native orchestration
- OpenTelemetry - Observability
- Redis - Caching (optional)
- PostgreSQL / MySQL - Database
- Docker - Containerization
- NUKE - Build automation
🚀 Getting Started
Prerequisites
- .NET 10 SDK
- Docker Desktop (for Aspire/PostgreSQL)
- Visual Studio 2022 17.11+ or VS Code
Quick Start
-
Clone the repository
git clone https://github.com/AditiKraft/Krafter.git cd Krafter -
Restore packages
dotnet restore -
Run AppHost
dotnet run --project aspire/AditiKraft.Krafter.Aspire.AppHost/AditiKraft.Krafter.Aspire.AppHost.csproj -
Wait for
krafter-migratorto finish- AppHost starts the short-lived migrator before
krafter-api - No manual
dotnet ef database updatestep is required for normal startup
- AppHost starts the short-lived migrator before
-
Access the application
- Aspire Dashboard: https://localhost:17285
- Backend API: https://localhost:5199
- Scalar API Reference: https://localhost:5199/scalar/v1
- Blazor UI: https://localhost:7291
-
Default Credentials
On first run, the application seeds a default admin account:
- Email:
admin@getkrafter.dev - Password:
123Pa$$word!
Alternatively, log in with Google, which will create a new account.
⚠️ Important: Change the default password immediately in production!
- Email:
Database Migrations Workflow
AppHost applies checked-in migrations automatically through krafter-migrator. For normal local startup, run AppHost and let the migrator finish.
Create a New Migration
The existing ConnectionStrings:KrafterDbMigration value in src/AditiKraft.Krafter.Backend/appsettings.Local.json already works for dotnet ef migrations add. Do not change it.
Install EF Core tools once if you have not already:
dotnet tool install --global dotnet-ef
Create the migration from the Backend project:
cd src/AditiKraft.Krafter.Backend
# Examples
dotnet ef migrations add <MigrationName> --context KrafterContext
dotnet ef migrations add <MigrationName> --context TenantDbContext
dotnet ef migrations add <MigrationName> --context BackgroundJobsContext
Restart AppHost to apply the new migration:
dotnet run --project aspire/AditiKraft.Krafter.Aspire.AppHost/AditiKraft.Krafter.Aspire.AppHost.csproj
Your database is now ready.
Troubleshooting
| Issue | Cause | Solution |
|-------|-------|----------|
| "Unable to create DbContext" | Missing ConnectionStrings:KrafterDbMigration or wrong working directory | Restore the KrafterDbMigration entry in appsettings.Local.json and run the command from src/AditiKraft.Krafter.Backend |
| "krafter-api does not start" | krafter-migrator failed first | Check the krafter-migrator logs and fix the migration error |
| "Migration already exists" | Duplicate migration name | Use dotnet ef migrations remove --context <ContextName> |
| "Pending model changes" | The model changed but no migration exists yet | Add a new migration for the affected context before restarting AppHost |
| dotnet-ef not found | EF tools not installed | Run dotnet tool install --global dotnet-ef |
Configuration Notes
Local development works with the checked-in dev settings.
Change configuration only if you need custom values for:
- PostgreSQL container credentials in
aspire/AditiKraft.Krafter.Aspire.AppHost/appsettings.json - JWT, TickerQ, or Google auth settings in
src/AditiKraft.Krafter.Backend/appsettings.json - UI backend URL or Google client settings in
src/UI/AditiKraft.Krafter.UI.Web/appsettings.Development.jsonandsrc/UI/AditiKraft.Krafter.UI.Web.Client/wwwroot/appsettings.json
For anything outside local development, prefer user-secrets or environment variables instead of committed values.
📁 Project Structure
AditiKraft.Krafter/
├── Agents.md # AI agent instructions (entry point)
├── aspire/ # Aspire orchestration
│ ├── AditiKraft.Krafter.Aspire.AppHost/
│ └── AditiKraft.Kraft
