-
Notifications
You must be signed in to change notification settings - Fork 0
Project Retrospective
Genipe (Cross-Generational Recipe & Food Heritage Platform) is a collaborative web and mobile platform for preserving culinary traditions. Users can document family recipes, share cultural stories tied to meals, and connect across generations through food heritage.
This retrospective covers the MVP period (Milestones 1–3), delivered on April 7, 2026. The MVP included user authentication, recipe and story CRUD, search and filtering, ingredient/unit management, and full deployment across all three client surfaces (web, mobile, backend API) at genipe.app.
For project status, deliverables, and requirements coverage, see the D6 Milestone Review.
This retrospective was compiled asynchronously from five input sources:
- D6 Milestone Review — project status, deliverables, testing, team process evaluation
- D7 Individual Contributions — per-member self-assessments
- Responsibility Assignment Matrix (RAM) — issue/PR assignee, reviewer, and informed data
- Instructor demo feedback — live feedback received during the MVP demo session
- Team meetings after demo session and during Lab 8 - meetings where the situation is assessed, and individual feedback is discussed.
Each item is evaluated along the three dimensions required by the course: activities, decisions, and managerial practices, and classified as either positive (Went Well) or negative/unexpected (Went Badly / Unexpected), along with its impact on the project development lifecycle.
Milestone decomposition into tracked issues
Issues #140, #142, and
#167 converted each milestone into concrete, assignable GitHub issues with clear ownership. This positively impacted the lifecycle by providing
end-to-end traceability from requirement to PR.
Demo rehearsal caught pre-demo bugs
Issue #173 (MVP Demo Preparation & Rehearsal) identified 6+ frontend bugs before the live demo, including the critical author-ID type mismatch
(#322). This positively impacted the lifecycle by preventing visible failures during the instructor demo.
Database seeding via migrations
PRs #283 and #292 seeded 31 world cuisine regions, and approved ingredient/unit sets via
data migrations. This positively impacted the lifecycle by enabling a fully functional demo with realistic content.
Independent mobile development reached feature parity with web
The mobile team (Mustafa Ocak, Mustafa Çağan İslam) built and shipped full feature parity with the web client across all three milestones independently, with 39 merged PRs. This positively impacted the
lifecycle by ensuring all three client surfaces were demo-ready simultaneously.
Backend test coverage
76 test methods across 4 modules (users: 27, recipes: 21, stories: 17, search: 11) were written and run in CI on every PR. This positively impacted the lifecycle by keeping the API stable throughout the
sprint and catching permission/validation edge cases early.
Monorepo structure
Choosing a single repository with app/backend, app/frontend, and app/mobile directories positively impacted the lifecycle by simplifying cross-team issue linking, shared CI configuration, and a single
source of truth for all three surfaces.
DRF + JWT + PostgreSQL stack
The backend technology choice (Django REST Framework, djangorestframework-simplejwt, PostgreSQL) was stable throughout the MVP. Zero backend authentication bugs were reported in production, which
positively impacted the lifecycle by eliminating a common source of integration failures.
React (Vite) + React Native (Expo)
Sharing the same paradigm (React) between web and mobile enabled a shared mental model and rapid knowledge transfer between subgroups, positively impacting the lifecycle by reducing ramp-up time when
members moved between client surfaces.
Full deployment before demo
Deciding to deploy all three surfaces (Vultr VPS + Vercel + EAS, Nginx + SSL at genipe.app) before the demo — rather than demoing locally — positively impacted the lifecycle by validating the complete
production environment and eliminating "works on my machine" scenarios.
Explicit Responsibility Assignment Matrix
The RAM (#266, #197) documented assignee, reviewer, and informed parties for every
issue and PR. This positively impacted the lifecycle by making ownership unambiguous and enabling structured code review.
Backend/frontend subgroup split
Dividing the team into a backend subgroup (Ahmet Akdağ, Uygar Apan, Ahmet Ayberk Durak, Emirhan Şimşek, Ufuk Altunbulak) and a frontend/mobile subgroup (Eren Can Özkaya, Mustafa Ocak, Mustafa Çağan İslam,
Dağlar Tekşen) enabled parallel progress across all three milestones, positively impacting the lifecycle by preventing bottlenecks.
Final-sprint bug triage
11+ bugs were identified and fixed in a two-day sprint immediately before the demo. Ahmet Akdağ systematically tracked these as issues, and Mustafa Çağan İslam, Eren Can Özkaya, and Mustafa Ocak resolved
them. This positively impacted the lifecycle by converting a potentially failed demo into a stable delivery.
Frontend-backend contract not defined early
The frontend was built against assumed payload shapes rather than a shared contract with the backend. This produced avoidable payload format mismatches
(#279, #282, #277) that
surfaced only in the final integration sprint. This negatively impacted the lifecycle by compressing bug-fix time and introducing risk immediately before the demo.
Integration testing delayed until demo week
Backend and frontend were tested in isolation (backend via APITestCase, frontend via mocked API calls) throughout the MVP. Cross-layer integration was not validated until demo rehearsal. This negatively
impacted the lifecycle by concentrating risk at the worst possible moment.
No automated mobile test suite
The mobile app (React Native) shipped with manual testing only — no Jest or React Native Testing Library tests. This negatively impacted the lifecycle by leaving regression risk undetected across 39 merged
PRs.
Mobile connected to production API only in the last week
PR #303 connected the mobile app to the production API in the final week before demo. All prior mobile development was tested against local/mock
data. This negatively impacted the lifecycle by delaying the discovery of mobile-specific integration issues.
Recipe-first product framing
The platform was designed and built with recipes as the primary content type. The instructor's demo feedback identified this as the most significant strategic misalignment of the MVP: the platform's
identity should be built around cultural heritage and traditions, with recipes serving as one medium among many. This framing decision was made in M1 planning and shaped all subsequent UI/UX, data
models, and navigation. It negatively impacted the lifecycle by requiring a fundamental redesign of the home page, data model, and discovery system for M4–M6.
Narrow target audience assumption
The UI/UX was implicitly designed around elderly content creators. The instructor's feedback highlighted that the platform should appeal to all ages and cultural backgrounds on both the creator and consumer
sides. This negatively impacted the lifecycle by narrowing design choices that now need revisiting.
No shared API schema artifact
The team did not produce an OpenAPI schema or shared type definitions before parallel implementation began. Each subgroup made independent assumptions about payload structure. This negatively impacted the
lifecycle by making payload mismatches inevitable and undetectable until runtime.
Product vision not validated after Milestone 1 The team did not seek an instructor check-in on product direction after completing the first milestone. The vision misalignment was only discovered at the final MVP demo. This negatively impacted the lifecycle by allowing seven weeks of implementation to proceed in a direction that required fundamental course correction.
Cross-team sync was ad hoc, not scheduled
Backend and frontend subgroups communicated on-demand rather than on a fixed cadence. This negatively impacted the lifecycle by allowing payload assumptions to diverge silently and reducing the team's
shared understanding of integration state.
Reviewer load was unevenly distributed
RAM analysis shows that the top 3 reviewers (Mustafa Çağan İslam, Eren Can Özkaya, Dağlar Tekşen) handled approximately 77% of all PR reviews in the MVP phase. This negatively impacted the lifecycle by
creating review bottlenecks and reducing cross-subgroup knowledge transfer.
Instructor reframed the product vision at the demo
The instructor's feedback at the MVP demo was a fundamental reframing: cultural events and traditions should be the entry point, not recipes. This was unexpected in its scope — not a feature request, but a
directional pivot that affects the home page, data model, and search system.
Author-ID type mismatch bug caught at rehearsal
Issue #322: the story edit authorization check compared an integer user ID (from the JWT) against a string (from the API response), silently
failing the ownership guard. This was caught during demo rehearsal and fixed before the live demo. It was an unexpected class of bug — correct logic, wrong types — made possible by the absence of shared
type contracts.
Mobile team reached feature parity faster than expected (positive)
The mobile team independently shipped full feature parity with the web frontend across all three milestones, including a CI pipeline for APK generation (PR
#256). This unexpectedly and positively affected the lifecycle by giving the team a fully functional third surface at demo time with no additional
coordination cost.
| Metric | Value |
|---|---|
| MVP deliverables completed | 11 / 11 |
| Backend endpoints | 20+ |
| Backend test methods | 76 (4 modules) |
| Frontend test cases | 182 (24 files) |
| Mobile automated tests | 0 |
| Bugs fixed in final 2-day sprint | 11+ |
| Open bugs at demo | 1 (#322, fixed post-demo) |
| Merged PRs (MVP phase) | 100+ |
| Member | Role | Notable PRs | Key Issues |
|---|---|---|---|
| Ahmet Akdağ | Backend + DevOps | #268 #269 #271 #283 #287 | #148 #156 #195 |
| Eren Can Özkaya | Frontend Web | #200 #201 #228 #288 | #194 #152 #170 |
| Mustafa Ocak | Mobile + DevOps | #199 #236 #256 #303 | #192 #158 #170 |
| Mustafa Çağan İslam | Frontend Web + Integration | #284 #285 #286 #292 | #279 #282 #276 |
| Dağlar Tekşen | Frontend Web | #257 #258 #259 #261 | #152 #175 |
| Ufuk Altunbulak | Backend | — | #149 #156 #169 |
| Ahmet Ayberk Durak | Backend | #270 #272 | #143 #144 #161 |
| Emirhan Şimşek | Backend + DevOps | — | #178 #180 #157 |
| Uygar Apan | Backend | #233 #235 #242 #249 #250 | #149 #151 #157 |
- Reviewer concentration: The top 3 reviewers (Mustafa Çağan İslam, Eren Can Özkaya, Dağlar Tekşen) accounted for approximately 77% of all PR reviews in the MVP phase.
- Cross-subgroup review: Backend PRs were reviewed only within the backend subgroup, and frontend/mobile PRs only within the frontend/mobile subgroup. Cross-subgroup review was minimal, representing a missed knowledge-sharing opportunity.
- Highest commit volume: Eren Can Özkaya (106 commits), Mustafa Ocak (39 merged PRs).
-
Went well: Delivered the entire backend infrastructure — API, deployment (Vultr, Nginx, SSL, genipe.app), CI/CD (PR #287), media storage (PR
#269), and database seeding (PR #283) — enabling all three clients to demo against a stable production environment. - Went badly: Acting as the integration bridge between frontend and backend (tracking 11+ bugs during integration testing) revealed that earlier cross-team contract alignment would have prevented most of these issues.
- Personal takeaway: For M4–M6, publish an OpenAPI schema before frontend implementation begins, and run integration checks weekly rather than only in the final sprint.
-
Went well: Delivered the full web frontend across M1–M3 (PRs #200, #201,
#228, #288) with 182 frontend tests and rapid triage of integration bugs (#304, #316, #323). - Went badly: The frontend was built against assumed payload shapes rather than a contract with the backend, producing avoidable bugs (#279, #282, #277) in the final sprint.
- Personal takeaway: For M4–M6, define API contracts collaboratively before frontend implementation and add integration tests between layers.
-
Went well: Delivered full feature parity with the web frontend independently across all three milestones (39 merged PRs), including CI for APK builds (PR
#256) — an outcome that exceeded expectations. -
Went badly: Connecting the mobile app to production only in the last week (PR #303) compressed the window for finding mobile-specific
integration issues. - Personal takeaway: For M4–M6, connect mobile to the production API from the beginning of each milestone, and add an automated test suite to protect the feature surface built in M1–M3.
-
Went well: Played a critical stabilization role in the final sprint — fixed recipe creation (#284), search display
(#285), story author name (#286), and seeded the ingredient/unit database (#292) without which the demo would have been non-functional. - Went badly: Most of the bugs fixed in the final sprint were consequences of assumptions made weeks earlier without cross-team verification.
- Personal takeaway: For M4–M6, run a shared integration checklist against the production API at the end of each milestone, not only before the demo.
- Went well: Delivered the mock data layer (PR #261) that unblocked frontend development while the backend was not yet ready, and fixed session persistence on page refresh (PR #257) — a core UX issue.
- Went badly: The mock data layer, while useful for development, implicitly encouraged building against assumed payload shapes that diverged from actual API responses.
- Personal takeaway: For M4–M6, wire mock data to a shared contract (e.g., OpenAPI) so that mock and production payloads stay synchronized.
- Went well: Contributed to all core backend features (auth, recipes, stories, search) consistently across the three milestones as part of a reliable backend subgroup.
- Went badly: Backend contributions were not visible as standalone PRs, reducing the traceability of individual impact in the RAM.
- Personal takeaway: For M4–M6, open focused PRs per feature to improve traceability and enable more granular code review feedback.
-
Went well: Delivered the lookup APIs (PR #270) and custom submission API (PR #272)
that enabled frontend dropdowns — a dependency that would have blocked recipe creation without timely delivery. - Went badly: The lookup API design was not communicated to the frontend as a contract, requiring the frontend to discover the payload format through trial and error.
- Personal takeaway: For M4–M6, document every new API endpoint in a shared format immediately upon implementation.
-
Went well: Published the backend development plan wiki page and set up the test database seed script (#178), establishing development
infrastructure that the whole backend subgroup relied on. - Went badly: Created the RAM template (#197) but reviewer load was not actively monitored or balanced throughout the MVP.
- Personal takeaway: For M4–M6, use the RAM not only as a record but as an active tool for balancing workload and reviewer assignments at the start of each milestone.
-
Went well: Delivered the authentication foundation — Django project initialization (PR #233), auth API endpoints (PR
#235), and endpoint protection middleware (PR #249) — which all subsequent backend and frontend features depended on. - Went badly: JWT middleware was implemented without logging, making it difficult to diagnose authentication failures during integration testing.
- Personal takeaway: For M4–M6, add structured logging to all security-critical middleware from day one to accelerate integration debugging.
-
Validate product vision with stakeholders after every milestone, not only at the demo. The most expensive surprise in M1–M3 was a vision misalignment that seven weeks of implementation made harder to correct. A structured check-in after M1 would have surfaced this at a fraction of the cost.
-
Define cross-layer contracts (API schema) as a first-class artifact before parallel implementation begins. Three payload-mismatch bugs
(#279, #282, #277) were not bugs in logic — they were the predictable result of two teams making independent assumptions about the same interface. -
Integration testing must begin when two layers are both "ready enough," not at demo week. Compressed integration windows create regressions, raise stress, and reduce demo quality. Integration should be a continuous activity, not a phase.
-
Automated testing should cover all client surfaces from the beginning. The mobile app shipped 39 PRs with zero automated tests. Feature parity without test coverage is a hidden risk that compounds
with each milestone. -
Connect all clients to the production API from the start of each milestone. Developing mobile against mock or local data while the backend is live creates a false sense of completion and delays real integration feedback.
-
The RAM is descriptive by default — reviewer load must be actively managed. Recording ownership is not enough; reviewer assignments should be checked and balanced at the start of each milestone to
prevent concentration and improve cross-subgroup knowledge sharing. -
Independent subgroup progress is valuable but requires scheduled sync points. The backend and frontend subgroups both made strong individual progress. The gaps appeared at the boundaries — where
payload shapes, field names, and data types were assumed rather than agreed.
| # | Action | Owner | Due | Success Criterion |
|---|---|---|---|---|
| A1 | Redesign home page around cultural events, not recipe listings | Frontend Web + Mobile | M4 | Home page surfaces events/stories as primary entry point |
| A2 | Introduce CulturalEvent model linking recipes & stories |
Backend | M4 | Migration merged; API endpoints live |
| A3 | Publish OpenAPI schema; frontends consume agreed payload types | Backend + all frontends | M4 (early) | Zero payload-mismatch bugs in M4 |
| A4 | Add automated mobile tests (Jest + React Native Testing Library) | Mobile | M4 | ≥30 tests; CI runs on PR |
| A5 | Connect mobile to production API from day one of each milestone | Mobile | M4+ | No mock-only development windows |
| A6 | Weekly backend↔frontend cross-subgroup sync (30 min) | All | M4+ | Meeting notes published in wiki |
| A7 | Instructor vision check-in at end of each milestone | Team (Mustafa Ocak) | M4, M5, M6 | Written confirmation in wiki |
| A8 | Expand filtering system: life events, religious occasions, seasonal | Backend + Frontend | M5 | Filter taxonomy documented and implemented |
| A9 | Broaden UI/UX for all age groups | Web + Mobile | M5 | Design review wiki page published |
| A10 | Rebalance PR reviewer assignments via updated RAM | All | M4 start | No single reviewer handles >30% of PRs in a milestone |
Each action item above will be opened as a GitHub issue and linked to this page.
🏠 Home
👤 Team Members
- Meeting #1 Report | 11.02.2026
- Meeting #2 Report | 18.02.2026
- Meeting #3 Report | 25.02.2026
- Meeting #4 Report | 05.03.2026
- Meeting #5 Report | 12.03.2026
- Meeting for the Team Structure and Milestone Roadmap | 15.03.2026
- Meeting for the Design and Implementation | 05.03.2026
- Meeting for the Team MVP planning | 26.03.2026
- Meeting with Customer Report | 18.02.2026
- Use Case Meeting Report | 28.02.2026
- Meeting with Customer after Demo Report | 15.04.2026
- Planing for Final Milestone Meeting Report | 16.04.2026
- Milestone 4-5-6 Planning Meeting | 30.04.2025
- Shareholder Meeting #1
- Shareholder Meeting #2
- Shareholder Meeting #3
- All Meeting Notes
🛠️ Milestone Roadmap
- Milestone Roadmap
- Milestone Roadmap v2
- MVP Milestone - Tasks
- Final Milestone Deliverables
- Final Milestone - Tasks
- Milestone Definitions M4-M9
- Executive Summary for Final Milestone
- Progress Based on Teamwork
- Individual Contributions
- Test and Coverage Strategy
- M7-Test-and-Coverage-Report
- Test-and-Coverage-Strategy-v2
- MVP Demo Plan
- MVP Report
- RAM vm
- Milestone Review
- Final Demo Plan
- Final Milestone - Sprint Plan