Releases: m-khan-97/catchit
Release list
v0.23.0 — Success-stories wall + PWA polish
Bundles everything since v0.22.0:
Success-stories wall (/stories)
- Public, no-login moderated submission form (zod validation, honeypot,
IP rate-limit) feeding an admin approval queue — same trust model as the
opportunities review queue. - Empty-wall guard: only renders once there are 3+ approved stories.
- Modern card treatment: colored initials avatars, decorative quote marks,
alternating tilt that straightens on hover, staggered fade-in, 3-column
layout on desktop. - Added to the header nav (with a mobile nav-overflow fix alongside it).
PWA polish
- iOS home-screen icon + meta tags (apple-icon, appleWebApp metadata,
theme-color) — iOS Safari ignores the web manifest entirely, so without
these "Add to Home Screen" fell back to a plain screenshot thumbnail. - Offline fallback page, cached by the service worker and served on failed
navigations instead of the browser's default connection-error screen. - Richer manifest (id, scope, shortcuts for Submit / My saved items).
- Custom install-prompt component (Chrome/Edge/Android) on the account page.
Fixes
- Eligibility-profile "Matches you" badge now matches on either
audience or region (was requiring both, which meant most researcher-
tagged opportunities — nearly all Global/Remote — could never match a
UK-based profile). - Light-theme contrast fixes: the About page pull-quote panel and two
lime-colored links were unreadable in light mode.
Migration: 20260710000000_stories.sql.
v0.22.0 — Moderated success-stories wall (/stories)
A public, no-login user-stories wall — students/professionals share how
CatchIt helped them catch a hackathon spot, credits, a scholarship, etc.
/stories: submission form (zod validation, honeypot, IP rate-limit,
same anti-spam pattern as/submit) plus a Padlet-style card wall.- Moderated by default: every story lands
pending; only visible after
an admin approves it in/admin— same trust model as the opportunities
review queue (anon can only insert, admins read/moderate via RLS, public
reads through a narrowstories_publicview). - Empty-wall guard: the wall only renders once there are 3+ approved
stories, so a near-empty page never ships. - Footer and About page now link to
/storiesinstead of a mailto.
Migration: 20260710000000_stories.sql.
v0.21.0 — About page catch animation, 3-step sequence, pull-quote
Demo-prep polish: recreates the visual sections from the original design
handoff that were never built out in production —
- A looping "catch" animation: three opportunity chips fall into a mitt
with a squash-and-stretch catch, a ring burst, and a cosmetic "+1 caught"
counter. - A 3-step, no-prose explainer (📵 😤 📡).
- A pull-quote panel.
- Team section upgraded with the design's humor taglines, keeping the real
photos added in v0.20.0.
Existing intro paragraphs kept as-is.
v0.20.0 — Fix eligibility matching + About page team section
Bug fix and demo-prep polish:
- Fixed "Matches you" badge: preference matching previously required
both audience AND region to overlap, so e.g. a UK-based researcher would
never match, since nearly all researcher-tagged opportunities are
Global/Remote rather than region-specific. Now matches on either axis. - About page: added a small "At your service" team section with photos
for all three contributors, ahead of the university demo.
v0.19.0 — Eligibility profile matching + instant new-match alerts
Real Tier-2 market-research features, the honest zero-cost version of the
roadmap's "for you" ranking (§3d):
- Eligibility profile: one-time study-level + region preference, badged
as "✓ Matches you" on the feed and detail page via simple tag overlap
againstaudience_tags/region_tags— no ML, no new API cost. - Instant new-match alerts: a daily cron checks each followed filter for
opportunities approved since its last check, and emails/pushes one
combined digest per user — no per-item spam even if someone follows
several filters.
Also extracted the tag-overlap matching logic (previously duplicated across
the digest and calendar.ics routes) into a shared helper, now used by both
plus the new alerts module.
Migrations: 20260705030000_eligibility_profile.sql,
20260705040000_filter_alert_watermark.sql.
v0.18.0 — Similar opportunities + personal notes on saved items
Tier-2 market-research features, following on from v0.17.0's countdowns/
calendar/status-tracking:
- Similar opportunities on the detail page — same-category, live,
soonest-deadline-first recommendations. - Personal notes on saved items — free-text field for context the
application status alone can't capture (e.g. "need 2 recommenders").
Migration: 20260705010000_saved_notes.sql.
v0.17.0 — Live countdowns, add-to-calendar, application status tracking
Three market-research-driven features for the opportunity feed:
- Live countdown timers on the opportunity detail page — ticking HH:MM:SS under 48h, days+hours otherwise.
- "Closing this week" filter chip on the feed, alongside category/region/audience filters.
- Per-opportunity Add to Calendar: single-event .ics download + Google Calendar quick-add link, distinct from the existing whole-feed/personal calendar subscriptions.
- Application status tracking on saved items (saved → applied → got it / no luck), with an aggregate "applications tracked" / "reported successes" count surfaced on the public /stats page.
Migration: 20260705000000_application_status.sql.
v0.16.0 — Internships added to Unstop discovery source
Internship coverage was by far the thinnest category (1 approved
listing out of 77). Unstop's "internships" endpoint turned out to be
a combined jobs+internships board (195k+ listings) rather than
internships-only — filtered to subtype === "internships" specifically
so full-time roles (Sales Executive, Marketing Manager, etc.) never
reach the internship category.
Verified against a real discovery run: 12 new genuine internships
inserted, correct deadlines, no full-time jobs leaked through the
filter.
v0.15.0 — Duplicate-merge assist in admin review queue
Flags pending items whose title is a close-but-not-auto-blocked match
against another pending or approved item in the same category — the
"near-miss" band the discovery pipeline's own dedup (0.85 fuzzy
threshold) doesn't catch, since anything at or above that threshold
never reaches the queue at all. Pure client-side string comparison
against already-fetched data, no schema change, no new dependency.
Verified against live data (read-only): correctly flagged 3 real
"Free Scholarship Test on X" listings from the same organization as
69-74% similar without claiming they're the same opportunity — exactly
the intended "worth a human glance" signal, not an auto-reject.
v0.14.0 — Milestone 11: browser push notifications
Extends deadline alerts with a second delivery channel — the roadmap's
"near-zero marginal cost, good for deadline reminders" pairing. No new
external account: VAPID keys are self-generated (web-push library),
and push services (FCM/Mozilla push) are free browser infrastructure.
- push_subscriptions table (same per-user RLS pattern as
saved_opportunities/followed_filters). - PWA manifest (src/app/manifest.ts) + on-brand icon routes reusing
the opengraph-image ImageResponse pattern (src/lib/radar-icon.tsx)
instead of needing external image tools — same radar mark, sized
with a generous safe zone for maskable-icon cropping. - Minimal service worker (public/sw.js): push -> showNotification,
notificationclick -> focus or open the relevant opportunity. - Account page toggle to subscribe/unsubscribe (src/app/account/
push-toggle.tsx), calling server actions directly (no form needed —
the subscription object comes from an async browser API call). - runDeadlineAlerts now also pushes, best-effort, to every subscription
for a user whenever an email reminder fires; a 404/410 response from
the push service (subscription gone) deletes that row automatically.
Verified end-to-end for real: subscribed via the actual browser
permission prompt, triggered the cron, received a real push
notification on a real saved item's 48h reminder.