Noureddine RAMDI / Lyftr: a self-hosted fitness tracker using a single SQLite file backend

Created Mon, 06 Jul 2026 15:15:52 +0000 Modified Mon, 06 Jul 2026 15:16:10 +0000

Cawlumm/lyftr

Lyftr takes a different approach to fitness tracking apps by ditching cloud sync and external databases. Instead, it stores all your workout, nutrition, and weight data in a single SQLite file, making it easy to own and move your data. It’s designed to run on minimal hardware like a Raspberry Pi 4 or a small VPS, offering a modern, mobile-first UI without the complexity of multi-service backends.

What lyftr does and how it is built

Lyftr is a full-stack fitness tracking application with a strong focus on self-hosting and zero external dependencies. The backend is written in Go using the Gin web framework, which provides a lightweight and high-performance HTTP API server. The frontend is built with React and TypeScript, styled with Tailwind CSS, and bundled with Vite for fast development and optimized builds.

All user data—including workout logs, nutrition tracking, and weight history—is stored in a single SQLite database file. This design eliminates the need for a separate database server or cloud services, simplifying deployment and maintenance. The SQLite file is suitable for local or remote hosting and can be backed up or migrated easily.

On initial startup, Lyftr seeds over 800 exercises automatically from free-exercise-db, giving users a rich catalog without manual setup. The UI is designed to be mobile-first, ensuring usability on phones and desktops. The app also offers a live demo that resets hourly with preloaded data.

Docker is the deployment vehicle of choice, with multi-architecture support enabling Lyftr to run on platforms from Raspberry Pi 4 (2GB RAM recommended) to cloud VPS. This containerized setup reduces environment inconsistencies and streamlines updates.

Architectural tradeoffs and technical strengths

The standout architectural decision is the use of a single SQLite file without any external synchronization or cloud integration. This zero-sync architecture is a clear tradeoff:

  • Simplicity and portability: Keeping everything in one file means you can easily back up, move, or inspect your data without dealing with migrations or database servers. This suits personal or small-scale users who want full data ownership.

  • Limited multi-device sync: Without built-in syncing, using Lyftr across multiple devices requires manual file transfers or external sync solutions, which might not be ideal for all users.

  • Lightweight and resource-friendly: SQLite’s minimal footprint paired with Go and React allows the app to run on low-powered devices like a Raspberry Pi 4 or budget VPS, something cloud-dependent apps can’t match.

  • Modern UI with practical UX choices: The frontend uses React with TypeScript and Tailwind CSS, built via Vite for fast refresh and optimized bundles. While the app is mobile-first, it stops short of full progressive web app (PWA) status — it does not explicitly implement offline caching or service workers, but it remains responsive and accessible on mobile browsers.

  • Docker volume persistence: The SQLite file is stored in a Docker volume, ensuring data persists through container restarts and updates. This also means the user needs to manage Docker volumes properly for backup and migration.

  • Security considerations: Users must set a strong JWT_SECRET environment variable to secure authentication tokens. The .env file approach is standard but requires careful management, especially in multi-user or exposed environments.

Under the hood, the Gin framework offers a robust API foundation with relatively low overhead. The React frontend’s use of Tailwind CSS keeps styles modular and maintainable.

Quick start with Docker

Lyftr’s installation is designed to be as straightforward as possible, requiring no build steps or Go environment setup. You just need Docker and Docker Compose.

curl -o docker-compose.yml https://raw.githubusercontent.com/Cawlumm/lyftr/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/Cawlumm/lyftr/main/.env.example

After downloading the configuration files, edit the .env and set a strong JWT_SECRET (32+ characters) to secure the app:

# in .env
JWT_SECRET=your-very-strong-secret-key

Then launch the app:

docker compose up -d

Once running, open http://localhost in your browser (or replace localhost with your server IP/domain if on a VPS) and create your account.

This zero-build Docker approach makes it easy to deploy on various platforms without worrying about dependencies or compilation.

Verdict: who should consider lyftr?

Lyftr is best suited for fitness enthusiasts who want full ownership and control over their data without relying on cloud services. Its single SQLite file backend and containerized deployment make it ideal for self-hosters running on modest hardware like Raspberry Pi or budget VPS.

If you need multi-device automatic syncing or a rich ecosystem of cloud features, Lyftr doesn’t yet cover those bases. It’s currently in beta (v0.1.0-beta.1), so some rough edges and missing features are expected.

For users tired of paywalled apps or those concerned about privacy and data portability, Lyftr offers a well-constructed, minimal-dependency alternative with a modern front-end experience. The code is surprisingly clean for a beta, and the Docker-based deployment is a solid plus for operational simplicity.

Just remember to handle the Docker volume and environment variables carefully for persistence and security. Overall, Lyftr is a practical, opinionated fitness tracker for self-hosters comfortable with Docker and seeking data independence.


→ GitHub Repo: Cawlumm/lyftr ⭐ 131 · TypeScript