A cross-platform productivity app built with .NET MAUI and Blazor. Manage habits, dailies, and to-dos with a focus timer, analytics, and reliable sync across web and mobile.
Live Demo: habitinator.app
Demo • Preview • Download • Features • Tech Stack • Getting Started
Live Demo (Web): https://habitinator.app
Latest Release:
| Platform | Package | Notes |
|---|---|---|
| Android | Habitinator-android.apk | Install on-device (unknown sources required) |
| Windows | Habitinator-windows-x64.zip | Portable app, extract and run |
| iOS / macOS | Source only | Build from source using .NET MAUI workload |
Windows runtime note: if your release is framework-dependent, install .NET Desktop Runtime once.
- Open latest releases
- Download your platform package
- Follow platform steps below
# Windows
dotnet build -t:Run -f net10.0-windows10.0.19041.0
# Android (requires Android SDK)
dotnet build -t:Run -f net10.0-android- Enable Install from unknown sources in system settings
- Transfer the APK to your phone
- Open the APK and install
- Extract the ZIP file
- Run
Habitinator.exe - If prompted, install .NET Desktop Runtime
- Core Planner: Track habits, dailies, and to-dos. Organize them with tags, notes, and checklists.
- Global Session Timer: A stopwatch with target logging to trace time spent on specific items.
- Statistics & Heatmap: Interactive heatmap dashboard to monitor your progress over time.
- Local-First & Sync: The mobile/desktop clients run on SQLite for offline support and sync changes automatically to a server-side PostgreSQL backend.
| Layer | Technologies |
|---|---|
| Runtime | .NET 10 |
| Web UI | Blazor Web App (Interactive Server), MudBlazor |
| Native Apps | .NET MAUI + Blazor Hybrid (Android, iOS, macOS, Windows) |
| Database (Server) | Neon Serverless PostgreSQL / any PostgreSQL via EF Core |
| Database (Client) | SQLite via EF Core |
| Orchestration | .NET Aspire AppHost |
Make sure you have Docker installed and running for the local PostgreSQL container.
Run the following command to start PostgreSQL, the web backend, and the native client host environment:
dotnet run --project src/AppHost/AppHost.csprojThe application will automatically seed a guest account on startup:
- Email:
guest@habitinator.local - Password:
Guest123!
Here are the project dependencies and database schema (auto-updated via documentation scripts):
flowchart LR
%% Auto-generated by tools/Habitinator.Diagrams (project reference graph)
App_MAUI["App.MAUI"]
App_MAUI_UITests["App.MAUI.UITests"]
App_Shared_RCL["App.Shared.RCL"]
App_Shared_RCL_Tests["App.Shared.RCL.Tests"]
App_Shared_Tests["App.Shared.Tests"]
App_Web["App.Web"]
App_Web_Client["App.Web.Client"]
App_Web_IntegrationTests["App.Web.IntegrationTests"]
AppHost["AppHost"]
App_MAUI --> App_Shared_RCL
App_Shared_RCL_Tests --> App_Shared_RCL
App_Shared_Tests --> App_Shared_RCL
App_Web --> App_Shared_RCL
App_Web --> App_Web_Client
App_Web_Client --> App_Shared_RCL
App_Web_IntegrationTests --> App_Web
AppHost --> App_Web
flowchart TB
%% Auto-generated from EF Core ApplicationDbContextModelSnapshot
AspNetRoleClaims["AspNetRoleClaims"]
AspNetRoles["AspNetRoles"]
AspNetUserClaims["AspNetUserClaims"]
AspNetUserLogins["AspNetUserLogins"]
AspNetUserRoles["AspNetUserRoles"]
AspNetUserTokens["AspNetUserTokens"]
AspNetUsers["AspNetUsers"]
BoardItems["BoardItems"]
BoardRequestIdempotencies["BoardRequestIdempotencies"]
UserActivityEvents["UserActivityEvents"]
AspNetRoles -->|fk| AspNetRoleClaims
AspNetRoles -->|fk| AspNetUserRoles
AspNetUsers -->|fk| AspNetUserClaims
AspNetUsers -->|fk| AspNetUserLogins
AspNetUsers -->|fk| AspNetUserRoles
AspNetUsers -->|fk| AspNetUserTokens
AspNetUsers -->|fk| BoardItems
AspNetUsers -->|fk| BoardRequestIdempotencies
AspNetUsers -->|fk| UserActivityEvents