Personal and family finance management system with multi-currency support and automatic balance calculation.
- β Business Requirements - Complete
- β System Requirements - Complete
- β Database Schema - Complete (7 tables, production-ready)
- β Backend API - Complete (26 REST endpoints with JWT auth)
- β OpenAPI Documentation - Complete (Swagger UI available)
- β Frontend MVP - Complete (Full CRUD for Accounts, Categories, Transactions)
- β gRPC API - Complete (Stage 6: Mobile API with dual-protocol architecture)
- π Current release: v0.4.2 on staging (fixes BE-001: deleted transactions no longer block deleting a category or account; BE-002: category restore name clash returns 409 instead of 500); v0.5.0 (Flutter client) in development
- π° Multi-currency support (RSD/EUR/USD with automatic conversion)
- π¦ Multiple account types (cash, bank, credit, savings, investment)
- π·οΈ Hierarchical categories (parent-child structure for income/expense)
- π Automatic balance calculation via database triggers
- π₯ Multi-user families with data isolation
- π JWT authentication with family-based access control
- π Transaction management with filters and pagination
- π Financial dashboard with monthly summary
- π± Responsive UI built with Vue.js 3 and Tailwind CSS
- π Advanced filtering by type, account, date range
- π Pagination for large transaction lists
- π‘ gRPC API for mobile clients (dual-protocol: REST + gRPC)
- Language: Go 1.25+
- Router: Chi v5
- Database: PostgreSQL 16
- Query Builder: sqlc (type-safe SQL)
- Authentication: JWT tokens
- API Docs: Swagger/OpenAPI 2.0
- gRPC: Protocol Buffers + gRPC (mobile API)
- Framework: Vue.js 3 (Composition API)
- Styling: Tailwind CSS
- Form Validation: VeeValidate + Zod
- State Management: Pinia
- HTTP Client: Axios
- Build Tool: Vite
- UI Components: Custom component library
Located in Documentation/:
expense_tracker_brd.mdβ Business Requirements Documentexpense_tracker_srs_mvp.mdβ System Requirements (MVP)expense_tracker_tdd_grpc_integration.mdβ Technical Design Document: gRPC Integration (Stage 6)expense_tracker_fs_flutter_mobile_client.mdβ Functional Specification: Flutter Mobile Client (v0.4.0)- PDF exports available in
Documentation/PDF/
Interactive Swagger UI: Available at /swagger/index.html when running the server
- OpenAPI 2.0 specification with full endpoint documentation
- Request/Response examples for all 26 endpoints
- Try it out functionality for testing endpoints directly
- Schema definitions for all DTOs
- Authentication flow documentation
Generated specification files in Documentation/swagger/:
swagger.json- OpenAPI specification (machine-readable)swagger.yaml- OpenAPI specification (human-readable)docs.go- Embedded Go documentation
Production-ready PostgreSQL schema with:
- 7 core tables: families, users, accounts, categories, transactions, exchange_rates, audit_log
- 10 triggers: automatic timestamp updates, balance calculation, audit logging
- 5 functions: timestamp updates, balance update, balance recalculation, audit trail, default categories
- 33 indexes: optimized for common query patterns
- Complete rollback migrations: every migration has a corresponding drop script
See database/migrations/README.md for details.
# Apply all migrations (in order; 008 is intentionally absent):
001 create families table
002 create users table
003 create accounts table
004 create categories table
005 create transactions table
006 create exchange rates table
007 create audit log table
009 create default categories function
010 fix account balance trigger
011 add user role
012 exchange rates provenance
013 account name unique
014 fix balance trigger account change
# Load demo data (not a migration):
database/seeds/008_demo_seed_data.sqlDemo credentials:
- Email:
demo@example.com - Password:
Demo123!
The REST API includes 26 endpoints across 8 groups:
POST /api/v1/auth/login- User login with JWTPOST /api/v1/auth/register- Register a new user and family
GET /health- Health checkGET /ready- Readiness probe
GET /api/v1/accounts- List all accountsPOST /api/v1/accounts- Create accountGET /api/v1/accounts/{id}- Get account detailsPATCH /api/v1/accounts/{id}- Update accountDELETE /api/v1/accounts/{id}- Delete accountGET /api/v1/accounts/{id}/balance- Get account balance
GET /api/v1/categories- List all categoriesPOST /api/v1/categories- Create categoryGET /api/v1/categories/{id}- Get category detailsPATCH /api/v1/categories/{id}- Update categoryDELETE /api/v1/categories/{id}- Delete categoryPOST /api/v1/categories/{id}/restore- Restore a deleted category
GET /api/v1/transactions- List transactions (with filters & pagination)POST /api/v1/transactions- Create transactionGET /api/v1/transactions/{id}- Get transaction detailsPATCH /api/v1/transactions/{id}- Update transactionDELETE /api/v1/transactions/{id}- Delete transaction
GET /api/v1/reports/spending-by-category- Spending analysisGET /api/v1/reports/monthly-summary- Monthly financial summary
GET /api/v1/currencies/rates- Get exchange ratesGET /api/v1/currencies/convert- Convert currency
POST /api/v1/exchange-rates/sync- Force exchange-rate sync from the Currency Rate Service
π Full documentation with examples: Visit /swagger/index.html after starting the server
Mobile API using Protocol Buffers: 5 services, 16 RPCs. Proto definitions in proto/ (7 files).
| Service | RPCs | Methods |
|---|---|---|
| AuthService | 2 | Login, ValidateToken |
| AccountService | 4 | ListAccounts, CreateAccount, UpdateAccount, DeleteAccount |
| TransactionService | 4 | ListTransactions, CreateTransaction, UpdateTransaction, DeleteTransaction |
| CategoryService | 4 | ListCategories, CreateCategory, UpdateCategory, DeleteCategory |
| ReportService | 2 | GetSpendingByCategory, GetMonthlySummary |
common.proto holds shared messages; currency_rate.proto is the client contract for the external Currency Rate Service (not served by this backend).
Authentication: JWT token via gRPC metadata header authorization: Bearer <token>
Testing with grpcurl (from project root):
# Get JWT token first
curl -s -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"demo@example.com","password":"Demo123!"}' | jq .data.token
# List accounts
grpcurl -plaintext \
-proto proto/accounts.proto \
-H "authorization: Bearer <token>" \
localhost:50051 expense_tracker.v1.AccountService/ListAccounts
# List transactions with filters
grpcurl -plaintext \
-proto proto/transactions.proto \
-H "authorization: Bearer <token>" \
-d '{"month": "2025-12", "page": 1, "per_page": 20}' \
localhost:50051 expense_tracker.v1.TransactionService/ListTransactionsDemo environment (Hetzner VPS):
| Service | URL |
|---|---|
| Web Frontend | https://demo-expensetracker.digitlock.systems |
| REST API | https://api-demo-expensetracker.digitlock.systems |
| REST API (direct) | <demo-host>:8081 |
| gRPC API | <demo-host>:50051 (plaintext) |
Demo credentials: demo@example.com / Demo123!
Note: gRPC is accessible via direct IP only β Cloudflare free plan does not proxy gRPC traffic.
expense-tracker/
βββ Documentation/ # Business and system requirements
β βββ expense_tracker_brd.md
β βββ expense_tracker_srs_mvp.md
β βββ swagger/ # OpenAPI documentation
β β βββ docs.go # Generated Swagger docs
β β βββ swagger.json # OpenAPI 2.0 spec
β β βββ swagger.yaml # OpenAPI 2.0 spec (YAML)
βββ proto/ # Protocol Buffer definitions
β βββ auth.proto # AuthService (2 RPCs)
β βββ accounts.proto # AccountService (4 RPCs)
β βββ transactions.proto # TransactionService (4 RPCs)
β βββ categories.proto # CategoryService (4 RPCs)
β βββ reports.proto # ReportService (2 RPCs)
β βββ common.proto # Shared messages
β βββ currency_rate.proto # Currency Rate Service client contract
βββ database/
β βββ migrations/ # SQL migration files
βββ cmd/
β βββ server/ # Application entry point
βββ internal/
β βββ api/ # HTTP handlers and routing
β β βββ handlers/ # Request handlers (with Swagger annotations)
β β βββ middleware/ # Auth, logging, recovery
β βββ auth/ # JWT service
β βββ config/ # Configuration management
β βββ database/ # Database layer
β β βββ queries/ # SQL queries for sqlc
β β βββ sqlc/ # Generated type-safe code
β βββ dto/ # Data transfer objects (with Swagger tags)
β βββ grpc/ # gRPC server
β β βββ pb/ # Generated protobuf Go code
β β βββ handlers/ # gRPC service implementations
β β βββ interceptors/ # Auth and logging interceptors
β β βββ server.go # gRPC server setup
β βββ repository/ # Business logic layer
βββ frontend/ # Vue.js 3 application
β βββ src/
β β βββ api/ # API client
β β βββ components/ # Reusable components
β β β βββ forms/ # Form components
β β β βββ modals/ # Modal dialogs
β β β βββ ui/ # Base UI components
β β βββ composables/ # Vue composables
β β βββ router/ # Vue Router config
β β βββ schemas/ # Zod validation schemas
β β βββ stores/ # Pinia stores
β β βββ types/ # TypeScript types
β β βββ views/ # Page components
β βββ public/
β βββ package.json
βββ buf.yaml # buf lint configuration
βββ buf.gen.yaml # buf code generation configuration
βββ .env # Environment variables
βββ go.mod # Go module definition
βββ sqlc.yaml # sqlc configuration
- Schema design
- Migration scripts
- Automatic balance calculation
- Audit logging
- Demo seed data
- Database package (Go + sqlc)
- REST API endpoints (26 endpoints)
- JWT authentication
- Business logic layer
- Input validation
- CORS configuration
- Family-based data isolation
- OpenAPI/Swagger specification
- Interactive API documentation (Swagger UI)
- Request/Response examples
- Authentication flow documentation
- Postman collection export
- Vue.js 3 setup with Vite
- API client with Axios
- Authentication UI (Login)
- Dashboard with financial summary
- Accounts management (full CRUD)
- Categories management (full CRUD with hierarchy)
- Transactions management (full CRUD with filters)
- Form validation with VeeValidate + Zod
- Responsive design with Tailwind CSS
- Reusable component library
- Manual testing (in progress)
- Bug fixes and improvements
- Unit tests (backend)
- Integration tests
- E2E tests (frontend)
- Performance optimization
- Security audit
- Protocol Buffer definitions (5 services, 16 RPCs)
- Code generation with buf + protoc
- gRPC server with dual-protocol architecture (REST :8080 + gRPC :50051)
- JWT auth interceptor (reuses existing JWT service)
- Logging interceptor
- All 16 RPCs across Auth, Account, Transaction, Category and Report services (v0.4.0)
- Tested with grpcurl
- Docker containerization
- CI/CD pipeline
- Production deployment
- Monitoring and logging
- Backup strategy
This project is licensed under the MIT License.
See the LICENSE file for details.
Igor Kudinov
This project is part of my professional portfolio demonstrating:
- Requirements analysis and documentation
- Database design and implementation
- Backend development (Go)
- REST API design
- OpenAPI/Swagger documentation
- Type-safe code generation (sqlc)
- Frontend development (Vue.js 3)
- gRPC API design and implementation
- Dual-protocol architecture (REST + gRPC)
- Protocol Buffers and code generation
- Full-stack application architecture
- DevOps and deployment
- GitHub Repository
- Portfolio: portfolio.digitlock.systems
- REST API Documentation: Available at
/swagger/index.htmlwhen running - gRPC: port
50051(proto files inproto/)