← dani vilanova / projects / webbed
paused · aug 2026

WEB/BED

The same short workout every day, with a group of friends. Two leaderboards, one for showing up and one for going hard, so beginners do not quit on day three.

built in
40 hours
commits
41
with
Nico
status
paused
§01

why

motivation

Nico and I worked out that the only way we would keep training was competing. So we built the place to compete: the same short workout every day, your friends on the board next to you.

§02

the two boards

the design decision

The whole thing turns on one problem: if you rank people by how much they lift, the beginner is last on day one and gone by day three.

So there are two boards. Consistency pays the same ten points to everyone who finishes a round, whatever their level, plus a streak bonus. Performance multiplies rounds by your level. A beginner can lead the board that matters just by turning up, and the competitive half lives somewhere it cannot discourage anyone.

Streaks never reset between seasons, even though the points do.

§03

stack

verified
frontend
Next.js 15 · React 19 · CSS Modules, no Tailwind
backend
Supabase, service key server side only, RLS denies the client
identity
No login. A device token, so nobody has to make an account
notifications
Web push with VAPID, as a PWA
hosting
Vercel, functions pinned next to the database
§04

what it looks like

archived screenshots
webbed / today
The daily mission, eased to your level. Captured locally.
The daily mission, eased to your level. Captured locally.
webbed / the web
The leaderboard is a web. Distance from the centre is rank, and every thread holds.
The leaderboard is a web. Distance from the centre is rank, and every thread holds.
§06

links

what is public
§05

where it is now

paused

Written in 41 commits over about 40 hours, then nothing.

It has not really worked. We are not using it, which is its own kind of result for an app whose entire job was motivation.