Skip to content

Social OSU — Project Roadmap

Generated from /specs. This is the living plan for implementation. Each phase is ~1 sprint (1–2 weeks depending on team size).


The codebase has infrastructure scaffolding only:

  • Turborepo + Bun monorepo
  • Hono server with health-check routes
  • Prisma with a minimal User model (missing all other entities)
  • React + Vite shell with TanStack Router, Tailwind, shadcn/ui
  • CI/CD pipeline (GitHub Actions → Cloudflare Workers)
  • Comprehensive specs (25 files) — none implemented yet

Goal: Database schema, auth, dev tooling. Everything else depends on this.

#TaskSpecScope
0.1.1Define all enums (EventType, EventSource, EventStatus, AppStatus, InteractionType, MessageRole, CollectionVisibility, CompensationType)data-modelAPI
0.1.2Expand User model (clerkId, email, displayName, major, gradYear, interests, followerCount, followingCount)data-modelAPI
0.1.3Create Event model with embedded Location and Compensationdata-modelAPI
0.1.4Create Application model with unique (gigId, applicantId) constraintdata-modelAPI
0.1.5Create Follow model with unique (followerId, followeeId) + self-follow checkdata-modelAPI
0.1.6Create Collection, CollectionItem modelsdata-modelAPI
0.1.7Create Interaction model (append-only)data-modelAPI
0.1.8Create Conversation, Message modelsdata-modelAPI
0.1.9Create EventEmbedding model with pgvector vector(768)data-modelAPI
0.1.10Run initial migration, verify all relationships and cascadesdata-modelAPI
#TaskSpecScope
0.2.1Install and configure Clerk (@clerk/react, @hono/clerk-auth)authenticationFull-stack
0.2.2Add JWT verification middleware to HonoauthenticationAPI
0.2.3Implement auto-provisioning: first auth → create User row linked to clerkIdauthenticationAPI
0.2.4Restrict sign-up to @osu.edu / @buckeyemail.osu.edu domainsauthenticationFull-stack
0.2.5Add Clerk <SignIn>, <SignUp>, <UserButton> to frontendauthenticationWeb
#TaskSpecScope
0.3.1Set up Vitest for API (unit + integration tests)API
0.3.2Set up Vitest + Testing Library for WebWeb
0.3.3Add test commands to Turborepo (bun run test)Root
0.3.4Add API client helper or shared types package for frontend ↔ backendRoot

Depends on: Nothing (first phase) Blocks: Everything else


Goal: Users can manage profiles and create/browse events. The two most foundational entities.

#TaskSpecScope
1.1.1GET /api/v1/users/me — return authenticated user’s profileprofileAPI
1.1.2PATCH /api/v1/users/me — update displayName, major, gradYear, interestsprofileAPI
1.1.3GET /api/v1/users/:id — public profile (displayName, major, gradYear, interests, followerCount, followingCount, created events)public-profileAPI
1.1.4Write tests for all profile scenariosprofile, public-profileAPI
#TaskSpecScope
1.2.1Profile page — display own profile with edit formprofileWeb
1.2.2Public profile page — view another user’s profilepublic-profileWeb
1.2.3App shell layout — header with nav, user button, main content areaWeb
#TaskSpecScope
1.3.1POST /api/v1/events — create event/gig (source=USER, status=OPEN)lifecycleAPI
1.3.2GET /api/v1/events — list with filters (type, category, startDate, endDate, source, status, search, pagination)lifecycleAPI
1.3.3GET /api/v1/events/:id — single event detaillifecycleAPI
1.3.4PATCH /api/v1/events/:id — update (creator only, respect status transitions)lifecycleAPI
1.3.5DELETE /api/v1/events/:id — delete (creator only, cascade)lifecycleAPI
1.3.6Status transition validation (OPEN→IN_PROGRESS→COMPLETED, OPEN→CANCELLED)lifecycleAPI
1.3.7Auto-completion cron: mark past events as COMPLETED every 15 minlifecycleAPI
1.3.8Write tests for all event lifecycle scenarioslifecycleAPI
#TaskSpecScope
1.4.1Event list page — browse/filter events with paginationlifecycleWeb
1.4.2Event detail page — full event info, creator actions (edit/delete/status)lifecycleWeb
1.4.3Event creation form — title, description, type, location, dates, compensation (gigs)lifecycleWeb
1.4.4Event edit form — pre-filled, respects ownershiplifecycleWeb

Depends on: Phase 0 Blocks: Phase 2, Phase 3


Phase 2 — Marketplace (Gigs, Collections, Interactions)

