BACK
Product & engineering · 2026

studytrack

A Discord study tracker rebuilt as a realtime web app, built around the difference between what people planned and what actually happened.

  • TanStack Start
  • Convex
  • Clerk
  • discord.js

In 2020 I built a Discord bot that tracked time spent in study voice channels. Around twenty people used it daily, and they taught me something I did not expect: the feature I was proud of went unused, while the parts that made study visible and slightly competitive carried the product.

The redesign existed as UX/UI work in 2023 and was never built. In October 2026 I started again, this time as a realtime web application.

The domain decision

The bot recorded sessions. A planner needs to distinguish two things that look similar in a database and are completely different in a product:

  • a work session: what a voice channel actually recorded, evidence of time spent;
  • a plan block: what a member intended to do, which never becomes evidence.

Keeping them separate is what lets the app answer "what did I plan versus what did I do" without pretending an intention is a fact. That distinction is written down in the repo's glossary and its architecture decision records.

The build

  • TanStack Start with React 19 for the web app, file routes and SSR.
  • Convex as the backend, database and realtime layer, shared by the web app and the bot.
  • Clerk for authentication, wired to Convex with Discord sign-in.
  • discord.js gateway bot that joins voice channels and reports events to Convex.
  • Tailwind v4 + shadcn for the interface, Vitest for tests.

The repository carries a glossary, an adr/ directory and a written decisions handoff, more process than most side projects, and the part I would keep if I had to cut everything else.

Status

Running on my own NixOS server. Use is beginning and I am the main user, so this is a product in progress rather than a product with traction.

The honest version: it took three attempts across six years, and the thing that made the third one possible was having both the engineering experience and enough capacity to build the version I had designed.

Source on GitHub

NEXT CASE STUDY

This site