All projects

Android app · in progress

Megin

A training and habits app for one person: me. It logs workouts, water and the habits of the day, and reads the previous sessions to suggest the load for the next one.

Megin is Old Norse for strength; the mark is ᚢ, Uruz, the rune of the aurochs.

React Native · Expo · TypeScript · Supabase · PostgreSQL

What it does

Today
The day at a glance: the workout in progress, water against a goal set from body weight, and the habits still open.
Workout
Sets logged with two steppers, kg and reps, and the effort beside each one, in reps in reserve (RIR). Every exercise has its demonstration GIF a tap away.
Habits
Daily habits with an optional goal, like 20 pages or 10 minutes, the current streak and a week grid.
Report
Body weight over time, volume per week and the next workout, with the suggested load for each exercise.

Screens

  • Sign-in screen with the Megin wordmark, the Uruz rune and a faint aurochs drawing behind email and password fields.
    Sign in
  • Today screen: a workout in progress banner, a water ring at 1.4 of 2.8 litres with +200, +250 and +500 ml buttons, three habits with streaks, and the day's sets and volume.
    Today
  • Workout screen at 34 minutes: bench press with two logged sets, kg and reps steppers and a Log set button, and a rowing exercise with its demonstration GIF area.
    Workout in progress
  • Exercise picker sheet: a search across 1,324 exercises, muscle group filters and a list with favourites starred.
    Exercise picker
  • Habits screen: a 41-day longest streak, today's habits with goals in minutes and pages, and a week grid of orange squares for each habit.
    Habits
  • Report screen: body weight at 78.4 kg on a falling line chart, the next workout with suggested loads, and weekly volume bars.
    Report

The load suggestion

For each strength exercise the app looks at the last two sessions. If every set reached the top of the rep range, it suggests adding the exercise's increment. If the reps fell more than three below the target, it suggests reviewing the form before adding weight. Otherwise, it keeps the load. It is a SQL view, so the rule is the same on every screen that shows it.

Decisions

  • The 1,324-exercise catalogue ships inside the app (0.4 MB), not in the database. It is public data, the same for everyone, so searching it should not need the network.
  • Screens never talk to Supabase. Every query lives in one hook per domain, so changing a chart or adding an export touches one place.
  • Sign-up and password reset use a 6-digit code instead of a link. A link has to find its way back into the app, and fails silently when the email is opened on a computer.
  • Row-level security on every table, and account deletion from inside the app, as Google Play and Brazil's data protection law (LGPD) require.