Verita is an AI-focused community platform where developers, researchers, and enthusiasts share and discover practical AI knowledge through intelligent curation, automated summarization, and personalized recommendations. It is built as four backend microservices (three Spring Boot, one FastAPI) behind a React frontend.
Full rationale in System Overview & Architecture and the ADRs.
The fastest way to run the full platform.
First-time setup. Create genai-service/.env from the template:
cp genai-service/.env.example genai-service/.env
The placeholder values are enough to boot. The recommended setup for testing GenAI is Logos with
openai/gpt-oss-120b, which is already the template default — add a real LOGOS_API_KEY in
genai-service/.env to enable AI summaries and daily digest generation, or point the service at a
local Ollama instead. A GNEWS_API_KEY is recommended for reliable digest source coverage, but is
not required to run the service. See
GenAI Environment Setup for the other providers
and source API keys.
Run the docker compose from the repository root:
docker compose up --build
This builds the application services plus one PostgreSQL database per service, MinIO object storage, and a local mail sink:
| Service | URL | Description |
|---|---|---|
frontend | http://localhost:3000 | React UI (served by nginx) |
user-service | http://localhost:8081 | Spring Boot — user identity & auth |
content-service | http://localhost:8082 | Spring Boot — posts, comments & topics |
recommendation-service | http://localhost:8083 | Spring Boot — feeds & notifications |
genai-service | http://localhost:8000 | FastAPI — AI summaries & daily digest |
user-db | localhost:5432 | PostgreSQL — user-service data |
content-db | localhost:5433 | PostgreSQL — content-service data |
recommendation-db | localhost:5434 | PostgreSQL — recommendation-service data |
minio | http://localhost:9000 | S3-compatible object storage (admin console: http://localhost:9001) |
mailpit | http://localhost:8025 | Local mail sink — captures password-reset mail |
Common lifecycle commands:
docker compose down # stop all services (data is kept)
docker compose down -v # stop and delete all data (DBs + object storage)
docker compose up --build user-service # start a single service only
Database and MinIO connection details and credentials live in Local Development.
A fresh stack starts empty. Once the services are healthy, seed the local databases with demo users, posts, topics, comments, bookmarks, votes, follows, and notifications:
npm install
npm run seed:local
The seed is idempotent and non-destructive; options and the full breakdown are in Local Development.
Then open http://localhost:3000, sign in as a demo account, and follow the Review Guide for a guided tour.
A Prometheus + Grafana stack can be layered on top — see the
Review Guide to bring it up, and
infra/monitoring/README.md for what is collected and the
Azure/Kubernetes variants.
Live environments:
| Environment | URL | Platform |
|---|---|---|
| Production | https://verita.stud.k8s.aet.cit.tum.de/ | Kubernetes (Rancher) |
| Development | https://dev.verita.stud.k8s.aet.cit.tum.de/ | Kubernetes (Rancher) |
| Azure VM | http://68.210.231.173/ | Docker Compose on a single VM |
Note: don't forget to type
thisisunsafewhen the browser warns about the self-signed TLS certificate on the dev environment.
See Infrastructure Design and the Helm Chart for how these are provisioned and deployed.
Authentication is always against the real backend. Seed the database (npm run seed:local)
to create the demo users, then log in at http://localhost:3000. All seed users share the
password Password123!; profiles, posts, bookmarks, and likes are populated by the seed.
| Display Name | Email (sign in with this) | Username | Role |
|---|---|---|---|
| Alex Chen | alex@example.com | alexchen | Admin |
| Sarah Kim | sarah.kim@example.com | sarahjkim | Verified |
| Marcello Rossi | marcello.rossi@example.com | marcello_r | User |
Project-wide documentation lives under docs/ — full index in
docs/README.md. Component and tooling docs live next to the code they
describe. Key entry points:
| Document | What's inside |
|---|---|
| Review Guide | Reviewer walkthrough: explore checklist, health checks, monitoring |
| Team Responsibilities | Who owned which area, derived from the pull-request history |
| Problem Statement | The problem Verita solves, target users, and epics/user stories |
| System Overview & Architecture | Services, technology decisions, data architecture, UML diagrams |
| Infrastructure Design | Infrastructure hub: environments, IaC, CI/CD, and deployments |
| API Gateway & Routing | Path-prefix routing across local, Azure, and Kubernetes |
| Database Schemas | Database-per-service model and per-service schema docs |
| Testing Strategy | Test tooling, coverage gates, and how to run tests per service |
| Local Development | Prerequisites, backend infrastructure, seed data, per-service builds |
| Git Branching Guide | Branch naming and pull-request workflow |
| Monitoring | Prometheus + Grafana stack for Compose and Kubernetes |
| Helm Chart | Kubernetes deployment via the verita umbrella chart |
Recorded against a real, seeded stack — every screen below is the running application, not a mockup. Clips are sped up to keep them short.

Sign in against the real user-service, and the guest banner gives way to a personally ranked For you feed. Read a post, then like, save, share, and comment — every count moves against the live backend.

One digest per day, the reader's own badged Personalized. It is assembled from Hugging Face, GNews, and GitHub, then written by the LLM — the clip follows a citation out to the real release page behind it.

Write in Markdown and watch it render live, KaTeX math included. Add sources and tags, publish, and the post goes straight to the AI for summarizing.

