StandApp+

Stand-Up Comedy Streaming Platform

Year: 2025–Present
Role: Solo Full-Stack Developer
React 18 TypeScript Vite Tailwind CSS v4 Strapi v5 PostgreSQL Railway YouTube API Google OAuth
StandApp+

About this project

StandApp+ is a curated stand-up comedy streaming platform for Spanish-speaking audiences. Built entirely solo — from the React frontend to the Strapi CMS backend — it aggregates 121+ manually curated YouTube specials organized by category, with a full user progress system that syncs across devices. Users can pick up exactly where they left off, whether on mobile or desktop, authenticated or not. The platform features Google OAuth login, cross-device progress sync, a 'Continue Watching' section, video completion tracking at the 95% threshold, and contextual menus for marking videos as watched or removing them from the queue.

Key Features

  • 121+ curated stand-up specials organized in 4 YouTube playlists (Recientes, Imprescindibles, Roasts, Más comedia)
  • Cross-device progress sync: guests use localStorage, authenticated users sync to Strapi via REST API
  • Progress migration on sign-up: local guest progress is uploaded to the cloud on first login
  • Google OAuth integration using Strapi's native provider — no SDK, pure redirect flow
  • 95% threshold video completion: marks as 'watched' before the last second, Netflix-style
  • Continue Watching section with contextual menu: Resume, Mark as Watched, Remove
  • Completed videos filtered out of Continue Watching and Related Videos, with a subtle badge in content lists
  • Hero carousel with real YouTube thumbnails, auto-advances every 5s, responsive aspect ratios
  • Channel social links (TikTok, Instagram, Facebook, website) from a manually curated database of 40+ comedians
  • Video stats pulled from YouTube Data API: views, likes, duration, publish date

Screenshots

StandApp+ - Screenshot 1
StandApp+ - Screenshot 2
StandApp+ - Screenshot 3

Technical Highlights

The most interesting engineering challenge was the dual-source progress system. Guest users accumulate watch progress in localStorage. The moment they create an account, uploadLocalProgress() migrates their history to Strapi, and pullProgress() hydrates an in-memory store so the UI updates instantly — no page reload required.

The backend runs on Strapi v5 deployed to Railway. A known issue with Railway's SSL proxy termination caused OAuth session cookies to throw "Cannot send secure cookie over unencrypted connection". The fix was setting strapi.server.app.proxy = true in the bootstrap function — telling Koa to trust the X-Forwarded-Proto: https header from Railway's load balancer.

The Google OAuth flow uses Strapi's native redirect mechanism — no @react-oauth/google or any SDK. The frontend redirects to /api/connect/google, Google authenticates, Strapi creates or finds the user and issues a JWT, and the app detects the ?access_token on the redirect URL using a mount-time useEffect.

Project Details

Year
2025–Present
Role
Solo Full-Stack Developer
Technologies
React 18, TypeScript, Vite, Tailwind CSS v4, Strapi v5, PostgreSQL, Railway, YouTube API, Google OAuth
Visit Website View More Projects