A comprehensive personal finance management application built with .NET and Next.js
Orbit is a full-stack finance tracker that helps you manage transactions, budgets, savings, and gain deep insights into your spending habits through powerful analytics and visualizations.
- Open Banking Integration: Automatic transaction imports via GoCardless and Monzo APIs
- Transaction Management: Categorize and organize all your spending
- Budget Pots: Create customizable spending categories with limits
- Savings Pots: Set and track savings goals with progress monitoring
- Subscription Tracking: Monitor recurring payments and billing cycles
- Historic Analytics: Detailed spending analysis with 12-month trends
- Monthly spending breakdowns by category
- Top merchants and transaction analysis
- Daily spending patterns
- Year-on-year comparisons
- Interactive charts and visualizations
- Journal: Daily entries with mood tracking
- Notes: Rich text editor with folder organization
- Tasks: Todo management with priorities and categories
- Calendar: Event scheduling with recurring event support
- Shopping Lists: Organize shopping with quick-add common items
- Upload and categorize important documents
- Full-text search capabilities
- Secure storage and retrieval
Backend (Orbit.Core & Orbit.Domain)
- Framework: .NET 10
- Language: C# 13
- Database: PostgreSQL (production) / SQLite (development)
- ORM: Entity Framework Core 10
- API: RESTful with JWT authentication
- Background Jobs: Hangfire for scheduled tasks
- Logging: Serilog with Seq integration
Frontend (orbit.web)
- Framework: Next.js 16 (App Router)
- Language: TypeScript
- UI Library: Mantine v8
- State: TanStack Query (React Query)
- Charts: Recharts via Mantine Charts
Orbit/
βββ .github/workflows/ # CI/CD pipelines
βββ Orbit.Core/ # API Layer
β βββ Controllers/ # API endpoints
β β βββ AuthController.cs
β β βββ TransactionsController.cs
β β βββ PotsController.cs
β β βββ HistoricMonthController.cs
β β βββ CalendarController.cs
β β βββ DocumentsController.cs
β β βββ JournalController.cs
β β βββ NotesController.cs
β β βββ ShoppingController.cs
β β βββ TasksController.cs
β βββ Properties/
β βββ Program.cs # Application entry point
β βββ appsettings.json # Configuration
β βββ Dockerfile
β
βββ Orbit.Domain/ # Business Logic Layer
β βββ Database/
β β βββ Context/
β β β βββ AppDbContext.cs # EF Core DbContext
β β βββ Migrations/ # Database migrations
β β βββ Models/ # Entity models
β β βββ Transactions.cs
β β βββ SpendingPot.cs
β β βββ SavingsPot.cs
β β βββ HistoricData.cs
β β βββ CalendarEvent.cs
β β βββ Document.cs
β β βββ JournalEntry.cs
β β βββ NotePage.cs
β β βββ ShoppingListItem.cs
β β βββ TaskItem.cs
β β
β βββ DTOs/ # Data Transfer Objects
β β βββ Auth/
β β βββ Calendar/
β β βββ Documents/
β β βββ Finance/
β β β βββ HistoricData/
β β β βββ Pots/
β β β βββ Subscriptions/
β β β βββ Transactions/
β β βββ Journal/
β β βββ Notes/
β β βββ Shopping/
β β βββ Tasks/
β β
β βββ Services/ # Business logic implementation
β β βββ AuthService.cs
β β βββ Finance/
β β β βββ TransactionsService.cs
β β β βββ PotsService.cs
β β β βββ SubscriptionsService.cs
β β β βββ HistoricDataService.cs
β β β βββ MonthService.cs
β β βββ Calendar/
β β β βββ CalendarService.cs
β β βββ Documents/
β β β βββ DocumentsService.cs
β β βββ Journal/
β β β βββ JournalService.cs
β β βββ Notes/
β β β βββ NotesService.cs
β β βββ Shopping/
β β β βββ ShoppingService.cs
β β βββ Tasks/
β β βββ TasksService.cs
β β
β βββ Interfaces/ # Service contracts
β β βββ Api/ # API service interfaces
β β
β βββ Helpers/ # Utility classes
β β βββ BankApiHelper.cs # Bank API integration
β β βββ CommsSenderClient.cs # Email/notifications
β β βββ DatabaseSeedHelper.cs
β β βββ EnvironmentalSettingHelper.cs
β β βββ HangfireJobSetup.cs
β β βββ UserContextHelper.cs
β β
β βββ Enums/ # Shared enumerations
β
βββ orbit.web/ # Frontend Next.js application
β βββ (See orbit.web/README.md for details)
β
βββ Orbit.sln # Solution file
- .NET 10 SDK or later
- Node.js 20 or later
- PostgreSQL 15+ (for production)
- Docker
- Development: TestContainers (Docker required)
- Production: PostgreSQL (scalable, production-ready)
JWT-based authentication with the following endpoints:
POST /api/Auth/Login- Authenticate userPOST /api/Auth/Register- Create new accountPOST /api/Auth/RefreshToken- Refresh access token
All API endpoints (except auth) require a valid JWT token in the Authorization header:
Authorization: Bearer <token>
Finance
GET /api/Transactions/GetTransactionsForMonth- Monthly transactionsGET /api/Pots/GetAllPotData- Budget and savings potsGET /api/HistoricMonth/GetHistoricMonthData- Historic analyticsGET /api/Subscriptions/GetSubscriptions- Recurring payments
Productivity
GET /api/Tasks/GetTasks- Task listGET /api/Calendar/GetCalendarEvents- Calendar eventsGET /api/Journal/GetJournalEntries- Journal entriesGET /api/Notes/GetNotePagesAndFolders- Notes structureGET /api/Shopping/GetShoppingListItems- Shopping list
Documents
GET /api/Documents/GetAllDocuments- Document listPOST /api/Documents/UploadDocument- Upload fileGET /api/Documents/DownloadDocument- Download file
Swagger Documentation: Available at /swagger in development mode
Automated tasks running on schedules:
- Bank Sync: Hourly transaction imports from connected banks
- Subscription Processing: Daily check for due subscriptions
- Data Archival: Monthly historic data generation
- Cleanup: Regular maintenance tasks
Hangfire Dashboard: Available at /hangfire (requires authentication)
- Orbit.Core: Presentation layer (Controllers, API)
- Orbit.Domain: Business logic, data access, services
- Separation of Concerns: Clear boundaries between layers
- Service Layer Pattern: Business logic encapsulation in dedicated service classes
- Dependency Injection: Constructor injection for loose coupling and testability
- DTO Pattern: Data transfer objects for API communication
- Direct DbContext Access: Services directly use EF Core DbContext (no repository abstraction)
- Interface Segregation: Service interfaces define contracts for each domain area
- Normalized Schema: Minimize data redundancy
- Foreign Keys: Referential integrity
- Indexes: Optimized query performance
- Soft Deletes: Data recovery capability (where applicable)
To be added
Logs are written to:
- Console: For development debugging
- File: Rolling daily logs in
/app/Logs/ - Seq: Centralized log aggregation (optional)
- Information: Normal operations
- Warning: Potential issues
- Error: Handled exceptions
- Critical: Unhandled exceptions, system failures
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow C# coding conventions
- Use meaningful variable and method names
- Keep methods focused and concise
- Frontend Documentation: orbit.web/README.md
- .NET Documentation: https://docs.microsoft.com/dotnet/
- Entity Framework Core: https://docs.microsoft.com/ef/core/
- Hangfire: https://www.hangfire.io/
Built with β€οΈ using .NET and Next.js