← Back to lukerobell.com

osu!friends

Rival matchmaking & community platform for osu! players
Open Source Demo · osu-friends.vercel.app Co-founder & Full-Stack Developer Next.js 14 · TypeScript · Prisma · Supabase Launched June 2026 · Now Solo-Maintained
30+
Peak Users (2026)
7
Dev Sprints
35+
API Routes
<7d
MVP to Launch
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.
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.

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.