A unified web platform for freelancers and individuals to track time spent on specific tasks, manage personal finances (earnings vs. spendings), and visualize productivity and financial health.
- Calm, data-first UI: one neutral design system across every page, with light, dark and system themes and no theme flash on load
- App shell: collapsible sidebar with a live timer badge, top bar with breadcrumb, timer pill and theme switch, and a bottom tab bar on mobile
- Consistent components: dialogs, dropdowns, date pickers, menus, toasts and confirm dialogs all share the same tokens
- KPI tiles: week-over-week deltas with sparklines
- Cash flow: 12-month income vs. expenses
- Time by project: ranked bar list
- Activity heatmap: real hours per day, with streaks
- Recent activity feed
- Projects & tags: group work into projects (with optional hourly rates) and tag it (e.g. "Development", "Meeting")
- Timer: start against a project from the page or the top bar; the running timer stays visible everywhere
- Filters: period, project and tag, with summary tiles for the selection
- Entries grouped by day, with manual entry and editing
- Monthly report: preview, then export to PDF/Excel for invoicing
- Transactions: income and expenses with categories; earnings can be created automatically from hourly rates
- Period KPIs: compared with the previous period, plus savings rate
- Monthly trend and spending by category
- A notice when transactions are in other currencies
- Manage projects, tags and categories; set currency, timezone and theme preferences
- Framework: Angular 21
- Component Library: PrimeNG 21, themed by a custom preset (
core/theme/lifesync-preset.ts) mapped onto the app's CSS variables - Styling: Tailwind CSS 4, with the light/dark design tokens in
styles.cssexposed through@theme - Charts: Chart.js
- Typography & icons: Geist font, bundled PrimeIcons
- State Management: Angular Signals
- Framework: .NET 8 (ASP.NET Core Web API)
- ORM: Entity Framework Core (EF Core)
- Authentication: JWT (JSON Web Token)
- PostgreSQL in both development and production
- Strategy: Code-First Migrations via EF Core, applied automatically on startup
- Sensitive fields are encrypted at rest (AES-256-GCM) with HMAC blind-index columns for lookups
LifeSyncTracker/
├── backend/
│ └── LifeSyncTracker.API/
│ ├── Controllers/ # API Controllers
│ ├── Data/ # DbContext and database configuration
│ ├── Models/
│ │ ├── DTOs/ # Data Transfer Objects
│ │ └── Entities/ # Database entities
│ ├── Services/ # Business logic services
│ │ └── Interfaces/ # Service interfaces
│ ├── Migrations/ # EF Core migrations
│ └── Program.cs # Application entry point
│
├── frontend/
│ └── src/
│ ├── app/
│ │ ├── core/ # Services, guards, interceptors, theme preset, format utils
│ │ ├── features/ # Pages: auth, dashboard, time-tracking, finance, settings, profile
│ │ └── shared/ # Shell, stat tile, bar list, heatmap calendar, color field
│ └── styles.css # Design tokens (light/dark)
│ └── environments/ # Environment configurations
│
└── README.md
See SETUP.md for the full development and production/hosting guide.
- .NET 8 SDK (or newer, with the .NET 8 runtime installed)
- Node.js 20.19+ / 22.12+ and npm
- Docker (PostgreSQL is required — there is no SQLite fallback)
cp .env.example .env # then fill in the keys — see SETUP.md
docker compose up -d --buildThe app is served at http://localhost:8088.
docker compose -f docker-compose.dev.yml up -d # Postgres + Mailpit
cd backend/LifeSyncTracker.API && dotnet run # API on :5555, Swagger at /swagger
cd frontend && npm install && npm start # app on :4200Backend secrets (Jwt:Key, Encryption:Key, the connection string and SMTP settings)
come from user-secrets — the exact commands are in SETUP.md.
POST /api/auth/register- Register new userPOST /api/auth/login- Login and get JWT token
GET /api/projects- Get all projectsPOST /api/projects- Create projectPUT /api/projects/{id}- Update projectDELETE /api/projects/{id}- Delete project
GET /api/timeentries- Get time entries (with filtering)POST /api/timeentries/start- Start timerPOST /api/timeentries/stop- Stop timerPOST /api/timeentries- Create manual entryPUT /api/timeentries/{id}- Update entryDELETE /api/timeentries/{id}- Delete entry
GET /api/transactions- Get transactions (with filtering)POST /api/transactions- Create transactionPUT /api/transactions/{id}- Update transactionDELETE /api/transactions/{id}- Delete transactionGET /api/transactions/categories- Get categories
GET /api/dashboard- Get dashboard statisticsGET /api/dashboard/time-distribution- Get time distribution dataGET /api/dashboard/monthly-flow- Get monthly financial flow
Secrets are never stored in appsettings.json — it ships with the sensitive values
blank and the app refuses to start without them.
- Development: user-secrets (
dotnet user-secrets set "Jwt:Key" "...") - Production: environment variables supplied by
.envvia Docker Compose (Jwt__Key,Encryption__Key,ConnectionStrings__PostgresConnection,Email__*)
See .env.example for the full list and SETUP.md for how to generate the keys.
src/environments/environment.ts points at http://localhost:5555/api for development;
the production build swaps in environment.prod.ts, which uses /api and relies on the
nginx proxy inside the frontend container.
This project is licensed under the MIT License.