Skip to content

Finalize Universify: fix breakages, wire recommendations, full theming, bot persistence, CI - #12

Merged
Hef50 merged 6 commits into
mainfrom
claude/project-state-oml8d3
Aug 12, 2026
Merged

Finalize Universify: fix breakages, wire recommendations, full theming, bot persistence, CI#12
Hef50 merged 6 commits into
mainfrom
claude/project-state-oml8d3

Conversation

@Hef50

@Hef50 Hef50 commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Brings the project to a finished, verified state across six commits.

Fixes

  • pnpm install fork bomb — the root "install": "pnpm install" lifecycle script recursively re-invoked itself on every fresh setup. Removed.
  • Broken buildexpo export:web no longer exists on SDK 54; build/vercel-build now use expo export --platform web, and vercel.json sets outputDirectory: dist.
  • RSVP persistence — RSVPs were written as updates to the events row, which RLS only allows for the organizer, so every non-organizer RSVP silently vanished on reload. New event_rsvps table (own-row RLS) with a SECURITY DEFINER trigger maintaining the aggregates on events; client writes optimistically and reverts on failure. Requires running supabase/migrations/003_event_rsvps.sql.
  • Committed debug telemetry — removed seven fetch() calls to a local debug ingest endpoint (one posted the OAuth callback URL).
  • Missing .env crashed bundling — the Supabase client is now guarded; without credentials the app runs in offline demo mode on bundled data.
  • Dead /event/:id links from Profile, misleading password-change UI (auth is Google-only), Google Calendar unschedule breaking after reload, Expo starter scaffold and other dead code.

Features completed

  • Recommendation engine wired in — extracted to a pure module, interest profiles mined from events the user scheduled/RSVP'd/created; Home feed is now ranked (was random), calendar drag-selection shows top-5 suggestions for the window. Fixed a per-token title-normalization bug caught by the new tests.
  • All six filter axes — date range, time of day, location, and availability sections replace the "Coming soon" placeholders in the filter drawer.
  • Real theming — light/dark/system, high-contrast, font-size scaling, and reduced-motion now apply across every screen and component via semantic palettes + useAppTheme (~70 hardcoded chrome colors removed).
  • Event detail page (/event/:id) with RSVP, recurring events (daily/weekly/monthly with interval/end date, expanded into calendar occurrences), and URL-based flyer images.
  • Slack bot persistence — parsed events now reach the shared Supabase events table (service-role), with an optional SLACK_REVIEW_CHANNEL Approve/Reject flow mirroring Discord's review workflow.
  • Cross-source deduplication — title-similarity + ±2h window checks in both bots and the client; optional LLM tie-break via OpenRouter in the Slack bot.
  • Event reminders — opt-in browser notifications ~30 minutes before scheduled events (web).

Infrastructure & docs

  • GitHub Actions CI: typecheck, lint, 21 unit tests, credential-free web bundle build, bot checks.
  • README rewritten to match reality (status, setup incl. migration 003 and new Slack env vars); five stale summary docs marked historical; client README's fabricated demo accounts removed.

Verification

  • tsc --noEmit: 0 errors (client + slack-bot) · expo lint: 0 errors, 0 warnings · unit tests: 21/21 · web export succeeds without credentials · Discord bot files pass node --check.

Not implemented (needs external infrastructure, documented in README): email delivery, native push, Instagram scraping.

🤖 Generated with Claude Code

https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ


Generated by Claude Code

claude added 6 commits August 12, 2026 07:17
- Remove the root 'install' lifecycle script that recursively re-invoked
  pnpm install (fork bomb on every fresh setup)
- Replace removed 'expo export:web' with 'expo export --platform web' in
  build/vercel-build (SDK 54 dropped the webpack command)
- Add outputDirectory and frozen lockfile to vercel.json
- Guard the Supabase client so a missing .env no longer crashes bundling;
  export isSupabaseConfigured for offline demo mode
- Fix duplicate 'private' key in discord bot package.json; add typecheck
  scripts and @types/node-fetch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
RSVPs were written by updating events.rsvp_counts/attendees directly, but
the events UPDATE policy only allows the organizer — every other user's
RSVP silently matched zero rows and vanished on reload.

- Migration 003: event_rsvps table (own-row RLS) with a SECURITY DEFINER
  trigger that keeps the denormalized aggregates on events in sync
- Client: setRSVPAPI/fetchEventAPI; updateRSVP now writes the user's own
  row, refreshes authoritative aggregates, reverts on failure, and keeps
  local-only state in offline demo mode
- addExternalEvents drops cross-source duplicates (title similarity + 2h
  window) via new utils/dedupe.ts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
- Extract the recommendation engine into utils/recommendationEngine.ts
  (React-free, unit-testable); hooks re-export and wrap it
- Add rankEventsForUser (interest profile + explicit categories +
  popularity ranking) and fix title normalization to be per-token so
  'Late Night Chess' matches the mined 'chess' interest
- Add utils/recurringEvents.ts: expand daily/weekly/monthly patterns into
  display occurrences with range clipping and month-length clamping
- Add useEventReminders: browser notifications ~30min before scheduled
  events (web, opt-in preference)
- FilterContext now exposes all six filter axes (date range, location,
  time of day, availability were implemented but unreachable)
- 21 unit tests over dedupe, recurrence, layout, and the engine

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
- Real theming via useAppTheme + semantic palettes (light/dark/system,
  high-contrast variants, font-size scaling, reduced-motion) applied
  across every screen and component; removes ~70 hardcoded chrome colors
- Home tab now shows engine-ranked recommendations (was random 20);
  calendar drag-selection shows top-5 suggestions for the time window
- New /event/[id] detail page with RSVP; fixes dead My Activity links
- FilterDrawer implements the Date Range / Time of Day / Location /
  Availability sections that previously said 'Coming soon'
- Create form: recurring pattern (frequency/interval/end date) and flyer
  image URL; calendar renders recurring occurrences; cards and detail
  views show images and recurrence
- Persist the Universify->Google Calendar event map so unschedule can
  delete the Google copy after a reload
- Remove remaining committed debug telemetry from GoogleAuthContext and
  the OAuth callback; drop the misleading password-change UI (auth is
  Google-only); zero tsc errors and zero lint warnings

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
- Slack bot now persists parsed events to the shared events table
  (service-role client, graceful no-op without credentials); optional
  SLACK_REVIEW_CHANNEL posts Approve/Reject buttons before storing
- Cross-source duplicate detection in both bots: title-token Jaccard
  similarity within a 2-hour start window, checked against nearby DB
  events before insert; Slack can escalate borderline pairs to an LLM
  via OPENROUTER_API_KEY
- Add slack-bot .env.example and README; update Discord docs (submission
  is real now, pnpm not npm); drop unused moment-timezone dependency

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
- GitHub Actions: typecheck, lint, unit tests, and a credential-free web
  bundle build for the client; typecheck/syntax checks for both bots
- README: status section now reflects what is really implemented, setup
  covers migration 003 and the new Slack env vars, structure/data-flow
  updated for dedupe + persistence + review flows
- Client README: pnpm-based setup, real scripts, removed fabricated
  password demo accounts (auth is Google-only)
- Mark the five stale summary documents as historical snapshots

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
@Hef50
Hef50 merged commit abdb615 into main Aug 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants