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 setup –
public/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