BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Track, import, and analyze your barbell lifting data. Merge app exports into a Google Sheet you own, then explore PRs, 1RM calculators, and visual insights.
Sports & fitnessJavaScript · CSSGitHub @wayneschullerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A strength progress visual tracker and other support utilities for strength lifters, powerlifters, crossfitters and new lifters.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Interactive strength progress visualizations for barbell and other gym lifts
Strength Journeys is a free, open-source web app to visualize your barbell lifting data from Google Sheets. Privacy-first — your lifting data is never stored on our servers. All analysis happens client-side in your browser. Chalk not included.Read the full README ↗Strength Journeys is a free, open-source web app to visualize your barbell lifting data from Google Sheets. Privacy-first — your lifting data is never stored on our servers. All analysis happens client-side in your browser. Chalk not included.
Powerlifters and barbell weirdos will love this app, but our real target audience is the novice. If we can help someone start barbell training and keep them going for ten years, their life and their family will be transformed. Barbell strength training is one of the most effective things you can do for your health, longevity, and quality of life. Stronger people are harder to kill, more useful in general, and tend to live longer.
Requires user data in a Google Sheet with columns: date, lift type, reps, weight (kg or lb).
Strength Journeys asks for exactly one Google scope: drive.file. This is Google's per-file scope, and it is the narrowest one that allows an app to write. It means:
You can revoke access at any time from your Google account permissions, and your sheet stays exactly where it is — it is your file, in your Drive, and it remains readable without this app.
Open our sample data format in Google Sheets (click File menu, then 'Make A Copy').
Your lifting data is never stored server-side. Google Sheet reads and writes are authenticated via Google OAuth and go through a Next.js API route proxy, but the rows are parsed and analyzed entirely client-side in your browser. The app does not persist your training data in a database — your Google Sheet remains the only copy.
The server does keep a small operational record per account (sign-in timestamps, which page you signed up from, the id of the sheet you linked, and when it was last read) so that onboarding, sheet recovery, and support requests work. It holds no lifts, no weights, and no analysis.
Framework & language:
UI & styling:
Data visualization:
Auth & data:
drive.file scope only, so read/write access is limited to the single linked sheetAI features:
Content & SEO:
content/articles/, rendered to HTML at build timeSee package.json for the full list of dependencies.
This repo has grown into a multi-tool lifting app (home dashboard, visualizer, session log, calculators, AI assistant, playlists, articles) that shares a common app shell and lifting-data pipeline.
src/pages/ — Next.js Pages Router routes (tool pages, article pages, API routes)src/pages/_app.js — global providers + app layout wrapper (theme, auth, lifting data, athlete bio, timer)src/components/ — feature UI and shared UIsrc/components/home-dashboard/ — home dashboard cards (PRs, heatmaps, session highlights)src/components/visualizer/ — charting + visualizer UIsrc/components/ui-shell/ — app shell: layout, nav, footer, theme provider and backgroundssrc/components/ai-elements/ — the ai-elements chat pieces the AI assistant uses (add more from the upstream registry when needed)src/components/ui/ — shadcn/Radix-based primitivessrc/hooks/use-userlift-data.js — central Google Sheets fetch/parse/cache context (SWR + demo mode + derived metrics)src/lib/import/import-dispatcher.js — the single parsing entry point: parseData() for Google Sheets rows, parseImportedFile() for drag-and-drop CSV/XLSXsrc/lib/import/ — file decoding, dedupe, import profiles and provenance; src/lib/import/parsers/ holds one parser per supported export format plus shared normalize helperssrc/lib/processing-utils.js — shared processing/aggregation helpers (PRs, tonnage, timing logs, unit conversion)src/pages/api/sheet/read.js — authenticated Google Sheets + Drive metadata proxysrc/pages/api/sheet/ — the rest of the sheet surface: linking, provisioning, and the operation-oriented write routessrc/pages/api/auth/[...nextauth].js — NextAuth Google OAuth setup + token refreshsrc/lib/articles.js — markdown article store: frontmatter, build-time HTML and related-article helpersnext-auth) and picks a spreadsheet.use-userlift-data fetches /api/sheet/read via SWR.parseData() normalizes rows into canonical lift entries.src/pages/<tool>.js, then add/adjust feature components under src/components/<feature>/src/lib/import/parsers/strength-journeys-parser.js and the shared parser-utilities.jssrc/components/, src/components/ui/, src/styles/globals.csssrc/lib/import/parsers/ (copy the shape of hevy-parser.js), then register its detection in import-dispatcher.js. There is a regression script for this — npm run validate:imports, which checks synthetic sample rows kept inside the scripts in scripts/stable — Production branch. Deploys to strengthjourneys.xyz.main — Development branch. Deploys to a Vercel preview URL for testing. Has informative console logging of processing timings and any errors.main and deleted after merging.Strength Journeys unites and extends features from earlier projects by the same author:
content/articles/ is licensed under CC BY-SA 4.0. Images, quotations from other authors and the Strength Journeys name and logo are not covered. See content/LICENSE.md for how to credit an article and the full exclusions.