A workspace-based analysis tool for economists and accountants. You build persistent, shared workspaces filled with live analysis objects — tables, charts, KPI cards, forecasts — and drive them through a chat command interface backed by AI agents.
Note on this repository. Disa is a sanitized public copy of a private production project, shared as a reference for what a modern .NET 10 + Blazor + AI-agent application looks like in practice. Credentials, customer data, real accounting records, and infrastructure details have been removed or replaced with placeholders. The code is meant for reading and learning, not for running unchanged.
The idea is to keep analysis alive after the conversation ends. Instead of throwaway chat answers, every result becomes an object that lives in a workspace and refreshes as the underlying data changes.
Four ideas hold the design together:
- Workspaces are persistent. Results outlive the chat that created them.
- Objects are live. A clock ticks, a weather card updates, a KPI recalculates when new data lands.
- Chat is a command layer, not the product. It orchestrates system state rather than being where answers go to die.
- Collaboration is built in. Workspaces are shared and iterated on by teams.
Each tenant gets its own SQLite database, so there is no shared-table cross-tenant access.
| Layer | Technology |
|---|---|
| UI | Blazor Server with Telerik UI for Blazor |
| Real-time | SignalR (chat streaming, live objects) |
| API | ASP.NET Core Minimal APIs |
| AI agents | Microsoft Agent Framework (MAF) |
| Intent classification | Azure.AI.OpenAI |
| Data | SQLite, one database per tenant |
| Identity | ASP.NET Core Identity with WebAuthn / passkeys + JWT |
| Observability | OpenTelemetry with .NET Aspire dashboard |
| Runtime | .NET 10, C# 13 |
Automation runs through Microsoft Agent Framework agents, each scoped to a domain:
- Analysis — builds tables, charts, and KPI objects from tenant data, plus forecasting.
- Fortnox — reads SIE4 accounting exports and payroll data into workspace objects.
- PublicData — pulls Swedish open data (SCB, Riksbank, SMHI, Trafikverket, Lantmäteriet).
- Comms — email and messaging notifications.
- Files — document upload, OCR, and extraction.
- Utility — clocks, weather, currency, and other live widgets.
┌─────────────────────────────────────────────────────────────┐
│ User browser │
└────────────────────────┬────────────────────────────────────┘
│ HTTPS
▼
┌─────────────────────────────────────────────────────────────┐
│ Blazor Server (Web) │
│ • Real-time UI over SignalR │
│ • Dock-based workspace layout, live objects │
│ • Chat as command interface, dark/light theming │
└────────────────────────┬────────────────────────────────────┘
│ HTTP + JWT bearer token
▼
┌─────────────────────────────────────────────────────────────┐
│ ASP.NET Core API (Minimal APIs) │
│ • JWT auth, tenant context middleware │
│ • Intent classification, OpenTelemetry instrumentation │
└────────────────────────┬────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Master │ │ Tenant │ │ MAF │
│ database │ │ databases │ │ agents │
│ (disa.db) │ │ (per-tenant)│ │ │
└─────────────┘ └─────────────┘ └─────────────┘
src/
Agents/ MAF agents and plugins (Analysis, Comms, Files, Fortnox, PublicData, Utility)
Api/ Minimal API endpoints
AppHost/ .NET Aspire orchestration
Core/ Domain logic, tenancy, identity, workspaces, data access
Web/ Blazor Server UI
tests/ Unit, integration, and Playwright E2E tests
- .NET 10 SDK
- A Telerik UI for Blazor account. The UI depends on Telerik's commercial component library and private NuGet feed.
The Telerik package source in NuGet.Config reads credentials from environment variables. Set them before restoring:
export TELERIK_USERNAME="your-telerik-account-email"
export TELERIK_PASSWORD="your-telerik-account-password"
dotnet restore
dotnet buildYou will also need a Telerik license key. See the Telerik licensing docs for how to provide telerik-license.txt locally (it is git-ignored).
API keys and secrets live in appsettings*.json and ship empty. Fill in what you need for the features you want to try — Azure OpenAI, Firebase web push, public-data API keys, and so on. Local overrides belong in appsettings.local.json or environment variables, both of which are git-ignored.
dotnet run --project src/AppHostDatabases are created at startup from EF Core migrations and seed data, so there is nothing to import. The seed data is synthetic.
dotnet test # unit + integration tests
dotnet test tests/UI/UI.csproj # Playwright E2E testsSome end-to-end tests reference demo documents and accounting fixtures that were removed during sanitization, so they will not all pass on a clean clone.
MIT © 2026 Johan Olofsson
