Skip to content

Releases: m-khan-97/catchit

v0.23.0 — Success-stories wall + PWA polish

Choose a tag to compare

@m-khan-97 m-khan-97 released this 10 Jul 15:15

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)

Choose a tag to compare

@m-khan-97 m-khan-97 released this 09 Jul 21:04

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 narrow stories_public view).
  • 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 /stories instead of a mailto.

Migration: 20260710000000_stories.sql.

v0.21.0 — About page catch animation, 3-step sequence, pull-quote

Choose a tag to compare

@m-khan-97 m-khan-97 released this 09 Jul 20:33

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 05 Jul 23:05

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 05 Jul 21:37

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
    against audience_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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 05 Jul 11:54

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 05 Jul 11:25

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 04 Jul 22:31

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 04 Jul 22:22

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

Choose a tag to compare

@m-khan-97 m-khan-97 released this 04 Jul 22:02

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.