Overview
Sensemaker is built as a monorepo with three main components.
Architecture
| Component | Technology | Purpose |
|---|---|---|
| Web App | React + Vite + Tailwind | User-facing frontend |
| API | NestJS + GraphQL + PostgreSQL | Backend services |
| Docs | Docusaurus | Documentation site |
Tech Stack
Frontend
- React 18 with TypeScript
- Vite for builds
- React Router for navigation
- Zustand for state management
- TanStack Query for data fetching
- Radix UI + Tailwind CSS for components
Backend
- NestJS framework with GraphQL (code-first schema)
- TypeORM with PostgreSQL (+ pgvector)
- BullMQ for background jobs (content processing, email, media)
- Redis for caching and job queues
- Passport JWT for authentication
- Claude AI (Anthropic) for summaries, tagging, and suggested highlights
- Stripe for subscription billing
Infrastructure
- API + Database + Redis: Hetzner VPS (Docker Compose, nginx-proxy + Let's Encrypt auto-SSL)
- Frontend: Render Static Site
- Docs: Render Static Site (Docusaurus)
- Email: Postmark (transactional + newsletter inbound) + Cloudflare Email Routing
- File Storage: Cloudflare R2 (PDF/EPUB documents, media cache)
- Analytics: PostHog
- DNS: Cloudflare
Monitoring
- Structured JSON logging via
nestjs-pino - Health check endpoints (
/api/health,/api/health/deep) with DB + Redis checks - Request ID tracking via
X-Request-Idheader - Docker health checks with automatic container restart