Milestones
List view
Description only; sliced when a spring group picks it up. Let students list skills on their profile, with length limits and moderation like other profile text. Design: Skills on the [Edit Profile wireframe](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=34-7052).
No due dateDescription only; sliced when a spring group picks it up. A row of study groups the student recently joined or viewed, for quick return. Design: Recent Groups on the [Home wireframe](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=60-1089).
No due dateDescription only; sliced when a spring group picks it up. A month calendar on Home marking the days of the student's joined study groups, with that day's list below. This semester ships the plain joined list (#111). Design: Calendar View on the [Home wireframe](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=60-1089).
No due dateDescription only; sliced when a spring group picks it up. Search the Discover feed by study group, subject or date, with a Filter control, beyond this semester's enrolled-courses-only feed. Design: the search box and Filter button on the [Home wireframe](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=60-1089).
No due dateDescription only; sliced when a spring group picks it up. Keep the last-seen feed and the student's sessions available without a connection.
No due dateDescription only; sliced when a spring group picks it up. Enroll by CRN instead of course code, with the add/drop deadline taken per part of term.
No due dateDescription only; sliced when a spring group picks it up. Suggest session times from the overlap of students' free time, shared with DogDays' class plans.
No due dateDescription only; sliced when a spring group picks it up. Upload and show a profile photo, with storage rules and moderation. Design: the photo circle on the [Onboarding](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=7-241), [Profile](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=30-6889) and [Edit Profile](https://www.figma.com/design/n3BXyw1DFlfkRq1ootcZbw/DogPack?node-id=34-7052) wireframes.
No due dateDescription only; sliced when a spring group picks it up. Supabase Realtime for the discover feed and a session's member list, replacing pull-to-refresh.
No due dateDescription only; sliced when a spring group picks it up. A chat thread per session for the people who joined it.
No due dateDescription only; sliced when a spring group picks it up. Push reminders before a session starts: FCM through an Edge Function scheduled with pg_cron.
No due dateStretch goal this semester, likely spring. Store listings, TestFlight and Google Play, and store-grade account deletion. Gated on the store accounts (D-U-N-S request, then Apple and Play organization accounts), which are an officer task.
No due dateRolling. Branded sign-in, loading and error states, accessibility, empty states and copy. Keep at least three open issues here: this is the pool of good first issues for new contributors. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#2 — Sign In button copy only](https://github.com/DevDogsUGA/DogPack/issues/2) | None | | [#41 — Check branded sign-in layout on a small screen](https://github.com/DevDogsUGA/DogPack/issues/41) | [#2](https://github.com/DevDogsUGA/DogPack/issues/2) | | [#3 — Spinner during launch call only](https://github.com/DevDogsUGA/DogPack/issues/3) | None | | [#42 — Handle returning from sign-in without a session](https://github.com/DevDogsUGA/DogPack/issues/42) | [#3](https://github.com/DevDogsUGA/DogPack/issues/3) | | [#4 — Retry observable launch failure only](https://github.com/DevDogsUGA/DogPack/issues/4) | None | | [#43 — Map observable network and unknown sign-in failures](https://github.com/DevDogsUGA/DogPack/issues/43) | [#4](https://github.com/DevDogsUGA/DogPack/issues/4) | | [#44 — Connect verified cancelled/denied auth outcomes](https://github.com/DevDogsUGA/DogPack/issues/44) | [#43](https://github.com/DevDogsUGA/DogPack/issues/43), [#36](https://github.com/DevDogsUGA/DogPack/issues/36) | | [#5 — Define an injectable connectivity stream](https://github.com/DevDogsUGA/DogPack/issues/5) | None | | [#45 — Adapt the chosen connectivity plugin](https://github.com/DevDogsUGA/DogPack/issues/45) | [#5](https://github.com/DevDogsUGA/DogPack/issues/5), [#38](https://github.com/DevDogsUGA/DogPack/issues/38) | | [#46 — Bind offline banner to connectivity state](https://github.com/DevDogsUGA/DogPack/issues/46) | [#45](https://github.com/DevDogsUGA/DogPack/issues/45) | | [#6 — Generate Android launcher resources from supplied artwork](https://github.com/DevDogsUGA/DogPack/issues/6) | [#37](https://github.com/DevDogsUGA/DogPack/issues/37) | | [#47 — Generate iOS launcher resources from supplied artwork](https://github.com/DevDogsUGA/DogPack/issues/47) | [#6](https://github.com/DevDogsUGA/DogPack/issues/6) | | [#48 — Generate native Android splash resources](https://github.com/DevDogsUGA/DogPack/issues/48) | [#47](https://github.com/DevDogsUGA/DogPack/issues/47), [#37](https://github.com/DevDogsUGA/DogPack/issues/37) | | [#49 — Generate native iOS splash resources](https://github.com/DevDogsUGA/DogPack/issues/49) | [#48](https://github.com/DevDogsUGA/DogPack/issues/48) | | [#18 — Suppress duplicate brand announcement](https://github.com/DevDogsUGA/DogPack/issues/18) | None | | [#19 — Announce retry-screen failure](https://github.com/DevDogsUGA/DogPack/issues/19) | None | | [#20 — Readable config-screen heading](https://github.com/DevDogsUGA/DogPack/issues/20) | None | | [#21 — Scroll the onboarding privacy notice](https://github.com/DevDogsUGA/DogPack/issues/21) | None | | [#36 — Record observable OAuth cancellation/denial outcomes](https://github.com/DevDogsUGA/DogPack/issues/36) | Officer evidence required | | [#37 — Record native branding inputs and generator configuration](https://github.com/DevDogsUGA/DogPack/issues/37) | Officer evidence required | | [#38 — Record the approved connectivity adapter contract](https://github.com/DevDogsUGA/DogPack/issues/38) | Officer evidence required |
No due date•0/21 issues closedFeature-frozen (Demo Day, Nov 18, is the feature freeze; bug fixes only after). Ends with a runbook and a paired handoff with the spring DogPack lead and the DevOps/Platform officer. The runbook covers the production project, the database workflows, App Distribution, the OAuth client, the moderation integration and enrollment term rollover. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#125 — Record onboarding/profile acceptance](https://github.com/DevDogsUGA/DogPack/issues/125) | [#70](https://github.com/DevDogsUGA/DogPack/issues/70), [#75](https://github.com/DevDogsUGA/DogPack/issues/75), [#77](https://github.com/DevDogsUGA/DogPack/issues/77), [#79](https://github.com/DevDogsUGA/DogPack/issues/79), [#81](https://github.com/DevDogsUGA/DogPack/issues/81), [#89](https://github.com/DevDogsUGA/DogPack/issues/89), [#95](https://github.com/DevDogsUGA/DogPack/issues/95), [#97](https://github.com/DevDogsUGA/DogPack/issues/97), [#111](https://github.com/DevDogsUGA/DogPack/issues/111), [#124](https://github.com/DevDogsUGA/DogPack/issues/124) | | [#126 — Record session/discovery acceptance](https://github.com/DevDogsUGA/DogPack/issues/126) | [#125](https://github.com/DevDogsUGA/DogPack/issues/125) | | [#127 — Record report/block acceptance](https://github.com/DevDogsUGA/DogPack/issues/127) | [#126](https://github.com/DevDogsUGA/DogPack/issues/126) | | [#128 — Write the database and term-rollover procedure](https://github.com/DevDogsUGA/DogPack/issues/128) | [#40](https://github.com/DevDogsUGA/DogPack/issues/40) | | [#129 — Write OAuth and distribution runbook links](https://github.com/DevDogsUGA/DogPack/issues/129) | [#128](https://github.com/DevDogsUGA/DogPack/issues/128) | | [#130 — Write moderation deployment/rollback procedure](https://github.com/DevDogsUGA/DogPack/issues/130) | [#129](https://github.com/DevDogsUGA/DogPack/issues/129) | | [#131 — Index the spring product handoff](https://github.com/DevDogsUGA/DogPack/issues/131) | [#127](https://github.com/DevDogsUGA/DogPack/issues/127), [#130](https://github.com/DevDogsUGA/DogPack/issues/130) | | [#132 — Record the paired handoff review](https://github.com/DevDogsUGA/DogPack/issues/132) | [#131](https://github.com/DevDogsUGA/DogPack/issues/131) | | [#40 — Record verified DogPack operations commands](https://github.com/DevDogsUGA/DogPack/issues/40) | Officer evidence required |
Due by December 2, 2026•0/9 issues closedThe Report & Block interface on sessions and profiles, against the platform moderation API. The backend (the moderation receiver, apply_event, quarantine columns with RLS, and bans) is built and tested by officers; this milestone is the UI that files a report, blocks a person, and shows quarantined content correctly. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#34 — Send reports through DogPack report function](https://github.com/DevDogsUGA/DogPack/issues/34) | None | | [#112 — Map report response/error outcomes](https://github.com/DevDogsUGA/DogPack/issues/112) | [#34](https://github.com/DevDogsUGA/DogPack/issues/34) | | [#113 — Render report reason and description fields](https://github.com/DevDogsUGA/DogPack/issues/113) | [#112](https://github.com/DevDogsUGA/DogPack/issues/112) | | [#114 — Bind report form submission outcomes](https://github.com/DevDogsUGA/DogPack/issues/114) | [#113](https://github.com/DevDogsUGA/DogPack/issues/113) | | [#35 — Insert a caller-owned block](https://github.com/DevDogsUGA/DogPack/issues/35) | None | | [#115 — Delete a caller-owned block](https://github.com/DevDogsUGA/DogPack/issues/115) | [#35](https://github.com/DevDogsUGA/DogPack/issues/35) | | [#116 — Render authorized host profile detail](https://github.com/DevDogsUGA/DogPack/issues/116) | [#108](https://github.com/DevDogsUGA/DogPack/issues/108), [#26](https://github.com/DevDogsUGA/DogPack/issues/26) | | [#117 — Open session/profile reporting actions](https://github.com/DevDogsUGA/DogPack/issues/117) | [#114](https://github.com/DevDogsUGA/DogPack/issues/114), [#115](https://github.com/DevDogsUGA/DogPack/issues/115), [#116](https://github.com/DevDogsUGA/DogPack/issues/116), [#110](https://github.com/DevDogsUGA/DogPack/issues/110) | | [#118 — Confirm block and invalidate visibility](https://github.com/DevDogsUGA/DogPack/issues/118) | [#117](https://github.com/DevDogsUGA/DogPack/issues/117) | | [#119 — Render own block list with safe identity fallback](https://github.com/DevDogsUGA/DogPack/issues/119) | [#115](https://github.com/DevDogsUGA/DogPack/issues/115), [#73](https://github.com/DevDogsUGA/DogPack/issues/73) | | [#120 — Bind unblock action in profile](https://github.com/DevDogsUGA/DogPack/issues/120) | [#119](https://github.com/DevDogsUGA/DogPack/issues/119) | | [#121 — Replace unavailable/quarantined session detail](https://github.com/DevDogsUGA/DogPack/issues/121) | [#118](https://github.com/DevDogsUGA/DogPack/issues/118) | | [#122 — Show restricted-account recovery state](https://github.com/DevDogsUGA/DogPack/issues/122) | [#121](https://github.com/DevDogsUGA/DogPack/issues/121) | | [#123 — Record a supplied report round trip](https://github.com/DevDogsUGA/DogPack/issues/123) | [#122](https://github.com/DevDogsUGA/DogPack/issues/122), [#39](https://github.com/DevDogsUGA/DogPack/issues/39) | | [#124 — Record reciprocal block visibility](https://github.com/DevDogsUGA/DogPack/issues/124) | [#123](https://github.com/DevDogsUGA/DogPack/issues/123) | | [#39 — Verify deployed moderation test fixtures](https://github.com/DevDogsUGA/DogPack/issues/39) | Officer evidence required |
Due by November 16, 2026•0/16 issues closedA feed of upcoming sessions in the student's own courses, soonest first (no search or filters), refreshed by pull-to-refresh (no Realtime this semester). Join and leave with a plain insert/delete. A full session answers with one error code, session_full, and the app shows it. The capacity trigger in the database is the only enforcement, so two students taking the last seat cannot both succeed. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#14 — Define plain session-card data and fixtures](https://github.com/DevDogsUGA/DogPack/issues/14) | None | | [#98 — Render session-card course/host/time text](https://github.com/DevDogsUGA/DogPack/issues/98) | [#14](https://github.com/DevDogsUGA/DogPack/issues/14) | | [#99 — Display host-counted seats and full state](https://github.com/DevDogsUGA/DogPack/issues/99) | [#98](https://github.com/DevDogsUGA/DogPack/issues/98) | | [#100 — Display cancelled and past card states](https://github.com/DevDogsUGA/DogPack/issues/100) | [#99](https://github.com/DevDogsUGA/DogPack/issues/99) | | [#30 — Declare a plain Discover query result](https://github.com/DevDogsUGA/DogPack/issues/30) | None | | [#101 — Query upcoming sessions for enrolled courses](https://github.com/DevDogsUGA/DogPack/issues/101) | [#30](https://github.com/DevDogsUGA/DogPack/issues/30), [#100](https://github.com/DevDogsUGA/DogPack/issues/100) | | [#102 — Resolve host names and map session cards](https://github.com/DevDogsUGA/DogPack/issues/102) | [#101](https://github.com/DevDogsUGA/DogPack/issues/101) | | [#103 — Handle onboarding-required discovery access](https://github.com/DevDogsUGA/DogPack/issues/103) | [#102](https://github.com/DevDogsUGA/DogPack/issues/102) | | [#104 — Render the Discover feed and states](https://github.com/DevDogsUGA/DogPack/issues/104) | [#103](https://github.com/DevDogsUGA/DogPack/issues/103) | | [#105 — Refresh Discover while keeping previous data](https://github.com/DevDogsUGA/DogPack/issues/105) | [#104](https://github.com/DevDogsUGA/DogPack/issues/104) | | [#31 — Join with a plain own-membership insert](https://github.com/DevDogsUGA/DogPack/issues/31) | None | | [#106 — Map session full/closed/unavailable join errors](https://github.com/DevDogsUGA/DogPack/issues/106) | [#31](https://github.com/DevDogsUGA/DogPack/issues/31) | | [#107 — Map enrollment/host/onboarding join errors](https://github.com/DevDogsUGA/DogPack/issues/107) | [#106](https://github.com/DevDogsUGA/DogPack/issues/106) | | [#32 — Leave with an own-membership delete](https://github.com/DevDogsUGA/DogPack/issues/32) | None | | [#33 — Read own joined memberships](https://github.com/DevDogsUGA/DogPack/issues/33) | None | | [#108 — Read authorized session detail](https://github.com/DevDogsUGA/DogPack/issues/108) | [#33](https://github.com/DevDogsUGA/DogPack/issues/33), [#30](https://github.com/DevDogsUGA/DogPack/issues/30) | | [#109 — Bind join and host-manage UI states](https://github.com/DevDogsUGA/DogPack/issues/109) | [#105](https://github.com/DevDogsUGA/DogPack/issues/105), [#107](https://github.com/DevDogsUGA/DogPack/issues/107), [#32](https://github.com/DevDogsUGA/DogPack/issues/32), [#108](https://github.com/DevDogsUGA/DogPack/issues/108), [#70](https://github.com/DevDogsUGA/DogPack/issues/70) | | [#110 — Bind leave and refresh seats](https://github.com/DevDogsUGA/DogPack/issues/110) | [#109](https://github.com/DevDogsUGA/DogPack/issues/109) | | [#111 — Show my joined sessions from Home](https://github.com/DevDogsUGA/DogPack/issues/111) | [#110](https://github.com/DevDogsUGA/DogPack/issues/110), [#91](https://github.com/DevDogsUGA/DogPack/issues/91) | | [#133 — Add the Home / Create / Profile tab bar](https://github.com/DevDogsUGA/DogPack/issues/133) | [#73](https://github.com/DevDogsUGA/DogPack/issues/73), [#89](https://github.com/DevDogsUGA/DogPack/issues/89), [#104](https://github.com/DevDogsUGA/DogPack/issues/104), [#111](https://github.com/DevDogsUGA/DogPack/issues/111) | --- ## Competition brief: Home Page **Project:** Study Group Finder · **Entries close:** Mon, Nov 2, 6:00 PM ET (start of presentations and judging) ## Summary Build Dog Pack's default home page. Students should see current and upcoming study sessions for their classes, join eligible sessions with minimal tapping, see sessions they've already joined, and leave a session when their plans change. Keep the page up to date with Supabase Realtime. ## Background The Study Group Finder is a Flutter app in [`apps/study-group-finder/`](https://github.com/DevDogsUGA/DevDogsUGA/tree/main/apps/study-group-finder). The [Study Group Finder roadmap](https://docs.google.com/document/d/1kYb7YKoGXVn3vpjEnIBcNhyOZ-1nZcAHk8fnXaIsKT0/edit) calls for a home page built from the UX team's designs, session discovery, joined-session visibility, leaving sessions and realtime updates. Build on the preceding **Create Study Session I** round: persisted profiles, `shared.enrollments`, and `study_group_finder.sessions` with course, title, start time, duration, location and capacity. Confirm the winning entry's final schema before implementing this round. Reuse its models and session-creation flow. Joining and capacity enforcement were deferred there; this round adds the membership data and operations needed by the home page. Keep database access behind the app's existing Supabase client. Teams write any required membership migrations, constraints, grants and RLS, and regenerate models through the existing workflow. Realtime updates must cover both session changes and the current user's memberships. Clean up subscriptions when the screen or signed-in account changes. Read these first: - [Study Group Finder docs](https://devdogsuga.org/docs/study-group-finder) and its [schema change guide](https://devdogsuga.org/docs/study-group-finder/guides/schema-change-loop) - The winning Create Study Session I implementation and the UX team's home-page designs - [Supabase Flutter realtime streams](https://supabase.com/docs/reference/dart/stream) and [Row Level Security guide](https://supabase.com/docs/guides/database/postgres/row-level-security) ## Requirements - [ ] Build the home page from the UX team's designs and make it the default screen for signed-in, onboarded users. Keep the bottom navigation usable, including Home and session creation. - [ ] Show ongoing and future sessions for the user's enrolled courses in the selected term. Order upcoming sessions from earliest to latest, with a consistent order for ties. Keep ended sessions out of the active lists. - [ ] Clearly distinguish sessions the user has already joined from sessions they can join. Display enough detail to choose a session: course, title, time/duration, location and available capacity. - [ ] Reuse the session view and offer a clear join action with minimal tapping. Persist membership without duplicates and enforce enrollment, session eligibility and capacity in the database, including simultaneous attempts to take the last place. - [ ] Let users leave a joined session. Remove only that user's membership, free the place and update the home page. Don't delete the session or another user's membership. - [ ] Keep lists and membership state current through Supabase realtime subscriptions. Configure relevant tables for realtime, handle reconnection, and refresh on app resume. Update time-based visibility even when no database row changes. - [ ] Show loading, empty, no-enrollment and error/retry states. Disable repeat join/leave submissions while pending and recover cleanly from failed requests. - [ ] Seed dummy sessions for testing. Write widget and database/RLS tests for discovery, ordering, joining, leaving and realtime behavior. - [ ] `flutter analyze`, `flutter test` and the relevant database/RLS tests pass. ## Out of scope - Rebuilding authentication, onboarding, profile persistence or the existing session-creation form - Notifications, reminders, app settings or theming preferences - Editing/deleting sessions, recurring sessions or automatic database cleanup - Browsing other students' profiles or changing OAuth/platform configuration ## What we'll test Judges run every entry on an **Android emulator** and check database access rules with separate test users. - Current and future sessions for enrolled courses; earliest-to-latest ordering - An empty list, no enrollments, another term and an ended session - Joined sessions appearing clearly and surviving restart and sign-out/sign-in - Joining once, repeated taps and two students attempting to take the last place - Rejecting anonymous, unenrolled, full-session and ended-session joins, including direct database requests - Leaving a session without deleting it or affecting other members - Session and membership changes from another client updating the page - A session ending while the page stays open - Failed join/leave requests, loss of network and reconnection - Switching accounts without showing the previous user's memberships - Navigation to session details and the existing creation page ## How to submit 1. Work on your team's `team/<your-team>` branch. 2. Open a pull request into `main` with `Closes #<this issue>` in the description. 3. Open it as a **draft PR early**. Only PRs opened before this issue closes are entered. ## Judging - Correctness against the behaviors listed under "What we'll test" - Visual polish, accessibility and clarity of session discovery, joined sessions and loading/error states - Database membership checks and capacity enforcement - Code quality and readability, including your migrations and realtime lifecycle - Your own tests - Your PR write-up, including database setup, test-user instructions and a screen recording of the full flow The winning entry gets merged into Dog Pack and credited to the team. ## Resources - **This week's session:** Wed 10/28 build session. Session name, event link, time and room to be added before kickoff. - Discord: #tech-support forum, one post per problem - [Study Group Finder docs](https://devdogsuga.org/docs/study-group-finder)
Due by November 9, 2026•0/20 issues closedA host creates a study session for a course they are enrolled in: course, title, start time, duration, free-text location and capacity. The host counts as one seat. A host can edit and cancel their own session. Sessions can only be created for enrolled courses; this is enforced in the database, not only in the form. Loading, validation, empty and error states, and no duplicate submissions. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#28 — Validate session text fields](https://github.com/DevDogsUGA/DogPack/issues/28) | None | | [#82 — Validate session time and capacity](https://github.com/DevDogsUGA/DogPack/issues/82) | [#28](https://github.com/DevDogsUGA/DogPack/issues/28) | | [#29 — Read caller hosted sessions](https://github.com/DevDogsUGA/DogPack/issues/29) | [#30](https://github.com/DevDogsUGA/DogPack/issues/30) | | [#83 — Render enrolled-course and session-text fields](https://github.com/DevDogsUGA/DogPack/issues/83) | [#82](https://github.com/DevDogsUGA/DogPack/issues/82) | | [#84 — Render session start/end controls](https://github.com/DevDogsUGA/DogPack/issues/84) | [#83](https://github.com/DevDogsUGA/DogPack/issues/83) | | [#85 — Render host-counted capacity control](https://github.com/DevDogsUGA/DogPack/issues/85) | [#84](https://github.com/DevDogsUGA/DogPack/issues/84) | | [#86 — Map a session draft to an allowed insert](https://github.com/DevDogsUGA/DogPack/issues/86) | [#82](https://github.com/DevDogsUGA/DogPack/issues/82) | | [#87 — Create with stable session ID across uncertain retry](https://github.com/DevDogsUGA/DogPack/issues/87) | [#86](https://github.com/DevDogsUGA/DogPack/issues/86), [#30](https://github.com/DevDogsUGA/DogPack/issues/30) | | [#88 — Supply own enrollments to create form](https://github.com/DevDogsUGA/DogPack/issues/88) | [#85](https://github.com/DevDogsUGA/DogPack/issues/85), [#87](https://github.com/DevDogsUGA/DogPack/issues/87), [#71](https://github.com/DevDogsUGA/DogPack/issues/71), [#70](https://github.com/DevDogsUGA/DogPack/issues/70) | | [#89 — Bind create submission and pending state](https://github.com/DevDogsUGA/DogPack/issues/89) | [#88](https://github.com/DevDogsUGA/DogPack/issues/88) | | [#90 — Render caller hosted-session list](https://github.com/DevDogsUGA/DogPack/issues/90) | [#29](https://github.com/DevDogsUGA/DogPack/issues/29) | | [#91 — Connect hosted-session management navigation](https://github.com/DevDogsUGA/DogPack/issues/91) | [#90](https://github.com/DevDogsUGA/DogPack/issues/90) | | [#92 — Map mutable session edit fields](https://github.com/DevDogsUGA/DogPack/issues/92) | [#82](https://github.com/DevDogsUGA/DogPack/issues/82) | | [#93 — Map edit guard errors safely](https://github.com/DevDogsUGA/DogPack/issues/93) | [#92](https://github.com/DevDogsUGA/DogPack/issues/92) | | [#94 — Prefill the host edit form](https://github.com/DevDogsUGA/DogPack/issues/94) | [#91](https://github.com/DevDogsUGA/DogPack/issues/91), [#93](https://github.com/DevDogsUGA/DogPack/issues/93), [#85](https://github.com/DevDogsUGA/DogPack/issues/85) | | [#95 — Bind edit save/cancel outcomes](https://github.com/DevDogsUGA/DogPack/issues/95) | [#94](https://github.com/DevDogsUGA/DogPack/issues/94) | | [#96 — Cancel through status-only update](https://github.com/DevDogsUGA/DogPack/issues/96) | [#29](https://github.com/DevDogsUGA/DogPack/issues/29) | | [#97 — Confirm cancellation and refresh host list](https://github.com/DevDogsUGA/DogPack/issues/97) | [#91](https://github.com/DevDogsUGA/DogPack/issues/91), [#96](https://github.com/DevDogsUGA/DogPack/issues/96) | --- ## Competition brief: Create Study Session I **Project:** Study Group Finder · **Entries close:** [Mon, Oct 26, 6:00 PM ET](https://devdogsuga.org/events/2026-10-26) (start of presentations and judging) ## Summary Save students' profiles and courses, then let them create study sessions for courses they're enrolled in. When you're done, a returning student can skip onboarding, create a session and see their own sessions. This round stores capacity; joining and capacity enforcement come later. ## Background The Study Group Finder is a Flutter app in [`apps/study-group-finder/`](https://github.com/DevDogsUGA/DevDogsUGA/tree/main/apps/study-group-finder). Build on the sign-in, onboarding and profile screens from the previous rounds. Those screens keep profile information in memory; this round adds persistence. Teams write **all migrations for this feature**, applying the CRUD, Joins and RLS workshop. Add `profiles` and `sessions` in `study_group_finder`, and add `shared.enrollments` for the user's term and course selections. Link user-owned rows to the authenticated user's UUID. **Enrollment deadlines:** Students can add or remove a course only until `dropAddEnds` for that course's part of term. Enforce this through RLS, including requests sent outside the app. A student with no enrollments for a term may enter their initial list once after add/drop; that exception must not let them reopen enrollment changes by clearing their list or submitting again. The shared course catalog is a dependency in [TASK-421](https://linear.app/devdogsuga/issue/TASK-421). Use its courses, terms and part-of-term deadlines. Confirm how an enrollment identifies the applicable part of term before implementing the deadline checks. Read these first: - [Study Group Finder docs](https://devdogsuga.org/docs/study-group-finder) and its [schema change guide](https://devdogsuga.org/docs/study-group-finder/guides/schema-change-loop) - [DevDogs Flutter Supabase walkthrough](https://devdogsuga.org/docs/workshops/supabase/flutter) - [Supabase Row Level Security guide](https://supabase.com/docs/guides/database/postgres/row-level-security) - [`supabase/migrations/`](https://github.com/DevDogsUGA/DevDogsUGA/tree/main/supabase/migrations): the shared migration history ## Requirements - [ ] Write the migrations for `profiles`, `shared.enrollments` and `sessions`, including constraints, grants and RLS. Regenerate the app's database models through the existing workflow. - [ ] Save name, major and year at the end of onboarding, and save course selections as enrollments for the chosen term. Returning users with a completed profile skip onboarding. - [ ] Show saved profile information in the existing profile screen and persist profile edits. Keep course changes subject to the enrollment rules below. - [ ] Store enrollments by user, term and course, without duplicate enrollments. Let the owner add or remove courses until the applicable `dropAddEnds`, enforced through RLS. - [ ] Support one initial enrollment-list submission after add/drop for a user with no enrollments in that term. Save the list as one operation and prevent repeat use of the exception. - [ ] Add a create-session form with course, title, start time, duration, free-text location and capacity. Offer only the user's enrolled courses for the selected term. - [ ] Store capacity as a valid positive value. Capacity does not limit anything in this round. - [ ] Allow session inserts only from a signed-in owner, for a course they are enrolled in. Enforce ownership and enrollment in the database. - [ ] Show a list of the signed-in user's own sessions with the saved details. Keep other users' sessions outside this round's list. - [ ] Show loading, validation, empty and error states. Keep entered values when a save fails, and prevent duplicate submissions. - [ ] Write database tests that check allowed and denied operations, including the add/drop exception and session ownership. - [ ] `flutter analyze`, `flutter test` and the relevant database/RLS tests pass. Completing onboarding requires a successful save. A failed profile request should show an error and a retry option, rather than treating a returning user as new. Profile and session data should survive app restarts and sign-out/sign-in. ## Out of scope - Joining sessions, browsing other students' sessions or enforcing capacity - Editing or deleting sessions, recurring sessions or automatic cleanup - Notifications, reminders, profile photo uploads or viewing other students' profiles - Changes to OAuth providers or moving the catalog into `shared` ## What we'll test Judges run every entry on an **Android emulator** and check database access rules with separate test users. - Completing onboarding, restarting the app and returning without repeating onboarding - Viewing and editing a saved profile without exposing another user's data - Adding and removing enrolled courses before the relevant add/drop deadline - Rejecting those changes after the deadline, including direct database requests - Using different part-of-term deadlines within the same term - Entering an initial course list once after add/drop, then rejecting a second submission or a partial save - Creating a session with each required field and viewing it in your own list - Rejecting an unenrolled course, an anonymous insert and an insert that claims another owner - Storing capacity without attempting to enforce attendance limits - Handling invalid input, an empty enrollment list and a failed save without losing form values or creating duplicate sessions - Switching accounts without showing the previous user's profile or sessions - Applying the migrations to a fresh local database and passing both allow and deny tests ## How to submit 1. Work on your team's `team/<your-team>` branch. 2. Open a pull request into `main` with `Closes #<this issue>` in the description. 3. Open it as a **draft PR early**. Only PRs opened before this issue closes are entered. ## Judging - Correctness against the behaviors listed under "What we'll test" - Database ownership checks and enrollment-deadline enforcement, including the one-time exception - Visual polish, accessibility and clarity across onboarding, course selection, session creation and loading/error states - Code quality and readability, including your migrations - Your own tests - Your PR write-up, including database setup, test-user instructions and a screen recording of the full flow The winning entry gets merged into Dog Pack and credited to the team. ## Resources - **This week's session:** Wed 10/21 build session. Session name, event link, time and room to be added before kickoff. - Discord: #tech-support forum, one post per problem - [Study Group Finder docs](https://devdogsuga.org/docs/study-group-finder)
Due by November 2, 2026•0/18 issues closedView/edit profile; add courses through enroll before the add deadline, drop own courses anytime; delete own DogPack data through the existing trusted RPC. Backend rules remain authoritative. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#26 — Map own profile to a plain snapshot](https://github.com/DevDogsUGA/DogPack/issues/26) | None | | [#71 — Read own current-term enrollments](https://github.com/DevDogsUGA/DogPack/issues/71) | [#26](https://github.com/DevDogsUGA/DogPack/issues/26) | | [#72 — Render the profile snapshot](https://github.com/DevDogsUGA/DogPack/issues/72) | [#71](https://github.com/DevDogsUGA/DogPack/issues/71) | | [#73 — Show profile loading/error and Home navigation](https://github.com/DevDogsUGA/DogPack/issues/73) | [#72](https://github.com/DevDogsUGA/DogPack/issues/72) | | [#74 — Edit the display-name field](https://github.com/DevDogsUGA/DogPack/issues/74) | [#73](https://github.com/DevDogsUGA/DogPack/issues/73), [#8](https://github.com/DevDogsUGA/DogPack/issues/8), [#22](https://github.com/DevDogsUGA/DogPack/issues/22), [#23](https://github.com/DevDogsUGA/DogPack/issues/23), [#64](https://github.com/DevDogsUGA/DogPack/issues/64) | | [#75 — Edit class year and major fields](https://github.com/DevDogsUGA/DogPack/issues/75) | [#74](https://github.com/DevDogsUGA/DogPack/issues/74) | | [#76 — Add a course through enroll client](https://github.com/DevDogsUGA/DogPack/issues/76) | [#73](https://github.com/DevDogsUGA/DogPack/issues/73), [#65](https://github.com/DevDogsUGA/DogPack/issues/65), [#51](https://github.com/DevDogsUGA/DogPack/issues/51) | | [#77 — Display add-deadline and catalog fallback outcomes](https://github.com/DevDogsUGA/DogPack/issues/77) | [#76](https://github.com/DevDogsUGA/DogPack/issues/76) | | [#78 — Delete caller enrollment through member query](https://github.com/DevDogsUGA/DogPack/issues/78) | [#73](https://github.com/DevDogsUGA/DogPack/issues/73) | | [#79 — Confirm drop and refresh profile courses](https://github.com/DevDogsUGA/DogPack/issues/79) | [#78](https://github.com/DevDogsUGA/DogPack/issues/78) | | [#27 — Call the existing delete_my_data RPC](https://github.com/DevDogsUGA/DogPack/issues/27) | None | | [#80 — Explain and confirm DogPack data deletion](https://github.com/DevDogsUGA/DogPack/issues/80) | [#73](https://github.com/DevDogsUGA/DogPack/issues/73), [#27](https://github.com/DevDogsUGA/DogPack/issues/27) | | [#81 — Reset app state after successful data deletion](https://github.com/DevDogsUGA/DogPack/issues/81) | [#80](https://github.com/DevDogsUGA/DogPack/issues/80) |
Due by November 2, 2026•0/13 issues closedAfter signing in, a student enters their name, year, major (free text) and the courses they take this term, in two or three steps with clear progress and a way back that keeps what they typed. Courses are term-scoped enrollments keyed by course code, validated against the platform's public catalog (with a format check, ^[A-Z]{4} \d{4}[A-Z]?$, as the fallback when the catalog is unreachable). The add/drop deadline rule applies: no adding courses after the term's full-term drop/add end, except the one-time initial list at onboarding. Saving writes the profile and enrollments to DogPack's database; a returning student skips onboarding. Includes the Android back button and large-text behavior. Each member issue is a small, independently reviewable change with focused learning and verification instructions. Keep at least six available open/unblocked issues per project continuously and ten tonight; contributors self-assign. Every issue explains project context and technical terms, with documentation/tutorial links, concrete files, implementation steps, examples and verification. See each linked issue for its full guide. ## Issue roadmap and prerequisites | Issue | What must finish first | |---|---| | [#7 — Canonical course-format validator only](https://github.com/DevDogsUGA/DogPack/issues/7) | None | | [#50 — Normalize common course-code typing](https://github.com/DevDogsUGA/DogPack/issues/50) | [#7](https://github.com/DevDogsUGA/DogPack/issues/7) | | [#51 — Preserve suffixes and reject non-ASCII code input](https://github.com/DevDogsUGA/DogPack/issues/51) | [#50](https://github.com/DevDogsUGA/DogPack/issues/50) | | [#8 — Display-name validator only](https://github.com/DevDogsUGA/DogPack/issues/8) | None | | [#22 — Major validator only](https://github.com/DevDogsUGA/DogPack/issues/22) | None | | [#23 — Validate class-year enum values](https://github.com/DevDogsUGA/DogPack/issues/23) | None | | [#9 — Render the display-name onboarding field](https://github.com/DevDogsUGA/DogPack/issues/9) | [#8](https://github.com/DevDogsUGA/DogPack/issues/8) | | [#52 — Render the class-year picker](https://github.com/DevDogsUGA/DogPack/issues/52) | [#9](https://github.com/DevDogsUGA/DogPack/issues/9) | | [#53 — Submit valid name/year from the step](https://github.com/DevDogsUGA/DogPack/issues/53) | [#52](https://github.com/DevDogsUGA/DogPack/issues/52) | | [#10 — Render a major-entry widget shell](https://github.com/DevDogsUGA/DogPack/issues/10) | None | | [#54 — Validate and submit the major field](https://github.com/DevDogsUGA/DogPack/issues/54) | [#10](https://github.com/DevDogsUGA/DogPack/issues/10), [#22](https://github.com/DevDogsUGA/DogPack/issues/22) | | [#11 — Add a normalized course chip](https://github.com/DevDogsUGA/DogPack/issues/11) | [#51](https://github.com/DevDogsUGA/DogPack/issues/51) | | [#55 — Reject duplicate and excessive course chips](https://github.com/DevDogsUGA/DogPack/issues/55) | [#11](https://github.com/DevDogsUGA/DogPack/issues/11) | | [#56 — Delete a course chip and set Done state](https://github.com/DevDogsUGA/DogPack/issues/56) | [#55](https://github.com/DevDogsUGA/DogPack/issues/55) | | [#12 — Store onboarding step values in a flow model](https://github.com/DevDogsUGA/DogPack/issues/12) | [#53](https://github.com/DevDogsUGA/DogPack/issues/53), [#54](https://github.com/DevDogsUGA/DogPack/issues/54), [#56](https://github.com/DevDogsUGA/DogPack/issues/56) | | [#57 — Wire Next/Back and progress indicator](https://github.com/DevDogsUGA/DogPack/issues/57) | [#12](https://github.com/DevDogsUGA/DogPack/issues/12) | | [#58 — Handle Android back between onboarding steps](https://github.com/DevDogsUGA/DogPack/issues/58) | [#57](https://github.com/DevDogsUGA/DogPack/issues/57) | | [#59 — Show submit pending/error and auth retry](https://github.com/DevDogsUGA/DogPack/issues/59) | [#58](https://github.com/DevDogsUGA/DogPack/issues/58) | | [#13 — Define CourseCheck response mapping](https://github.com/DevDogsUGA/DogPack/issues/13) | None | | [#60 — Call the SDK courseExists wrapper](https://github.com/DevDogsUGA/DogPack/issues/60) | [#13](https://github.com/DevDogsUGA/DogPack/issues/13) | | [#61 — Map catalog failures to unavailable](https://github.com/DevDogsUGA/DogPack/issues/61) | [#60](https://github.com/DevDogsUGA/DogPack/issues/60) | | [#62 — Provide the catalog client in the app](https://github.com/DevDogsUGA/DogPack/issues/62) | [#61](https://github.com/DevDogsUGA/DogPack/issues/61) | | [#63 — Use shared profile validators in each completed step](https://github.com/DevDogsUGA/DogPack/issues/63) | [#8](https://github.com/DevDogsUGA/DogPack/issues/8), [#22](https://github.com/DevDogsUGA/DogPack/issues/22), [#23](https://github.com/DevDogsUGA/DogPack/issues/23), [#53](https://github.com/DevDogsUGA/DogPack/issues/53), [#54](https://github.com/DevDogsUGA/DogPack/issues/54) | | [#24 — Map profile input to allowed columns](https://github.com/DevDogsUGA/DogPack/issues/24) | None | | [#64 — Upsert caller profile through authenticated client](https://github.com/DevDogsUGA/DogPack/issues/64) | [#24](https://github.com/DevDogsUGA/DogPack/issues/24) | | [#25 — Send an enrollment function request](https://github.com/DevDogsUGA/DogPack/issues/25) | None | | [#65 — Map enrollment per-course results](https://github.com/DevDogsUGA/DogPack/issues/65) | [#25](https://github.com/DevDogsUGA/DogPack/issues/25) | | [#66 — Show course lookup validation feedback](https://github.com/DevDogsUGA/DogPack/issues/66) | [#56](https://github.com/DevDogsUGA/DogPack/issues/56), [#62](https://github.com/DevDogsUGA/DogPack/issues/62) | | [#67 — Sequence profile and enrollment submission](https://github.com/DevDogsUGA/DogPack/issues/67) | [#64](https://github.com/DevDogsUGA/DogPack/issues/64), [#65](https://github.com/DevDogsUGA/DogPack/issues/65) | | [#68 — Complete onboarding only after selected courses succeed](https://github.com/DevDogsUGA/DogPack/issues/68) | [#67](https://github.com/DevDogsUGA/DogPack/issues/67) | | [#69 — Provide real onboarding submitter and term](https://github.com/DevDogsUGA/DogPack/issues/69) | [#59](https://github.com/DevDogsUGA/DogPack/issues/59), [#63](https://github.com/DevDogsUGA/DogPack/issues/63), [#66](https://github.com/DevDogsUGA/DogPack/issues/66), [#68](https://github.com/DevDogsUGA/DogPack/issues/68), [#62](https://github.com/DevDogsUGA/DogPack/issues/62) | | [#70 — Bind submission completion to the auth gate](https://github.com/DevDogsUGA/DogPack/issues/70) | [#69](https://github.com/DevDogsUGA/DogPack/issues/69) |
Overdue by 6 day(s)•Due by October 26, 2026•0/32 issues closed