FinkiOpenDesk is a two-tier web application with a React single-page frontend and a Spring Boot REST API backend, connected to a PostgreSQL database. This page describes how those layers are structured, how authentication works, how the database schema is managed, and how the platform is deployed.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Daniel-Stojanovski/finkiopendesk/llms.txt
Use this file to discover all available pages before exploring further.
High-level overview
Frontend
The frontend is a React 19 + TypeScript application built with Vite. It uses React Router DOM v7 for client-side routing and Axios for all HTTP communication with the backend API. Styles are written in SCSS. Key routes:| Path | Component | Purpose |
|---|---|---|
/subjects | ForumSubjectCards | Browse all subjects |
/discussions | ForumDiscussionCards | Browse active discussions |
/careers or /professions | GuideProfessionCards | Browse profession roadmaps |
/subjects/pid/:pid | GuideProfessionView | View a profession’s subject roadmap |
/discussion/pid/:id | ProfessionDiscussion | Profession discussion thread |
/discussion/sid/:id | SubjectDiscussion | Subject discussion thread |
/discussion/cid/:id | ChannelDiscussion | Channel discussion thread |
/register | RegisterPage | User registration |
/register/activate | RegisterStudentPage | Student email activation |
/login | LoginPage | User login |
Backend
The backend is a Spring Boot 3.x application running on Java 21. It exposes a REST API consumed exclusively by the frontend.Controllers
| Controller | Base path | Responsibility |
|---|---|---|
AuthController | /auth/* | Registration, activation, login |
SubjectController | /api/subjects | Subject listing and data |
ChannelController | /api/channels | Channel listing and data |
CommentController | /api/comments | Comment creation and retrieval |
ProfessionController | /api/professions | Profession listing and roadmap data |
VoteController | /api/votes | Casting and reading subject-profession votes |
NotificationController | /api/notifications | Fetching and marking notifications |
UserFavoriteController | /api/favorites | Managing user favorites |
Domain models
The core data model covers:User · Subject · Profession · Channel · Comment · Vote · NotificationGroup · NotificationEvent · UserFavorite · Tag · SubjectTag · Program · ProfessionProgram · ProgramSubject
Database and migrations
FinkiOpenDesk uses PostgreSQL as its database. The schema is managed by Flyway, which applies versioned migration scripts on application startup. Migrations run in order and are never modified after they are applied. Migration history (V1_1 – V1_20):| Version | What it adds |
|---|---|
| V1_1 | Initial professions table |
| V1_2 | subjects table |
| V1_3 | discussions and base discussion structure |
| V1_4 | channels table linked to subjects |
| V1_5 | tags and subject_tags junction table |
| V1_6 | users table with roles and password hash |
| V1_7 | Student activation token column on users |
| V1_8 | comments table with parent-comment self-reference |
| V1_9 | votes table for subject-profession relevance scores |
| V1_10 | notification_groups table |
| V1_11 | notification_events linked to notification groups |
| V1_12 | user_favorites table for bookmarked subjects and professions |
| V1_13 | programs table |
| V1_14 | profession_programs junction table |
| V1_15 | program_subjects junction table |
| V1_16 | Indexes on frequently queried foreign keys |
| V1_17 | Seed data — initial set of professions |
| V1_18 | Seed data — initial set of subjects |
| V1_19 | Seed data — program definitions and program-subject mappings |
| V1_20 | Seed data — profession-program mappings and initial tags |
Authentication
FinkiOpenDesk uses two token types, both issued as JWTs signed with HMAC-SHA256: Activation token Issued on student registration. Embedded in the activation email link. The frontend sends it to/auth/activate along with the chosen password. The token is single-use and expires after a short window.
Login token (access token)
Issued on successful login at /auth/login. Returned in the response body and stored client-side. The frontend attaches it as a Bearer token in the Authorization header of every subsequent API request.
The backend is configured as an OAuth2 resource server. Incoming requests to protected endpoints are validated against the token’s signature and expiry before reaching controller logic.
Email delivery
Student activation emails are sent via SendGrid SMTP. When a student submits the registration form, the backend:- Creates the user record with an
INACTIVEstatus. - Generates a signed activation token.
- Sends an email containing the activation link to the provided address via SendGrid.
Deployment
Both the frontend and backend are packaged as Docker images and deployed on Render.| Service | URL | Notes |
|---|---|---|
| Frontend | https://finkiopendesk.onrender.com | Static React build served from a Nginx container |
| Backend | https://finkiopendesk-be.onrender.com | Spring Boot fat JAR inside a JDK container |
Render’s free tier spins down idle services after a period of inactivity. The first request after a cold start may take 30–60 seconds while the container restarts.
Further reading
Authentication details
Full explanation of student registration, email activation, and JWT token flow.
Deployment guide
Step-by-step instructions for deploying the backend on Render with Docker.
Frontend deployment
How to build and deploy the React frontend container on Render.
Environment variables
Required environment variables for both the frontend and backend services.