Project Overview
What is osu!friends?
osu!friends is a full-stack web platform that solves a real problem in the osu! rhythm game community:
finding players at the exact same skill level to compete with. The game has millions of players across a massive
performance-point (pp) spectrum, but no built-in tools for targeted rival matchmaking, score sniping challenges,
or skill-matched multiplayer lobbies.
osu!friends fills that gap — players sign in with their osu! account, are automatically profiled by their pp ranking,
and can find rivals, join or create live multiplayer lobbies filtered to their bracket, issue 7-day snipe challenges
when a rival posts a big score, and compete on a persistent leaderboard.
Built from zero to 30+ active users in under one week, shipping new features daily across 7 sprints.
My co-founder later left the project, and it's now maintained solo as an
open-source portfolio project — the codebase is public on
GitHub with a live demo at
osu-friends.vercel.app. There are no active users
today; it's a demonstration of what was built and shipped, not an ongoing product.
My Role
Co-Founder & Full-Stack Developer Lead Engineer
Responsible for all engineering, product decisions, deployment infrastructure, and marketing assets.
Designed the data model, built every feature from API routes through React UI, set up CI/CD on Vercel,
integrated multiple third-party OAuth providers (osu!, Discord, Twitch), and shipped a bot notification
system backed by the osu! in-game messaging API. My co-founder has since left the project; I now
maintain it solo as an open-source portfolio piece.
- Architected the full application from scaffold → production in under 7 days
- Sole engineer across all layers: database schema, API design, React UI, deployment, streaming/content assets
- Owned product roadmap, sprint planning, and feature prioritization alongside a co-founder
- Built and deployed a bot token auth system and in-game DM notifications via the osu! OAuth2 + API
Technology Stack
Frontend
Next.js 14 App Router
TypeScript
Tailwind CSS
React Server Components
next/font (Nunito)
next/image
Backend & Data
Prisma ORM
Supabase (PostgreSQL)
Next.js API Routes
Vercel Cron Jobs
Server Actions
Auth & Integrations
NextAuth.js (next-auth)
osu! OAuth2 API
Discord OAuth2 + Bot Token
Twitch OAuth2
Infra & Tooling
Vercel Pro (CI/CD)
GitHub
ESLint
html2canvas
OBS Browser Source
Features Built
Core Platform
osu! OAuth Authentication
Sign-in with osu! account via NextAuth. On first login, the osu! API is queried to populate the user's
pp, global rank, country code, avatar, and game mode. Profile auto-syncs on returning sessions.
Player Discovery
Browse and filter the community by country, language, pp bracket, and play schedule.
Fully server-rendered with client-side filter state; each profile card links to a full player page.
Live Lobby Finder
Real-time multiplayer room browser that queries the osu! API for active matches and filters by
game mode and skill bracket (pp-derived star rating target) so players only see
rooms appropriate for their rank.
Rival System
Send and accept rival requests; each user tracks a persistent rival relationship with
head-to-head pp comparison and rivalry stats. Rivals can be removed or replaced.
A dedicated compare card renders on both player profiles.
Snipe & Competition Layer
Score Snipe Challenges
When a rival posts a notable score, their opponent is notified via osu! in-game DM
(sent through the bot token system) with a 7-day window to beat it on the same beatmap.
Confirmed snipes award leaderboard points.
Rival Check Cron Job
Vercel Cron runs periodically to poll recent scores for all users with rivals,
detect snipeable plays, and dispatch notifications. Built with idempotency to avoid duplicate alerts.
Leaderboard
Global leaderboard tracking snipe points across the community, with a
game-mode filter (Standard, Taiko, Catch, Mania) and pp-ranked member list.
Notification System
In-app notification feed with read/unread state, rival request alerts, and snipe
notifications. API-backed with mark-as-read endpoint; unread count badge in the nav.
Tournament Matchmaking
Automated Tournament System Sprint 6
Players opt into tournament pools by skill bracket. A matchmaking cron job pairs contestants,
creates tournament records, and notifies both players. Each match has a voting round
where players vote on map pool picks, and a host can start the match which triggers
an osu! in-game bot DM with the lobby invite command. Timezone-aware reminder
crons send pre-match alerts. Includes graceful fallback when DM is unavailable.
Social & Profile
Rich Player Profiles
Each user has a public profile with avatar, stats, social links (Discord, Twitch),
language tags, play schedule, map style preference, About Me section, rival card, and friend list.
All fields editable in-place via API-backed mutations.
Discord & Twitch Connect
Separate OAuth flows for Discord and Twitch that link accounts without replacing
the primary osu! session. Discord tag and Twitch handle appear on profiles with one-click copy.
Team Pages
osu! team integration with team profile pages, application system, and a team
management dashboard. Applications are reviewed and accepted/rejected by team managers.
Streaming & Content Tools
OBS Signup Overlay
Animated OBS Browser Source widget at /obs-signup-overlay.html.
Fetches recent signups from the public API and displays them one at a time as a fade-in/out
carousel (5s hold, 0.6s transition). Compact 360px footprint with live logo and member stats.
Twitch Panels + Stream Widget
6 branded Twitch panels (320×160px) generated from HTML with one-click PNG
export via html2canvas. A stream overlay widget per username embeds at
/widget/[username] and displays live profile stats.
API Surface (Selected Routes)
POST/api/rival/requestSend a rival request to another user
POST/api/rival/request/[id]/acceptAccept an incoming rival request
GET/api/rival/statusCheck mutual rival relationship status
POST/api/tournament/[id]/voteCast map pool vote in tournament match
POST/api/tournament/[id]/startStart match and send in-game DM invite
GET/api/cron/matchmakeVercel Cron — pair tournament contestants
GET/api/cron/rival-checkVercel Cron — poll scores, trigger snipe alerts
GET/api/cron/remindVercel Cron — timezone-aware pre-match reminders
POST/api/bot/authorizeBot OAuth initiation for in-game DM access
GET/api/notificationsFetch user notification feed with read state
GET/api/public/recent-signupsPublic CORS-open feed of recent members (OBS overlay)
POST/api/syncRe-sync osu! profile stats from the osu! API
GET/api/widget/[username]/dataPublic widget data endpoint for stream overlays
POST/api/teams/[tag]/applySubmit application to join an osu! team
GET/api/lobby/dm-statusCheck if bot DM is available for lobby invites
Architecture
Data Flow
Browser → Next.js App Router (Vercel) — RSC pages fetch data server-side via Prisma;
interactive components are Client Components. API routes handle mutations and external API calls.
Prisma → Supabase PostgreSQL as the single source of truth for users, rivals,
tournaments, notifications, and team data. osu! API is the authoritative source
for live player stats and active multiplayer lobbies.
Authentication Model
Primary session: osu! OAuth via NextAuth with JWT strategy.
Secondary integrations: Discord and Twitch each have their own OAuth callback routes
that store tokens independently — users stay logged in with osu! while linking additional accounts.
Bot token: separate osu! OAuth scope that authorizes in-game DM sending, stored
per-user in the database and refreshed automatically.
Background Jobs
Three Vercel Cron jobs run on schedules:
matchmake (pairs tournament contestants),
rival-check (polls osu! API for snipeable scores and fires DM notifications),
and remind (sends timezone-adjusted pre-match reminders via in-game DM).
All three are idempotent and guarded against duplicate runs.
Resume-Ready Accomplishment Bullets
These are extracted highlights suitable for use directly on a resume or in a cover letter. Adjust metrics as they grow.
- Co-founded and sole-engineered osu!friends, a full-stack rival matchmaking platform built with Next.js 14, TypeScript, Prisma, and Supabase, growing to 30+ active users within one week of launch (now maintained as an open-source portfolio project with a live demo)
- Designed and shipped a real-time multiplayer lobby finder that queries the osu! API and filters results by skill bracket, giving players matched competition at their exact pp rank
- Built an automated score-sniping notification system using Vercel Cron Jobs and the osu! in-game messaging API — when a rival posts a notable play, their opponent receives a direct in-game challenge alert within minutes
- Implemented a multi-provider OAuth architecture using NextAuth.js, supporting independent osu!, Discord, and Twitch account linking in a single session without conflicts
- Engineered a tournament matchmaking engine with automated pairing, map pool voting, and bot-initiated in-game lobby invites — all deployed as serverless Vercel Cron routes with graceful failure handling
- Delivered MVP to production in under 7 days across 7 sprints, maintaining a CI/CD pipeline via GitHub + Vercel Pro with zero-downtime deployments
- Developed branded streaming content tools including an animated OBS Browser Source overlay and exportable Twitch panel assets, directly supporting streamer user acquisition
Build Timeline
June 22, 2026
Sprints 1–4 — Foundation
Project scaffold, osu! OAuth auth, player discover page, live lobby finder, osu! friends list, rival system (request / accept / compare card)
June 23, 2026
Sprints 5–6 — Social & Tournament Layer
Discord / Twitch OAuth, notification system, team pages + applications, tournament matchmaking with voting, bot token system for in-game DMs, timezone-aware reminders, live match section
June 28–29, 2026
Sprint 7 — Polish & Growth Tools
Nunito font, hero / nav styling, SVG logo system (pink tessellation + white ring border), osu! team banner/logo assets, Twitch panels with 1-click export, OBS signup overlay (fade carousel), site live feed fix
Now
Open-Source Portfolio Project
Co-founder departed; the project is no longer publicly operated. Codebase is open-sourced on GitHub with a live demo at osu-friends.vercel.app — no active users, kept as a proof of what was built and shipped in 7 days.