Section titled “Phase 2 — Marketplace (Gigs, Collections, Interactions)”

Goal: Gig application flow works end-to-end. Users can save events to collections.

#TaskSpecScope
2.1.1POST /api/v1/gigs/:gigId/applications — apply with optional messagegig-applicationsAPI
2.1.2GET /api/v1/gigs/:gigId/applications — owner sees all, applicant sees owngig-applicationsAPI
2.1.3PATCH /api/v1/gigs/:gigId/applications/:appId — accept/reject (owner only, PENDING→ACCEPTED/REJECTED)gig-applicationsAPI
2.1.4Validation: no self-apply, no duplicate apply, no apply to cancelled gig, no re-status non-PENDINGgig-applicationsAPI
2.1.5Auto-create APPLY interaction on applicationgig-applicationsAPI
2.1.6Write tests for all application scenariosgig-applicationsAPI
#TaskSpecScope
2.2.1Apply button + modal on gig detail pagegig-applicationsWeb
2.2.2”My Applications” view — applicant sees their applications and statusesgig-applicationsWeb
2.2.3”Manage Applications” view — gig owner sees applicants, accept/reject buttonsgig-applicationsWeb
#TaskSpecScope
2.3.1POST /api/v1/collections — create collection (default PRIVATE)managementAPI
2.3.2GET /api/v1/collections — list user’s collectionsmanagementAPI
2.3.3GET /api/v1/collections/:id — get collection with items (respect visibility)managementAPI
2.3.4PATCH /api/v1/collections/:id — rename / change visibility (owner only)managementAPI
2.3.5DELETE /api/v1/collections/:id — delete (owner only, cascade)managementAPI
2.3.6POST /api/v1/collections/:id/items — add event (409 on dup, SAVE interaction)managementAPI
2.3.7DELETE /api/v1/collections/:id/items/:eventId — remove eventmanagementAPI
2.3.8Write tests for collections + visibility scenariosmanagementAPI
#TaskSpecScope
2.4.1”Save to Collection” button on event cards/detail pagesmanagementWeb
2.4.2Collections page — list, create, manage collectionsmanagementWeb
2.4.3Collection detail page — view saved eventsmanagementWeb
#TaskSpecScope
2.5.1POST /api/v1/interactions — record VIEW, SAVE, CLICK, APPLY, DISMISStrackingAPI
2.5.2Write tests for interaction recordingtrackingAPI

Depends on: Phase 1 (Events exist) Blocks: Phase 4 (Interactions feed recommendations)


Goal: Users can follow each other and see a social feed.

#TaskSpecScope
3.1.1POST /api/v1/users/:id/follow — follow (no self-follow, 409 on dup)followsAPI
3.1.2DELETE /api/v1/users/:id/follow — unfollowfollowsAPI
3.1.3GET /api/v1/users/:id/followers — paginated listfollowsAPI
3.1.4GET /api/v1/users/:id/following — paginated listfollowsAPI
3.1.5Increment/decrement followerCount and followingCount on UserfollowsAPI
3.1.6Write tests for follow scenariosfollowsAPI
#TaskSpecScope
3.2.1GET /api/v1/social/feed — events created/saved by followed usersfeedAPI
3.2.2Dedup logic: creation > save; order by action timestampfeedAPI
3.2.3Write tests for feed aggregation + dedupfeedAPI
#TaskSpecScope
3.3.1Follow/unfollow button on public profilesfollowsWeb
3.3.2Followers/following lists on profile pagesfollowsWeb
3.3.3Social feed pagefeedWeb

Depends on: Phase 1 (Users + Events) Blocks: Nothing critical (can parallelize with Phase 2)


Goal: AI tagging, embeddings, external event ingestion, and recommendations.

