HomeProjectsHackathonsEventsWorkBlogTimeline

Building MyFit v3: The Full Story

6/16/2024
MyFitDevelopmentv3RetrospectiveSvelteKitPrisma

MyFit v2 was doing well by the time I decided to start v3. Too well, really — the traffic made the codebase's problems more visible. I'd rushed v2 to launch, skipping features and cutting corners that I told myself I'd fix later. "Later" turned into a growing backlog that I kept avoiding.

The decision to build v3 from scratch rather than patch v2 came down to the schema. V3 needed a different data model that couldn't be migrated incrementally without breaking existing users. That meant a clean slate.

The Initial Announcement

When I announced v3 was coming, I promised a two-month timeline. I was naive. I laid out an ambitious feature list:

  • Offline support
  • Automatic recovery suggestions and deload creator
  • Actual working analytics (v2's analytics were broken for most of its life)
  • Better progression algorithms

The two-month estimate didn't survive contact with my final diploma semester — basketball, hackathons, college events, and exams all happened simultaneously.

The Beta

A beta version did ship and got real users testing it. Watching people open GitHub issues, report bugs, and request features was genuinely motivating in a way I didn't expect. Closing issues one by one while engaging with the community has a different kind of satisfaction than just building in isolation. The positive feedback when issues got resolved made me want to work on the app.

But the beta also revealed something uncomfortable: the code quality was deteriorating. I was making the same mistakes as v2 — rushing, accumulating technical debt, spaghettifying the codebase. The beta shipped, but it wasn't something I was proud of. So I slowed down.

The Delay

Almost half a year after the initial announcement, I posted an update that amounted to: "I don't know when this will be done, and I'm not going to guess."

The tech stack needed to change. I'd been working with MongoDB and REST API endpoints, but the type safety was weak and the code duplication was painful. I made the decision to switch to:

  • Prisma with Neon PostgreSQL — for proper joins, type safety without duplication, and better performance at scale
  • shadcn-svelte — replacing DaisyUI, which I'd found limiting for complex UI patterns
  • Svelte 5 — once the ecosystem caught up to support runes properly

The decision to change the stack mid-project is the kind of thing that looks like procrastination from the outside but felt necessary from the inside. Starting fresh on the foundation meant the features on top would be built on something solid. V2's problems came from a weak foundation; I wasn't going to repeat that.

At the time of the delay announcement, v2 was pulling 10,000+ views per month. That number both validated the project and made the pressure to ship v3 worse. I had to actively resist the urge to rush.

Progress, Finally

By mid-2024, with exams done and a month of free time, I dedicated nearly every day to v3. The new stack was working well. The foundational work on exercises and mesocycles was nearly done; workouts were next.

Some of the features I got working that I was genuinely excited about:

  • Drag and drop for exercises — something users had requested since v1
  • Exercise search with one-click add — reducing friction in the most common operation
  • Change split mid-mesocycle — without losing workout history, which was technically tricky
  • Meaningful analytics — actually tracking what mattered, not just volume graphs that didn't tell you anything useful

The tech stack decisions paid off. Switching from REST to tRPC gave end-to-end type safety across the client and server with almost no boilerplate. Prisma's relational model handled the complex joins that MongoDB was making awkward. Svelte 5 with runes made the reactive UI code cleaner than anything I'd written before.

What I Learned

The biggest lesson from v3 is that rushing a launch creates a debt you pay later. V2 shipped fast and got users, but the codebase became a liability within months. V3 took longer but launched as something I was actually proud of — and the foundation held up when features were added on top of it.

The second lesson is about community motivation. Having real users who care enough to open issues and give feedback is genuinely different from building in a vacuum. The MyFit community made v3 better and kept me working on it through the delays.

The stable release came in October 2024. Users could migrate their data from v2 using a built-in migration tool. The app is at my-fit-v3.vercel.app — and this time, it works as advertised from day one.