A mobile-first Progressive Web App for tracking personal income and expenses. Built with Laravel on the backend, vanilla JS on the front — no heavy framework, just fast and lean.

Features

  • Transaction logging with custom categories
  • Monthly summary dashboard with server-side charts
  • PWA support — installable, works offline for recent data

Stack decisions

Laravel was the obvious choice: Eloquent handles the relational data cleanly, and Sanctum keeps auth simple without overengineering.

// Filtering transactions by month — clean scope pattern
public function scopeForMonth(Builder $query, string $month): Builder
{
    return $query->whereRaw("DATE_FORMAT(date, '%Y-%m') = ?", [$month]);
}

MySQL stores transactions, categories, and monthly aggregates. Nginx + PHP-FPM on a VPS. The PWA layer is a standard service worker that caches the last 30 days of data for offline reads.

Status

Active development. Core transaction flow is working. Reports and export features in progress.

The deploy workflow for this project is covered in Deploy to VPS with a single Bash script.