English - Русский
Alva is a web application (PWA) for strategic task planning and team resource balancing. It helps you distribute the workload across people as well as possible — without busywork — highlight the risks of slipping deadlines and show at once why the team is falling behind.
Core pieces: flexible task assignment (people and sub-teams), a shared skill dictionary, a two-dimensional Gantt (by task and by assignee), capacity and risk analysis, sprint auto-balancing and a full directory of participants.
Demo: https://jrfrigat.github.io/Alva/ — runs entirely in the browser, no server required.
- Planning — projects (M:N with teams), sprints, an unlimited task tree, change history, FS/SS/FF/SF dependencies, assignment to a person or a sub-team; required skills are matched against the team's skill dictionary.
- Gantt — full-width axis, lanes, rollup, critical path, links, drag and drop, zoom and virtualization; one component behind three pages.
- Capacity — work schedules with exceptions and recurring blocks, spreading an estimate over available hours, unmet demand by skill and sub-team.
- Risk — no assignee, overdue, forecast past the due date, overload, unfinished dependency; a summary, filters and reason chips, plus a notification bell.
- Auto-balance — assignment and date optimization (OR-Tools) in several modes, with the proposal shown right on the Gantt.
- Authentication — sign in, sign up and sign out; workspaces and teams, members and owners, an opt-in permission matrix.
- Data — export and import of a team snapshot in JSON/CSV/XLSX, atomic and with fresh identifiers.
- Interface — a PWA built on Flare (Alva Stitch theme derived from Fluent UI 2, Sapphire palette), with an adaptive shell and desktop accessibility. English and Russian, chosen per browser and switchable.
Open https://jrfrigat.github.io/Alva/ — the data lives in localStorage, no server is needed.
Prepare .env and docker-compose.override.yml using Getting started. From the repository root, run:
./run-docker-compose.batThe example override joins the existing proxy_network for Nginx Proxy Manager.
Upstream is http://alva-app:8080, with no host ports. Set the database password in .env.
If NPM uses a different network name, set NPM_PROXY_HOST to that name. The default is nginx-proxy.
For loopback access and Caddy, see Deployment.
dotnet restore Alva.slnx
$env:Database__Provider = "Sqlite"
dotnet run --project src/Alva.Api --urls http://localhost:8080A release (a pushed v* tag) publishes the image to GHCR and, when DOCKERHUB_USERNAME is set, to
Docker Hub:
docker pull ghcr.io/jrfrigat/alva:latest
docker run -p 8080:8080 \
-e ConnectionStrings__Alva="Host=<host>;Port=5432;Database=alva;Username=alva;Password=<password>" \
ghcr.io/jrfrigat/alva:latest
# Alva: http://localhost:8080Full configuration is in Configuration.
| Project | Purpose |
|---|---|
Alva.Domain, Alva.Contracts, Alva.Infrastructure |
Domain, contracts, data access (EF Core) |
Alva.Api |
Minimal API, authentication, permissions, serves the WASM client |
Alva.Client.UI |
Shared interface library and IApiService |
Alva.Client, Alva.Client.Demo |
Production and demo shells |
Alva.Integrations.Abstractions, Alva.Integrations.YandexTracker |
External task-source contracts and the Yandex Tracker integration |
Alva.Theme.Alva |
Alva theme; Gantt comes from the Flare.Components.Gantt package |
Full documentation lives in docs/ (English and Russian):
| Doc | Description |
|---|---|
| Getting Started | Running Alva (Docker, locally, demo), first sign-in |
| Configuration | Every setting and environment variable |
| Architecture | Projects, layers, data flow, authentication |
| Deployment | Docker, compose, HTTPS, backups |
| Development | Build, tests, conventions |
dotnet build Alva.slnx -c Release
dotnet test Alva.slnx -c ReleaseRequires .NET 10 (SDK 10.0.401, see global.json).
- CONTRIBUTING.md — how to contribute.
- CHANGELOG.md — release notes.
The interface is built on Flare.
MIT © 2026 FrigaT