Projects

WeighIn

A weight-loss and step challenge for a group of friends, with numbers that actually tell you something. No subscription, no account, one SQLite file.

Status
Active
Started
Aug 29, 2026
Source
github.com/idlewatts/weighin

My friends and I kept trying to do this — get healthier together, keep each other honest, run a weight-loss challenge — and kept hitting the same wall. The apps were a pain to actually use. Half of them put something basic behind a subscription. And none of them showed the numbers in a way that made any sense: you'd get to the end of a week with no real idea who was ahead, or whether you personally were drifting.

The encouragement part is the whole point, and it's the part that needs decent numbers to work at all. So I built the version I wanted: one Node process, one SQLite file, no npm dependencies, running on a box we control.

How it works#

Everyone picks a start date and a group goal — say 3% of body weight by a target date — logs a weight once a week, logs steps whenever they feel like it. The app works out who is winning and who is drifting, which is the bit the other apps never got right. A leaderboard is only motivating if you can tell at a glance where you stand.

The first person to open the page gets the setup screen: group name, dates, goal percentage, weekly step target, and the group password. After that the setup screen is gone for good.

Your friends need the URL and that password. They enter it once, then either tap their name or create a profile with a starting weight and their preferred units — pounds or kilos, per person, because that argument isn't worth having. A year-long cookie remembers them after that.

Running it#

Node 22.5 or newer, because it uses the built-in node:sqlite module. That's the only requirement — there's genuinely nothing to install.

node server.js

Then open http://localhost:8080. On Windows you can double-click start.bat.

Letting people outside your house reach it#

It binds to all interfaces, so on your own Wi-Fi the Network: URL printed at startup is enough. From outside, the options I'd actually recommend are Tailscale (simplest, stays private) or a Cloudflare Tunnel (an HTTPS address with no port forwarding).

NOTE

Put it behind HTTPS if it's reachable from the internet. The session cookie is HttpOnly and SameSite=Lax, and picks up Secure automatically once requests arrive over HTTPS — so plain HTTP on your LAN still works fine.

Full setup, the flags and environment variables, and a deployment walkthrough are in the repo. MIT licensed.