#TaskSpecScope
4.1.1Implement model router config (Provider → Model → Task mapping)model-routerAPI
4.1.2Configure Gemini provider (gemini-flash, gemini-pro, text-embed)model-routerAPI
4.1.3Install Vercel AI SDK + Google Generative AI providermodel-routerAPI
#TaskSpecScope
4.2.1AI tagging service: generate tags, summary, category from event contentlifecycleAPI
4.2.2Hook into event creation (non-blocking; failure → empty tags/null summary)lifecycleAPI
4.2.3Write tests for tagging (success + graceful failure)lifecycleAPI
#TaskSpecScope
4.3.1Enable pgvector extension in NeonembeddingsAPI
4.3.2Generate embeddings on event create/update (text-embedding-004, 768-dim)embeddingsAPI
4.3.3textHash-based staleness detectionembeddingsAPI
4.3.4HNSW index for cosine similarityembeddingsAPI
4.3.5Semantic search endpoint (filter by status + future startAt)embeddingsAPI
4.3.6Backfill job for events missing embeddingsembeddingsAPI
4.3.7Write tests for embedding generation + searchembeddingsAPI
#TaskSpecScope
4.4.1OSU Content API client (GET https://content.osu.edu/v2/events)external-ingestionAPI
4.4.2Ticketmaster API client (Columbus-area events)external-ingestionAPI
4.4.3Upsert-by-externalId with itemHash change detectionexternal-ingestionAPI
4.4.4Cron: sync every 6 hoursexternal-ingestionAPI
4.4.5AI tagging on ingested events (non-blocking)external-ingestionAPI
4.4.6Missing-event handling (past → COMPLETED, future → unchanged)external-ingestionAPI
4.4.7Write tests for ingestion + dedup + hash detectionexternal-ingestionAPI
#TaskSpecScope
4.5.1Interim ranking: interest match → popularity → recency → dismiss penaltymodelAPI
4.5.2GET /api/v1/recommendations — personalized feed with type/limit/offset filtersfeedAPI
4.5.3Recommendations UI — personalized feed page (likely the home page)feedWeb
4.5.4Write tests for recommendation rankingmodel, feedAPI

Depends on: Phase 1 (Events), Phase 2 (Interactions for recommendations) Blocks: Phase 5 (Chatbot uses semantic search)


Goal: Agentic LLM chatbot with tool use and conversation persistence.

#TaskSpecScope
5.1.1POST /api/v1/conversations — create conversationconversationsAPI
5.1.2GET /api/v1/conversations — list (paginated, ordered by updatedAt)conversationsAPI
5.1.3GET /api/v1/conversations/:id/messages — message history (paginated)conversationsAPI
5.1.4Title auto-generation from first message (non-blocking)conversationsAPI
5.1.5Write tests for conversation CRUD + ownershipconversationsAPI
#TaskSpecScope
5.2.1POST /api/v1/conversations/:id/messages — send message, stream SSE responsechatbotAPI
5.2.2System prompt: campus event assistant, use tools, decline off-topicchatbotAPI
5.2.3Read-only tools: searchEvents, searchGigs, getUserPreferenceschatbotAPI
5.2.4Mutation tools: applyToGig, saveEvent, createEvent (with confirmation)chatbotAPI
5.2.5Context window: last N messages (default 20)chatbotAPI
5.2.6Graceful failure: AI unavailable → error message, user message storedchatbotAPI
5.2.7Write tests for chatbot tool invocations + confirmation flowchatbotAPI
#TaskSpecScope
5.3.1Chat page — conversation list sidebar + message areaconversationsWeb
5.3.2Message input + streaming response displaychatbotWeb
5.3.3Confirmation dialog for mutation toolschatbotWeb
5.3.4New conversation creationconversationsWeb

Depends on: Phase 4 (semantic search for chatbot tools) Blocks: Nothing


#TaskSpecScope
6.3.1Error handling audit — ensure RFC 7807 Problem Details everywhereendpointsAPI
6.3.2Loading states, empty states, and error states across all pagesWeb
6.3.3Responsive design passWeb
6.3.4End-to-end smoke tests (key user flows)Full-stack

Depends on: Phase 5 Blocks: Nothing (final phase)


Phase 0 (Foundation)
├──► Phase 1 (Users & Events)
│ │
│ ├──► Phase 2 (Marketplace) ──────────────────┐
│ │ │
│ ├──► Phase 3 (Social) ◄── can parallelize ──►│
│ │ │
│ └──► Phase 4 (AI & External Data) ◄──────────┘
│ │
│ └──► Phase 5 (Chatbot)
└──► Phase 6 (Polish) ◄── after Phase 5

Parallelization opportunities:

  • Phase 2 and Phase 3 can run in parallel (different developers)
  • Phase 4.4 (External Ingestion) can start as soon as Phase 1.3 (Event CRUD) is done
  • Phase 6 (Polish) can begin once core features are stable

PhaseAPI TasksWeb TasksTotal
0 — Foundation14115
1 — Users & Events12719
2 — Marketplace14620
3 — Social639
4 — AI & External Data17118
5 — Chatbot11415
6 — Polish & Integration224
Total752297

  • Every task should follow the TDD workflow: spec → failing test → implementation → refactor.
  • AI-dependent features (tagging, embeddings, chatbot) should always fail gracefully.
  • External API integrations (Clerk, Gemini, OSU API, Ticketmaster) need env vars and secrets configured before development.