← Back to Projects
Project In Progress August 2026

RepStash

A fitness app that turns pasted social media exercise links into structured, AI-extracted exercise cards — a 'Paprika for Exercise Moves'.

FastAPI Python Strawberry GraphQL PostgreSQL SQLAlchemy Alembic Gemini API Next.js React TypeScript Tailwind CSS Shadcn UI Framer Motion Clerk Domain Driven Design Feature-Sliced Design

Summary

RepStash is a fitness storage app that lets you paste a social media exercise link (Instagram Reel, TikTok, or YouTube Short) and turns that into a structured exercise card using Gemini AI. You can then chose to share that excercise with a link to others (Excercise Card). Additionally, you can also share your “stash” to share.

Introduction

I wanted to have a centralized place between the three short form video platforms to store excercises I thought were interesting or that I wanted to try out. Having to go between the three apps was kinda of annoying, so that’s where this idea came from. I wanted one location that could store the excercises I wanted to try or implement into my routine.

From this idea came the AI portion. I had used a similar saving system for recipes in the past and wondered if I could just make it for workouts instead! Having the AI analyze the video and give step by step instructions is super helpful. Additionally, having the ability to share your excercise cards and your personal stashes was a feature that came about when working on through this.

I also structured this app to accept workout plans as well, so in the future, a user will be able to share their workouts from the collections of excercises they’ve stashed.

Architecture

The backend is FastAPI (async-native, Python 3.11+) exposing a Strawberry GraphQL API. Data lives in PostgreSQL, accessed through Async SQLAlchemy 2.0 with Alembic migrations. Ingestion jobs run on a Redis-backed task queue (Arq/Celery) so link processing doesn’t block the request cycle.

When a link comes in, httpx and yt-dlp pull metadata and stream video ephemerally in memory — nothing is written to disk. That buffer is handed to Gemini 2.5 Flash via the google-genai SDK with a Pydantic response_schema, which returns structured exercise steps, targeted muscles, and default set/rep/weight parameters. Every ingestion attempt — success or failure — is logged to an import_logs table with the raw payload and, on failure, the stack trace, so a bad scrape or anti-bot block never fails silently; it just drops the job to manual entry. AI API usage is tracked per-user to enforce daily limits.

The frontend is Next.js (App Router, React 18+, TypeScript strict mode) styled with a Solar Amber Tailwind theme, built with Shadcn UI components, and animated with Framer Motion. Authentication runs through Clerk. Both sides follow Domain-Driven Design and Feature-Sliced Design — domains like users, exercises, and imports stay isolated on the backend, and the frontend’s entities/features/widgets/shared slices keep GraphQL queries and view logic out of each other’s way.

Infrastructure

The application is deployed with a decoupled architecture:

  • Frontend: Hosted on Vercel for fast edge delivery of the Next.js application.
  • Backend: The FastAPI server and GraphQL API are hosted on Railway.
  • Database: The PostgreSQL database is hosted on Neon, taking advantage of its serverless capabilities.

Future

I intend to make this an actual app on the Google Play and Apple App stores eventually in React Native. One of the complications that has come up is the fact that Instagram is very strict scraping. Making this an actual mobile app will be able to punch through that issue and not rely on the server scraping the video information. Release is TBD, but I will start development on this and hopefully release it by end of August 2026 or beginning of Sept 2026!

Screenshots

Desktop

Mobile