WakaWars is a local-first coding leaderboard for friends, built as a macOS menu bar app with a shared backend.
- Tracks daily and weekly coding time using WakaTime.
- Ranks you against friends (and group members) with competitive leaderboard views.
- Supports private/friends/public visibility controls.
- Includes achievements, honor titles, coins, and a skin shop.
- Runs as a tray-first app on macOS with auto-update support.
apps/
server/ Elysia API + Prisma + PostgreSQL
wakawars/ Electron menu bar shell (main/preload)
wakawars-web/ React + Vite renderer UI
packages/
shared/ Shared types + leaderboard helpers
- Runtime/package manager: Bun workspaces
- API: Elysia (
/wakawars/v0) - DB: PostgreSQL + Prisma
- Desktop: Electron +
electron-builder+electron-updater - UI: React + Vite + Framer Motion
bun installcp apps/server/.env.example apps/server/.envapps/server/.env needs a PostgreSQL DATABASE_URL.
bun run --filter @molty/server prisma:migratebun run --filter @molty/server seed:skinsbun run devThis starts:
- API server at
http://localhost:3000 - Renderer dev server at
http://localhost:5173 - Electron menu bar app connected to those services
Base path: /wakawars/v0
GET /sessionPOST /session/loginPOST /session/logoutPOST /passwordPOST /usernameGET /configPOST /configPOST /visibilityPOST /competition
POST /friendsDELETE /friends/:usernameGET /users/searchPOST /groupsDELETE /groups/:groupIdPOST /groups/:groupId/membersDELETE /groups/:groupId/members/:username
GET /stats/todayGET /stats/yesterdayGET /stats/historyPOST /stats/refreshGET /stats/weeklyGET /achievementsGET /achievements/:username
GET /walletGET /shop/skinsPOST /shop/skins/:skinId/purchasePOST /shop/skins/:skinId/equip
Session auth uses x-wakawars-session.
- Daily source:
GET https://wakatime.com/api/v1/users/current/status_bar/today - Weekly source:
GET https://wakatime.com/api/v1/users/current/stats/{range} - Auth: Basic auth with the WakaTime API key
- Server caches provider responses in memory to reduce request volume
- Background sync intervals:
- Daily sync loop: every 2 minutes
- Weekly cache loop: every 30 minutes
- Renderer auto-refresh: every 15 minutes
Run workspace tests:
bun run testRun renderer tests:
bun run --filter @molty/wakawars-web testBuild all packages:
bun run buildLocal package:
bun run --filter @molty/wakawars packPublish build (DMG + ZIP + update metadata):
bun run --filter @molty/wakawars dist- Auto-update feed:
https://core.molty.cool/updates - API base in packaged app:
https://core.molty.cool/wakawars/v0 - Notarization hook:
apps/wakawars/build/notarize.cjs
- API:
https://core.molty.cool/wakawars/v0 - Web renderer:
https://wakawars.molty.cool - Updates feed:
https://core.molty.cool/updates