The Operations panel reads active: back from GenAI and can
switch the provider and model at runtime.
Re-summarize a real post, watch the job land COMPLETED against a live LLM, then read the summary
it just wrote — stamped with the model behind it.
HTML
45.7%
TypeScript
23.4%
Java
19.8%
CSS
4.5%
Python
4.2%
Bru
1.2%
Verita is an AI-focused community platform where developers, researchers, and enthusiasts share and discover practical AI knowledge through intelligent curation, automated summarization, and personalized recommendations. It is built as four backend microservices (three Spring Boot, one FastAPI) behind a React frontend.
Full rationale in System Overview & Architecture and the ADRs.
The fastest way to run the full platform.
First-time setup. Create genai-service/.env from the template:
cp genai-service/.env.example genai-service/.env
The placeholder values are enough to boot. The recommended setup for testing GenAI is Logos with
openai/gpt-oss-120b, which is already the template default — add a real LOGOS_API_KEY in
genai-service/.env to enable AI summaries and daily digest generation, or point the service at a
local Ollama instead. A GNEWS_API_KEY is recommended for reliable digest source coverage, but is
not required to run the service. See
GenAI Environment Setup for the other providers
and source API keys.
Run the docker compose from the repository root:
docker compose up --build
This builds the application services plus one PostgreSQL database per service, MinIO object storage, and a local mail sink:
| Service | URL | Description |
|---|---|---|
frontend | http://localhost:3000 | React UI (served by nginx) |
user-service | http://localhost:8081 | Spring Boot — user identity & auth |
content-service | http://localhost:8082 | Spring Boot — posts, comments & topics |
recommendation-service | http://localhost:8083 | Spring Boot — feeds & notifications |
genai-service | http://localhost:8000 | FastAPI — AI summaries & daily digest |
user-db | localhost:5432 | PostgreSQL — user-service data |
content-db | localhost:5433 | PostgreSQL — content-service data |
recommendation-db | localhost:5434 | PostgreSQL — recommendation-service data |
minio | http://localhost:9000 | S3-compatible object storage (admin console: http://localhost:9001) |
mailpit | http://localhost:8025 | Local mail sink — captures password-reset mail |
Common lifecycle commands:
docker compose down # stop all services (data is kept)
docker compose down -v # stop and delete all data (DBs + object storage)
docker compose up --build user-service # start a single service only
Database and MinIO connection details and credentials live in Local Development.
A fresh stack starts empty. Once the services are healthy, seed the local databases with demo users, posts, topics, comments, bookmarks, votes, follows, and notifications:
npm install
npm run seed:local
The seed is idempotent and non-destructive; options and the full breakdown are in Local Development.
Then open http://localhost:3000, sign in as a demo account, and follow the Review Guide for a guided tour.
A Prometheus + Grafana stack can be layered on top — see the
Review Guide to bring it up, and
infra/monitoring/README.md for what is collected and the
Azure/Kubernetes variants.
Live environments:
| Environment | URL | Platform |
|---|---|---|
| Production | https://verita.stud.k8s.aet.cit.tum.de/ | Kubernetes (Rancher) |
| Development | https://dev.verita.stud.k8s.aet.cit.tum.de/ | Kubernetes (Rancher) |
| Azure VM | http://68.210.231.173/ | Docker Compose on a single VM |
Note: don't forget to type
thisisunsafewhen the browser warns about the self-signed TLS certificate on the dev environment.
See Infrastructure Design and the Helm Chart for how these are provisioned and deployed.
Authentication is always against the real backend. Seed the database (npm run seed:local)
to create the demo users, then log in at http://localhost:3000. All seed users share the
password Password123!; profiles, posts, bookmarks, and likes are populated by the seed.
| Display Name | Email (sign in with this) | Username | Role |
|---|---|---|---|
| Alex Chen | alex@example.com | alexchen | Admin |
| Sarah Kim | sarah.kim@example.com | sarahjkim | Verified |
| Marcello Rossi | marcello.rossi@example.com | marcello_r | User |
Project-wide documentation lives under docs/ — full index in
docs/README.md. Component and tooling docs live next to the code they
describe. Key entry points:
| Document | What's inside |
|---|---|
| Review Guide | Reviewer walkthrough: explore checklist, health checks, monitoring |
| Team Responsibilities | Who owned which area, derived from the pull-request history |
| Problem Statement | The problem Verita solves, target users, and epics/user stories |
| System Overview & Architecture | Services, technology decisions, data architecture, UML diagrams |
| Infrastructure Design | Infrastructure hub: environments, IaC, CI/CD, and deployments |
| API Gateway & Routing | Path-prefix routing across local, Azure, and Kubernetes |
| Database Schemas | Database-per-service model and per-service schema docs |
| Testing Strategy | Test tooling, coverage gates, and how to run tests per service |
| Local Development | Prerequisites, backend infrastructure, seed data, per-service builds |
| Git Branching Guide | Branch naming and pull-request workflow |
| Monitoring | Prometheus + Grafana stack for Compose and Kubernetes |
| Helm Chart | Kubernetes deployment via the verita umbrella chart |
Recorded against a real, seeded stack — every screen below is the running application, not a mockup. Clips are sped up to keep them short.

Sign in against the real user-service, and the guest banner gives way to a personally ranked For you feed. Read a post, then like, save, share, and comment — every count moves against the live backend.

One digest per day, the reader's own badged Personalized. It is assembled from Hugging Face, GNews, and GitHub, then written by the LLM — the clip follows a citation out to the real release page behind it.

Write in Markdown and watch it render live, KaTeX math included. Add sources and tags, publish, and the post goes straight to the AI for summarizing.

The Operations panel reads active: back from GenAI and can
switch the provider and model at runtime.
Re-summarize a real post, watch the job land COMPLETED against a live LLM, then read the summary
it just wrote — stamped with the model behind it.
HTML
45.7%
TypeScript
23.4%
Java
19.8%
CSS
4.5%
Python
4.2%
Bru
1.2%