This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Learning Resources
Curated for OUR stack — every dependency in the three projects has its reference here. Found something great? Add it (this is a wiki). Found a dead link? Fix it.
How to use this page (read first)
- Project docs beat external docs. Your repo's
README.md+ARCHITECTURE.mdanswer "how do WE do it" — external links answer "how does the tool work". Read in that order. - Three kinds of links: 🎓 Learn (sit down and do it once, early) · 📖 Reference (bookmark, open when stuck) · 🎥 Watch (background learning, commutes).
- Timebox learning. 🎓 items say roughly how long they deserve. You are paid to build with 70% understanding, not to reach 100% before starting — the issues are designed for that.
- The 30-minute rule applies to being stuck on docs too. And when you ask, ask well: How do I ask a good question? — what you tried, exact error, minimal example. (Same format as our bug template. Not a coincidence.)
- French speakers: OpenClassrooms and Grafikart mirror many fundamentals in French — fine as a first pass, but the canonical docs below stay the reference.
🧰 Everyone (shared foundations)
| Resource | Why | |
|---|---|---|
| 🎓 | Learn Git Branching (2–3h, interactive) | Branching/rebasing finally clicks — do levels 1–4 + "Moving work around" |
| 🎓 | Pro Git book — ch. 2 & 3 (2h) | The mental model under our git-strategy.md |
| 📖 | Conventional Commits | Our commit format, one page |
| 📖 | Dangit, Git!? | "I did the wrong git thing" → the fix, recipe-style |
| 🎓 | MDN — HTTP overview (1h) | Methods, headers, cookies — the vocabulary of our API |
| 📖 | MDN — HTTP status codes | What 401 vs 403 vs 409 vs 422 mean (our spec uses them precisely) |
| 🎓 | JWT introduction (30min) | What's inside our access tokens; paste one in the debugger |
| 📖 | learn.openapis.org + the API's own Swagger UI (/api/v1/swagger-ui.html, springdoc) |
Reading openapi.yaml fluently — it's the contract |
| 🎓 | PostgreSQL Tutorial (pick per need) + pgexercises (practice) | SQL you'll actually meet; API dev goes deepest, everyone benefits |
| 📖 | PostgreSQL manual | The authority when the tutorial isn't enough |
☕ API dev — Java 25 · Spring Boot 4.1 · PostgreSQL
Week-1 path (in order):
- 🎓 dev.java — Learn Java (refresh selectively: records, streams, optionals — 3–4h)
- 🎓 Spring Academy — free "Building a REST API with Spring Boot" course (4–6h; the single best Spring on-ramp)
- 🎓 Spring guide: Building REST services (1h, hands-on)
- 🎓 Our starter's auth code + tests (the code-tour issue) — with the Spring Security reference open beside it
- 🎓 Baeldung — Spring Boot series (skim the index; read per need)
The shelf — one row per thing in pom.xml:
| Dependency | Reference |
|---|---|
| Spring Boot 4.1 (web, validation) | Boot reference docs · most tutorials online still show Boot 3 — for our usage they're ~identical; when something differs, check the Boot release notes/wiki |
| Spring Security + jjwt | Security reference · Baeldung Security · jjwt README |
| Spring Data JPA / Hibernate | Data JPA reference · Baeldung JPA · perf & N+1: Vlad Mihalcea |
| Flyway | Flyway docs |
| MapStruct | MapStruct reference — esp. "unmapped target policy"; our mappers live at the DTO edge |
| Lombok | Feature list — we use the boring ones (@Getter/@Builder/@RequiredArgsConstructor); ask before exotic ones |
| springdoc-openapi | springdoc.org — annotations that keep Swagger UI honest |
| Spring Data Redis | Data Redis reference · Redis docs |
| WebSocket / STOMP | Spring guide: STOMP messaging · Framework WebSocket reference |
| Mail + Thymeleaf (email templates) | Baeldung: Spring email · Thymeleaf docs |
| AWS SDK S3 (MinIO) | AWS SDK for Java v2 guide · MinIO docs (S3-compatible — same SDK, custom endpoint) |
| Testcontainers | java.testcontainers.org + Boot's @ServiceConnection support in the Boot testing docs |
| Actuator | Boot reference → Actuator chapter (health/metrics endpoints) |
When stuck on… → look here:
| Milestone problem | Resource |
|---|---|
| M1–M2 · error handling / @RestControllerAdvice | Baeldung: error handling for REST |
| M2 · pagination & filtering | Data JPA reference → Pageable/Specification · Baeldung: REST pagination |
| M3 · JPA relationships (assignments, comments, tags) | Baeldung JPA relationship articles + Vlad on @ManyToMany pitfalls |
| M4 · dates, timezones, recurrence | dev.java Date-Time trail · we store TIMESTAMPTZ + OffsetDateTime, always |
| M5 · overlap/conflict constraints | PostgreSQL exclusion constraints (EXCLUDE USING gist) — issue API-33 |
| M6 · slow queries / N+1 | Vlad Mihalcea — N+1 detection & fixes |
🎥 Background: Amigoscode (Spring Boot full courses) · Dan Vega (short, current Spring topics) · SpringDeveloper (official)
⚛️ Web dev — React 19 · TypeScript · Tailwind 4 · shadcn/ui
Week-1 path (in order):
- 🎓 react.dev — Learn (the "Describing/Adding Interactivity/Managing State" chapters — 4–6h; skip what you know)
- 🎓 TypeScript Handbook (2–3h) + 📖 React TypeScript Cheatsheet
- 🎓 TanStack Query — quick start + "Important defaults" (2h) then 📖 TkDodo's Practical React Query (the canonical deep dive — read over the first weeks)
- 🎓 Tailwind docs — core concepts (2h: utility-first, states, responsive) + how shadcn/ui components come into the repo (they're copied in, not installed — read "Introduction")
- 🎓 Our starter's
api/client.ts+AuthContextwith the README's auth-flow section
The shelf — one row per thing in package.json:
| Dependency | Reference |
|---|---|
| React 19 | react.dev — reference tab for every hook |
| React Router 7 | reactrouter.com |
| TanStack Query 5 | tanstack.com/query · TkDodo's blog |
| zustand | zustand docs — CLIENT state only; server data stays in Query (see ARCHITECTURE.md) |
| axios | axios-http.com/docs — but go through OUR api/client.ts, never raw |
| react-hook-form + zod + @hookform/resolvers | react-hook-form.com · zod.dev — schema per form, server details[] mapped to fields |
| Tailwind CSS 4 (+ tailwind-merge, tw-animate-css, prettier plugin) | tailwindcss.com/docs |
| shadcn/ui + radix-ui + cva + clsx + lucide | ui.shadcn.com · Radix primitives (a11y behavior under shadcn) · cva · lucide.dev |
| FullCalendar (react, daygrid, timegrid, list, interaction) | fullcalendar.io/docs/react — M4's workhorse |
| dnd-kit | docs.dndkit.com — task board drag & drop |
| recharts | recharts.org — M6 dashboards |
| date-fns 4 | date-fns.org — format at render time only |
| @stomp/stompjs + sockjs | stomp-js docs — live notifications; topic names come from the API dev |
| motion · sonner · input-otp · fontsource | motion.dev · sonner · input-otp · fontsource.org |
| openapi-typescript | openapi-ts.dev — npm run generate:api regenerates types from the spec; NEVER edit api.generated.ts by hand |
| vitest + Testing Library | vitest.dev · testing-library.com |
| eslint + prettier + husky + lint-staged | eslint.org · prettier.io · husky — pre-wired; format-on-save and forget |
When stuck on… → look here:
| Milestone problem | Resource |
|---|---|
| M1 · layout/CSS fundamentals under Tailwind | web.dev — Learn CSS · Josh Comeau's blog (flexbox/grid mental models) |
| M2 · complex forms & validation UX | react-hook-form docs + zod; server-error mapping pattern in ARCHITECTURE.md §4 |
| M3 · lists: filters, pagination, cache invalidation | TanStack Query docs (paginated queries) + TkDodo on query keys |
| M4 · calendar views & date math | FullCalendar react docs · date-fns |
| M4 · live notifications | stomp-js docs + the API's WebSocket topic contract (ask, don't guess) |
| M6 · charts | recharts examples gallery |
| JS fundamentals gap (closures, promises, async) | javascript.info — best JS course on the internet, free |
📱 Mobile dev — Flutter · Riverpod 3 · codegen
Week-1 path (in order):
- 🎓 Dart language docs (3–4h if Dart is new — null safety, futures/async, pattern matching)
- 🎓 Flutter docs — get started + first codelab (3h) · keep the cookbook bookmarked
- 🎓 Riverpod docs ("Getting started" → "Providers" → the annotation/codegen pages — 4h; this is our state management, learn it properly)
- 🎓 The codegen trio we use everywhere — freezed (models), json_serializable (fromJson), retrofit (API client) — (2h reading + keep
dart run build_runner watch --delete-conflicting-outputsrunning while you code) - 🎓 go_router (1–2h: routes, ShellRoute for the bottom nav, redirect for the auth guard)
The shelf — one row per group in pubspec.yaml:
| Dependency | Reference |
|---|---|
| flutter_riverpod + riverpod_annotation/generator | riverpod.dev — providers, AsyncValue, codegen syntax |
| freezed + json_annotation/serializable + build_runner | freezed · JSON serialization guide · build_runner |
| dio + retrofit + connectivity_plus | dio · retrofit · connectivity_plus |
| go_router + app_links (deep links) | go_router · Flutter deep linking · app_links |
| flutter_secure_storage + jwt_decoder + local_auth | flutter_secure_storage · jwt_decoder · local_auth (biometrics) |
| firebase_core + firebase_messaging + flutter_local_notifications | Firebase Flutter setup · FCM for Flutter · flutter_local_notifications |
| stomp_dart_client | stomp_dart_client — in-app realtime; topic names from the API dev |
| drift (+ drift_dev) + shared_preferences | drift docs (local DB) · shared_preferences |
| table_calendar · fl_chart | table_calendar (M4 agenda) · fl_chart (M6 dashboards) |
| reactive_forms · omni_datetime_picker · input pickers | reactive_forms · omni_datetime_picker · image_picker / file_picker / open_filex |
| infinite_scroll_pagination · flutter_slidable · reorderable_grid | infinite_scroll_pagination (M3 lists) · flutter_slidable · reorderable_grid |
| UI polish: google_fonts, flutter_svg, cached_network_image, shimmer, flutter_animate, toastification | their pub.dev pages — README + example tab is the doc |
| intl · dartz · dotenv · device/package_info | intl · dartz (Either for errors — copy the pattern already in the codebase) · flutter_dotenv |
| Material 3 | m3.material.io — the design language under our theme |
When stuck on… → look here:
| Milestone problem | Resource |
|---|---|
| M1 · nav shell, auth guard | go_router docs: ShellRoute + redirect |
| M1 · codegen "it won't generate" | re-run dart run build_runner build --delete-conflicting-outputs; freezed README troubleshooting |
| M2 · forms & validation | reactive_forms README (it's a full manual) |
| M3 · infinite lists + pull-to-refresh | infinite_scroll_pagination + cookbook lists |
| M4 · calendar & dates | table_calendar README · intl formatting |
| M4 · push notifications end-to-end | FCM Flutter guide — and coordinate with the API dev (device-token registration needs an API endpoint — flag it, don't invent it) |
| Any · widget testing | Flutter testing docs |
🎥 Background: Flutter official channel — the Widget of the Week playlist (2-min videos, weirdly effective) · Riverpod author's site riverpod.dev has linked talks.
House rules for this page
- Add anything that unblocked you (with one line saying when it's useful). Remove nothing without asking — someone may be mid-course.
- Paid courses: ask the PM first — many of the above cover 95% free.
- If a resource contradicts our
ARCHITECTURE.mdor agreements, the agreement wins — or open the discussion (ADR) if you think the resource is right.