Begins the move to vertical-slice architecture. ResponseBody moves out of API.Core into Shared.Contracts so slices won't have to depend on the API host project for it. Shared.Application adds the MediatR pipeline's ValidationBehavior plus the cross-slice email commands that Features.Auth will send and Features.Emails will handle, keeping slices decoupled from each other.
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