A fishing catch tracking app. Log catches with species, bait, weather, and location data, then use AI analytics over your catch history to find patterns and catch more fish.
- Dashboard — totals, personal bests by species, best spot, recent catches, and a saved-spots map at a glance
- Catch logging — species, bait, and spot pickers; location comes from the device via the browser Geolocation API, and the weather at that moment (air temp, wind, pressure, sky) is auto-filled from Open-Meteo
- AI Insights — Claude analyzes the full catch log and writes personalized best time of day, best bait, and best conditions breakdowns plus a summary
- History - searchable catch history
- Spots and Map — save and edit custom spots, and an interactive Leaflet map
Backend: .NET 10, ASP.NET Core Web API, EF Core 10, SQL Server, ASP.NET Identity + JWT, Swashbuckle, Anthropic C# SDK
Frontend: React 19, TypeScript, Vite 8, Tailwind 4, React Router 7, React Leaflet, NSwag
External services: Open-Meteo (weather at catch time), Claude (insight generation), OpenStreetMap tiles, browser Geolocation API
Tooling: GitHub Actions CI
| Layer | Responsibility |
|---|---|
| Controller | HTTP only: routing, model binding, status codes |
| Manager | Business rules, validation, orchestration across accessors |
| Engine | Reusable logic with no storage concerns (TokenEngine signs JWTs) |
| Accessor | EF Core data access |
Each layer sits behind an interface in DI.
The backend's OpenAPI document is fed to NSwag, which generates src/api/generated.ts: one typed client
per controller, with types matching the C# DTOs.
Regenerate after changing a controller or DTO, with the backend running:
cd frontend && npm run generate-apiRequires the .NET 10 SDK, Node 22+, and Docker.
1. Start SQL Server
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=CatchIQ_Dev1!" \
-p 1434:1433 --name catchiq-mssql \
-d mcr.microsoft.com/mssql/server:2022-latestLater runs: docker start catchiq-mssql.
2. Create backend/appsettings.Development.json (gitignored; appsettings.json holds placeholders):
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1434;Database=catchiq-mssql;User Id=sa;Password=CatchIQ_Dev1!;TrustServerCertificate=True;"
},
"Jwt": {
"Secret": "replace-with-a-long-random-signing-key",
"Issuer": "CatchIQ",
"Audience": "CatchIQUsers"
}
}3. Set the Anthropic API key (optional — everything but Insights works without it):
cd backend && dotnet user-secrets set "Anthropic:ApiKey" "your-api-key"4. Apply migrations:
cd backend && dotnet ef database update5. Set up the frontend env (also gitignored; without it every API call hits the wrong URL):
cd frontend && cp .env.example .env6. Run both:
cd backend && dotnet run --launch-profile http # http://localhost:5045
cd frontend && npm install && npm run dev # http://localhost:5173.github/workflows/ci.yml builds both halves on every push and PR to main: dotnet build -c Release
against CatchIQ.slnx, and npm ci → lint → npm run build (which typechecks, unlike the dev server).
Client generation is excluded, since NSwag needs a running backend.

