A desktop time tracking application built with Electron, React, and ASP.NET Core.
- β±οΈ Log time entries with flexible input (hours or start/end times)
- π Weekly overview with filtering and summaries
- π Project and customer management
- π Comprehensive reports with Excel export
- π€ Invoice generation with breakdown by time codes
- πΎ SQLite database - no server required
- π₯οΈ Runs both installed and portable
- π¦ Single-file database for easy backup
.\build.ps1
cd Electron
npm start.\package.ps1This creates:
- Installer:
Electron\dist\Time Logger Setup 1.0.0.exe - Portable:
Electron\dist\TimeLogger-1.0.0-portable.zip
- Database stored in:
%LOCALAPPDATA%\TimeLogger\timelogger.db - Persists across application updates
- Standard Windows installation
- Database stored in:
<AppFolder>\Data\timelogger.db - Perfect for USB drives
- No installation required
- Determined by presence of
portable.txtfile
- Node.js (v18 or later) - https://nodejs.org/
- .NET SDK (v10 or later) - https://dotnet.microsoft.com/download
Verify installation:
node --version
dotnet --version-
Install dependencies:
cd Frontend npm install cd ..\Electron npm install
-
Build and run:
cd .. .\build.ps1 cd Electron npm start
.\package.ps1Output:
Electron\dist\Time Logger Setup 1.0.0.exe- Windows installerElectron\dist\TimeLogger-1.0.0-portable.zip- Portable version
# Build application
.\build.ps1
# Create packages
cd Electron
npm run buildTimeLoggerApplication/
βββ Backend/
β βββ TimeLoggerAPI/ # ASP.NET Core Web API
β βββ Controllers/ # API endpoints
β βββ Data/ # EF Core DbContext
β βββ Models/ # Database entities
β βββ Migrations/ # SQLite migrations
βββ Frontend/
β βββ src/
β βββ components/ # React components
β βββ api.ts # API client
βββ Electron/
β βββ main.js # Electron main process
β βββ backend/ # Published .NET API
β βββ frontend/ # Built React app
βββ build.ps1 # Development build script
βββ package.ps1 # Production packaging script
Provider: SQLite (single-file database)
Location:
- Installed:
%LOCALAPPDATA%\TimeLogger\timelogger.db - Portable:
<AppFolder>\Data\timelogger.db
Backup: Simply copy the .db file
View Database Info: Go to Settings β Database tab
- Click "+ New Entry"
- Select customer and project
- Choose date
- Enter hours or start/end times
- Add description (optional)
- Click "Create"
- Go to "Reports" tab
- Select date range
- Choose customer/project filters
- Click "Export to Excel"
- Opens generated invoice with breakdown
- Configure billing rates
- Set currency conversion
- View database information
- Manage time codes and receipt types
- Frontend: React 18 + TypeScript + Vite
- Backend: ASP.NET Core 10 + Entity Framework Core
- Database: SQLite
- Desktop: Electron 28
- Packaging: electron-builder
App won't start
- Check if .NET SDK is installed:
dotnet --version - Ensure ports 5001 is available
- Check Electron console (Ctrl+Shift+I)
Database not found
- Check Settings β Database tab for location
- Verify file permissions
- For portable mode, ensure
portable.txtexists
Changes not appearing
- Run
.\build.ps1to rebuild - Hard refresh in app (Ctrl+Shift+R)
-
In
Electron/package.json, set your GitHub username and repo name underbuild.publish:"publish": { "provider": "github", "owner": "jesplar", "repo": "TimeLoggerApplication" }
-
Create a GitHub Personal Access Token with
reposcope:- GitHub β Settings β Developer settings β Personal access tokens β Generate new token
- Save it somewhere safe
Installed users will be notified automatically on next launch.
# 1. Bump the version in Electron/package.json
# e.g. "version": "1.0.0" β "version": "1.1.0"
# 2. Build and publish to GitHub Releases
$env:GH_TOKEN = "ghp_your_token_here"
.\package.ps1 -PublishThis will:
- Build the backend, frontend, and Electron app
- Create the installer and portable packages
- Publish a GitHub Release with all artifacts and a
latest.ymlupdate manifest - Existing installed users will see an "Update Available" dialog on next launch
Note: The portable version does not auto-update. Users running portable must download the new release manually.
If you distribute updates directly (e.g. via email or shared drive) without GitHub:
# Build packages locally (no publish)
.\package.ps1Send the user the new Time Logger Setup x.x.x.exe installer.
They can run it directly over the existing installation β no uninstall required.
The database in %LOCALAPPDATA%\TimeLogger\ is never touched by the installer.
build.ps1- Build backend, frontend, and copy to Electronpackage.ps1- Create installer and portable packagespackage.ps1 -Publish- Build and publish a GitHub Release (requires$env:GH_TOKEN)
MIT