Backend
- Language: Kotlin (JVM 21)
- Framework: Spring Boot 3.x
- Build tool: Gradle (Kotlin DSL)
- Database: PostgreSQL
- ORM: Spring Data JPA
- Migrations: Liquibase
- Auth: Spring Security + JWT (jjwt 0.12.x)
- API docs: Springdoc OpenAPI
- Logging: Logbook
- Testing: JUnit 5 + H2 (in-memory; H2 1.4+ supports SQL window functions used by the activity feed dedup query — version managed via Spring Boot BOM)
- Caching: Caffeine (version managed via Spring Boot BOM; used for in-process caches such as the
projectId → tenantId + projectNamelookup inActivityEventBus)
Frontend
- Language: TypeScript
- Framework: Vue 3 (Composition API)
- Build tool: Vite
- Styling: Tailwind CSS 4
- State management: Pinia
- Routing: Vue Router
- HTTP client: Axios
- i18n: vue-i18n
- UI components: HeadlessUI · Icons: Lucide Vue Next
- Fonts: Inter (Google Fonts), JetBrains Mono (Google Fonts)
- Design tokens: CSS custom properties (warm charcoal theme)
- E2E testing: Playwright
Infrastructure
- Database: PostgreSQL via Docker Compose
- Claude Code CLI: Installed locally, used by the PM orchestrator to run dev agents
Was this page helpful?
Thanks for the feedback.