About the project

Pullup.to is a mobile-first social dashboard for service workers (creators, bartenders, DJs, servers, musicians, artists, trainers, chefs, food trucks, etc.) to publish schedules and locations, share a public profile link, and make it easy for fans and clients to discover where they are and where they’ll be. I designed and built the MVP and ongoing iterations with a focus on speed, accessibility, and a clean authoring experience.

Goals

  • Let users publish a live schedule without engineering help
  • Streamline a mobile IA with a bottom nav and simple flows
  • Establish a reusable design system (dark-mode first)
  • Make public profiles easy to share (QR + vanity URLs)
  • Ensure solid SEO/a11y from day one (robots, sitemap, contrast)
  • Create a foundation for discovery, notifications, and growth

Project execution

  • Next.js 14 App Router with a shared page shell and typed data fetching
  • Supabase for auth, Postgres, RLS, and RPCs; public read via public_profiles view
  • Clear split between public routes (index, discover, profile) and authed routes (dashboard, share)
  • OSM maps (Mapbox used early for venue search experiments)
  • CI/CD on Vercel, pnpm + lint-staged/Husky, preview deployments

What I built

  • Information architecture & navigation – mobile bottom nav, simple routes, clean public profile at /:username
  • Design system – Tailwind + shadcn/ui tokens/components; consistent spacing, type scale, focus states
  • Auth & profiles – Supabase Auth, public_profiles view with RLS-safe fields (username, display_name, bio, avatar)
  • Schedule publishing – current-week list with room for one-off + recurring events (schema + UI pattern ready)
  • Schedule privatization – user-level toggle to show/hide schedules on public profiles; enforced via RLS (schedule_private flag + is_schedule_public(owner_id) helper) so public queries exclude private calendars
  • Share page & QR – server-rendered SVG QR that links to the user’s public profile (no PNG download step)
  • Search & discovery – Supabase full-text (tsvector + GIN) across username/display_name with ranked results
  • Venue context – OSM map preview components; prepared for place search and category filters
  • SEO setuppublic/robots.txt, app/robots.ts support, public/sitemap.xml or app/sitemap.ts for clean crawl
  • Accessibility – fixed PSI contrast failures on primary CTA, keyboard focus rings, semantic landmarks
  • Performance – route-level caching where safe, deferred non-critical JS, Image handling where applicable
  • Analytics – hooks for tracking QR scans, profile visits, and CTA conversions (ready for GA/other)

Develoment approach

  • Branch hygiene: created a restore baseline and fast-forwarded main; feature branches for QR, profiles, discovery
  • URL protections: reserved filenames (e.g., real public/robots.txt) so /:username cannot hijack /robots.txt
  • Release checklist: PSI/Lighthouse pass, contrast checks, sitemap/robots verified via curl and Search Console
  • Error budgets: strict TypeScript + ESLint rules, precommit lint-staged, preview links for stakeholder QA

Project results

  • Clean, shareable public profile URLs and QR codes that scan directly to live schedules
  • Crawlable site with valid robots + sitemap (no more HTML at /robots.txt)
  • A11y improvements (CTA contrast, focus states) reflected in Lighthouse/PSI
  • Solid, secure data layer (RLS) enabling safe public reads and private writes
  • Google Lighthouse pagespeed scores of 99+ on both mobile and desktop

Outcomes

  • Faster iteration with a typed, componentized Next.js stack
  • Consistent visual language across pages; fewer bespoke layouts to maintain
  • Improved Core Web Vitals on key pages; lighter JS on public routes
  • Clear path to scale (search facets, notifications, venue catalogs)

What comes next

  • Native mobile apps (iOS & Android) using React Native (Expo): reuse Supabase auth/APIs and design tokens, add push notifications, deep links, offline caching, QR scanner, and OSM-based maps.
  • Pro (premium) features: advanced notifications, analytics, and multi-profile management with a single sign-in—no extra logins.
  • Public follow + optional notifications/digests
  • In-app messaging between users (1:1 to start; typing/read receipts, mute/block, moderation)
  • Recurring schedules UI + ICS export and embeddable profile widgets
  • Richer venue search (categories, neighborhoods) and map clustering
  • Search facets (role, city, venue), i18n, and simple analytics dashboards

Why this works for Pullup.to

  • One platform to publish once, share anywhere (QR + vanity URL)
  • Mobile-first UX tailored to on-the-go creators and their audiences
  • Modern stack that’s fast to ship, easy to maintain, and secure by default
  • SEO/a11y foundations that help profiles get discovered and used