Spendly is being built as a personal finance assistant for tracking money, managing budgets, monitoring subscriptions, planning financial goals, and calculating a safe amount to spend each day.
The product is being developed as a modular monolith with Clean Architecture Lite. The repository currently contains the backend foundation, the first Domain model, and a production PostgreSQL persistence layer.
v0.4 Persistence Layer
The current milestone includes:
- .NET 10 backend solution;
- ASP.NET Core API and Worker hosts;
- immutable Domain entities and value objects;
- strongly typed UUID version 7 identifiers;
- Entity Framework Core and Npgsql integration;
- production
SpendlyDbContextand explicit entity configurations; - PostgreSQL migration
InitialCreate; - PostgreSQL readiness health check;
- local PostgreSQL through Docker Compose;
- metadata, migration, round-trip, and readiness integration tests;
- CI validation for formatting, build, tests, vulnerabilities, and pending EF Core model changes.
Application use cases, repositories, authentication, and domain feature endpoints are not implemented yet. Product vision and MVP documents describe target capabilities; the delivered state is tracked separately.
spendly/
├── .config/
│ └── dotnet-tools.json
├── .github/
│ └── workflows/
├── backend/
│ ├── src/
│ │ ├── Spendly.Api/
│ │ ├── Spendly.Application/
│ │ ├── Spendly.Domain/
│ │ ├── Spendly.Infrastructure/
│ │ └── Spendly.Worker/
│ ├── tests/
│ │ ├── Spendly.IntegrationTests/
│ │ └── Spendly.UnitTests/
│ └── Spendly.sln
├── deploy/
│ └── docker-compose.yml
├── docs/
│ ├── adr/
│ ├── architecture/
│ └── product/
├── global.json
└── README.md
Required:
- .NET 10 SDK compatible with
global.json.
Required for PostgreSQL database tests and local infrastructure:
- Docker Desktop or another Docker-compatible container engine.
The repository pins:
- the .NET SDK in
global.json; - repository-local .NET tools in
.config/dotnet-tools.json; - NuGet versions in
backend/Directory.Packages.props; - the local PostgreSQL image in
deploy/docker-compose.yml.
Restore the repository-local EF Core tool:
dotnet tool restoreRestore, build, and run the default test suite:
cd backend
dotnet restore Spendly.sln
dotnet build Spendly.sln
dotnet test Spendly.slnReturn to the repository root and start local PostgreSQL:
cd ..
docker compose -f deploy/docker-compose.yml up -d
cd backendConfigure the API connection string from the backend directory:
dotnet user-secrets set "ConnectionStrings:SpendlyDatabase" "Host=localhost;Port=5432;Database=spendly;Username=spendly;Password=spendly_password" --project src/Spendly.Api/Spendly.Api.csprojApply the current migrations:
dotnet ef database update --project src/Spendly.Infrastructure/Spendly.Infrastructure.csproj --startup-project src/Spendly.Api/Spendly.Api.csproj --context SpendlyDbContext --connection "Host=localhost;Port=5432;Database=spendly;Username=spendly;Password=spendly_password"Run the API:
dotnet run --project src/Spendly.Api/Spendly.Api.csproj --launch-profile httpsDefault development endpoints:
GET https://localhost:7037/
GET https://localhost:7037/health/live
GET https://localhost:7037/health/ready
GET https://localhost:7037/openapi/v0.2.json
GET https://localhost:7037/docs
The API document name remains v0.2 because the persistence milestone does not
change the public HTTP feature contract.
- Backend development guide
- Documentation index
- Product delivery status
- Architecture overview
- Domain model
- Persistence architecture
- Local infrastructure
- Integration tests
Do not commit real connection strings, passwords, access tokens, private keys, certificates, or environment-specific secret files. Use .NET User Secrets for local API development and a secret manager or protected environment variables for deployed environments.