Auth and Emails land together since Auth's registration/resend flows need Emails to exist first. Service.Auth's four services (Register, Login, Confirmation, Token) collapse into MediatR commands/queries in Features.Auth; TokenService stays as a slice-internal service since multiple handlers call it. Auth no longer references Emails directly — it sends SendRegistrationEmailCommand/SendResendConfirmationEmailCommand (defined in Shared.Application) which Features.Emails handles, so neither slice has a project reference on the other. Service.Emails' IEmailService becomes Features.Emails' IEmailDispatcher, simplified to take (firstName, email, token) instead of a full UserAccount since that's all it ever used. API.Specs' TestApiFactory/MockEmailService are updated to swap in the relocated interface. Also deletes Infrastructure.Repository now that Breweries, UserManagement, and Auth have all moved their repos out of it, and replaces the two now-dead docker-compose test services (repository.tests, service.auth.tests, both pointing at deleted Dockerfiles) with a single unit.tests service that runs every Features.*.Tests project via Dockerfile.tests.
The Biergarten App
The Biergarten App is a full-stack directory and discovery platform for breweries. It features a robust user authentication system, a searchable database of brewery locations, and a custom offline data-generation pipeline that uses LLMs (Llama.cpp) and Wikipedia to synthesize realistic seed data.
It features:
- A .NET backend (Web API + database migrations/seed) under
web/backend/ - A server-rendered React website (React Router + Vite) under
web/frontend/ - A C++20 “pipeline” CLI for generating seed data under
tooling/pipeline/
Specialized documentation (setup, architecture, docker, testing, diagrams, and
pipeline notes) lives under docs/.
Documentation (Start Here)
Website + backend (active stack):
Data generation pipeline (C++):
Diagrams
Current Status
Active areas in the repository:
- .NET 10 backend (layered architecture) + SQL Server
- React 19 website (React Router 7 + Vite)
- Shared Biergarten theme system + Storybook coverage
- Auth flows and account/email integration (local Mailpit in dev compose)
- Data generation pipeline with C++ and Llama.cpp
Archived/reference areas:
archive/next-js-web-app/contains an older Next.js frontend retained for reference
Tech Stack
- Backend: .NET 10, ASP.NET Core, SQL Server 2022, DbUp
- Frontend: React 19, React Router 7, Vite 7, Tailwind CSS 4, DaisyUI 5
- UI Documentation: Storybook 10, Vitest browser mode, Playwright
- Testing: xUnit, Reqnroll (BDD), FluentAssertions, Moq
- Infrastructure: Docker, Docker Compose
- Security: Argon2id password hashing, JWT access/refresh/confirmation tokens
- Data Pipeline: C++20, CMake, Boost, libcurl, SQLite, llama.cpp
Quick Start
For full setup details, use Getting Started. This section is the shortest path to a working dev environment.
Backend (Docker)
git clone https://github.com/aaronpo97/the-biergarten-app
cd the-biergarten-app
cp web/.env.example web/.env.dev
docker compose --env-file web/.env.dev -f web/docker-compose.dev.yaml up --build -d
Backend access:
- API Swagger: http://localhost:8080/swagger
- Health Check: http://localhost:8080/health
- Mailpit UI (dev SMTP): http://localhost:8025
Frontend (Node)
cd web/frontend
npm install
API_BASE_URL=http://localhost:8080 SESSION_SECRET=dev-secret-change-me npm run dev
Optional frontend tools:
cd web/frontend
npm run storybook
npm run test:storybook
npm run test:storybook:playwright
Repository Structure
web/
backend/ .NET API + domain/service/infrastructure + DB projects
frontend/ React Router website + Storybook + Playwright/Vitest
tooling/
pipeline/ C++20 seed-data generation CLI (CMake)
docs/
architecture.md High-level architecture overview
website/ Backend/frontend setup, docker, testing, diagrams
pipeline/ Pipeline docs, ethics notes, PlantUML diagrams
archive/
next-js-web-app/ Older Next.js frontend (reference only)
Testing
Run the backend test stack with Docker:
docker compose --env-file web/.env.test -f web/docker-compose.test.yaml up --abort-on-container-exit
See Testing for the full command list.
Configuration
Common active variables:
- Backend/Docker:
DB_SERVER,DB_NAME,DB_USER,DB_PASSWORD,ACCESS_TOKEN_SECRET,REFRESH_TOKEN_SECRET,CONFIRMATION_TOKEN_SECRET,WEBSITE_BASE_URL - Frontend runtime:
API_BASE_URL,SESSION_SECRET,NODE_ENV
See Environment Variables for details.
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request