A full-stack starter project for visualizing podcast advice quotes.
- Frontend: Next.js, TypeScript, Tailwind CSS, shadcn-style components, Recharts, ECharts, TanStack Query, Zustand
- Backend: FastAPI, uv, Polars, Pydantic
- Cache: in-memory cache by default, optional Redis
- Dataset: small CSV file stored inside the backend folder
advice-atlas/
├── apps/
│ ├── web/ # Next.js frontend
│ └── api/ # FastAPI backend
│ └── data/
│ └── podcast_advice.csv
├── data/raw/ # optional monorepo copy of raw data
├── docker-compose.yml # optional Redis
├── package.json
└── pnpm-workspace.yamlInstall pnpm and uv first.
npm install -g pnpmFor uv, use the official installer for your system, then check:
uv --versionFrom the root:
pnpm installcd apps/api
uv sync
cd ../..Create frontend env:
cp apps/web/.env.example apps/web/.env.localCreate backend env:
cp apps/api/.env.example apps/api/.envFrom the root:
pnpm devOpen:
Frontend: http://localhost:3000
Backend docs: http://localhost:8000/docsPut your real CSV here:
apps/api/data/podcast_advice.csvThen edit:
apps/api/.envExample:
DATASET_PATH=data/podcast_advice.csv
GUEST_COLUMN=Guest Experience / Expert Field
QUOTE_COLUMN=Advice to Young People
CACHE_BACKEND=memoryThe column names must exactly match your CSV headers.
For a KB-sized dataset, keep this:
CACHE_BACKEND=memoryTo test Redis later:
docker compose up -d redisThen change backend .env:
CACHE_BACKEND=redis
REDIS_URL=redis://localhost:6379/0GET /api/quotes
GET /api/analytics/overview
GET /api/analytics/themes
GET /api/analytics/tones
GET /api/analytics/experts
GET /api/analytics/keywords
GET /api/analytics/theme-expert
GET /api/analytics/treemap
GET /api/analytics/quote-map
GET /api/analytics/network
POST /api/admin/reload- Replace the sample CSV with your real dataset.
- Improve
THEME_KEYWORDSinapps/api/app/data_loader.py. - Add real embedding-based semantic search.
- Add a database only if the dataset becomes bigger.
- Add Redis only after the app is working.