Minimal, fast time tracking built with Blazor WebAssembly and MudBlazor. Capture time and review grouped history with daily and grand totals.
Important
UI is implemented with MudBlazor components only, with CSS isolation. The project targets AOT publish and aggressive trimming.
- π Date picker defaults to today
- ποΈ Project dropdown (e.g., Viso Internal, Client A, Client B, Personal Development)
- β³ Hours numeric input and π work description textarea
- πΎ Save button to add entries
- π History grouped by date: Date | Project | Hours | Description
- β Daily totals and a grand total across all entries
- Implement core UI and local data model (in-memory)
- Theme toggle (light/dark mode with custom green palette)
- Setup script for automated environment preparation`
- Delete entries functionality with confirmation dialog
- SQLite WASM persistence (full TZ requirements)
- Add persistence layer (IndexedDB by default; SQLite WASM for full compliance; or external backend)
- Write unit and bUnit tests; integrate C# build scripts
- Optimize for AOT and trimming
- Runtime: .NET 10 (Blazor WebAssembly Standalone)
- Language: C# 14 with nullable reference types
- UI: MudBlazor (latest)
- Styling: Modern vanilla CSS with CSS isolation; no SCSS/Sass
- Testing: xUnit, bUnit, NSubstitute, Shouldly
- Automation: C#-based scripts executed via
dotnet run
Prerequisites: .NET SDK 10
Tip
Initial scaffolding is next; once created under srcs/, run the app locally with dotnet run and follow SPEC-0001 to validate behavior.
Suggested dev flow:
- Create the Blazor WASM app under
srcs/and add MudBlazor - Implement the Time Entry form and grouped history
- Add tests (xUnit/bUnit) and C# automation in
scripts/
Use the one-liner to clone and optionally set up the required .NET SDK:
Set-ExecutionPolicy Bypass -Scope Process -Force;
irm https://raw.githubusercontent.com/kYaRick/Viso.Tracker/main/scripts/setup-iex.ps1 | iexThis launches an interactive menu:
Warning
GitHub Pages is static hosting. Server-side databases are not available.
- β Default (recommended): IndexedDB in-browser storage (offline-capable, minimal bundle impact)
- π Optional: SQLite WASM in-browser (OPFS/IndexedDB). Heavier bundle and integration; use only if SQL is required
- π Alternative: External backend API (ASP.NET Core + SQL) hosted separately; front-end remains static on GitHub Pages
- Set the Blazor
index.htmlbase href to your repo subpath (e.g.,/Viso.Tracker/) - Publish and copy the generated
wwwroottodocs/on themainbranch - Configure Pages: Source β Deploy from a branch β Branch
mainβ Folder/docs
Caution
Verify all assets load under the repository subpath; mismatched base href breaks routing and static files.
All automation is C#-based and executable via dotnet run. Available scripts in scripts/:
Automatically updates all badges in README.md:
- Version from
Directory.Build.props - .NET from
global.json - MudBlazor from
Directory.Packages.props - GitHub badges (Last Commit, License, Issues) - auto-generated links
dotnet run scripts/UpdateBadges.csTip
Run this script after changing versions or before committing to keep badges up-to-date.
Extracts version from Directory.Build.props and updates the version badge in README.md:
dotnet run scripts/UpdateVersionBadge.csNote
This is now included in UpdateBadges.cs. Use the unified script instead.
Option 1: GitHub Action (Recommended)
Manually trigger workflow via GitHub UI:
- Go to Actions tab on GitHub
- Select "Publish to GitHub Pages" workflow
- Click "Run workflow" β "Run workflow"
- Wait for completion and check
docs/folder
Option 2: Local Script
Builds Release version, publishes wwwroot to docs/ folder:
dotnet run scripts/PublishGitHubPages.csTip
After running locally, review changes with git status, stage with git add docs/, commit, and push to trigger Pages deployment.
Ensures commit messages follow Conventional Commits format:
dotnet run scripts/ValidateCommitMessage.cs --commit-formatInstalls pre-commit hooks to auto-validate commit messages:
dotnet run scripts/SetupGitHooks.cs
# or
dotnet run scripts/InstallGitHooks.csImportant
All commit messages must follow Conventional Commits (v1.0.0).
Format: <type>(<scope>): <description>
Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, wip (use sparingly)
Rules: lowercase type, imperative present (add not added), no period at the end.
[!TIP] Install hooks to enforce validation:
dotnet scripts/SetupGitHooks.cs
# or
dotnet scripts/InstallGitHooks.csView format help:
dotnet scripts/ValidateCommitMessage.cs --commit-format