Vibe code your own Strava
Vibe code your own Strava as activities and a weekly total. The plan is $11.99 a month. Segments, live tracking, and the social graph stay on the long row.
You can vibe code your own Strava as activities and a weekly total. Strava is that product. The catalog line is “A run, a ride, and a number you can add up.”
The card lists $11.99 a month. Annual is $79.99. Family is $139.99 a year, and Strava plus Runna is $149.99 a year. Taxes are outside the note. The first estimate is 8 hours. The card marks it Weekend. The verdict is “The log, not the social graph”.
Last time I wrote about vibe coding your own Granola. That was a teardown. This one is a regular backlog topic. Segments, live tracking, and a social feed stay on the skip row.
Vibe code your own Strava from one week
The Strava page splits the work into three rows.
The first row is 8 hours. Activities, weekly totals, and a month view. You type the sport, the day, the distance, and the time. The week adds itself up.
The second row is 3 days. A GPX import, routes, and a year heatmap. A file of GPS points can wait until the typed log already matches the week you remember.
The third row is 1 month and up. Segments, live tracking, and the social graph. The table labels that row as the part you should skip.
If you tell an agent to “clone Strava”, it aims at the third row. Copy the prompt, then pin it to the first one.
Store Activity, Sport, WeekTotal, and ImportFile. The card names all four. For these 8 hours, Activity is the table. Sport is a column on it, run or ride. WeekTotal is a query, not a row you edit. ImportFile arrives with the GPX.
An activity is one outing. Local date, sport, distance in meters, duration in seconds, and a note. A sport is that label. A week total is the sum of the activities whose dates fall in the week. An import file is a GPX you preview before anything is saved.
The audience is one person logging runs and rides for weekly distance. The goal on the card is to record activities, see the week, and review the month, without a social network. The same v1 also stands in for TrainingPeaks and Final Surge. The card lists both and does not give them prices.
A daily check-in, with no distance, is Habitify at $2.49 a month. A food diary is MyFitnessPal at $19.99–$24.99 a month. Hours on client work are Toggl Track at $9–$18 a month, in Build a Toggl alternative. Those are other logs. This one is meters and seconds.
The guardrail is the rule you paste into the prompt. Store distance as integer meters and duration as integer seconds. Compute week totals on the server. Never treat the totals as coaching or medical advice.
How does a Strava alternative work
Jules trains in the week of Monday, November 2, 2026. She logs two outings.
Wednesday, November 4. Run. 5200 meters. 1680 seconds. Note, river path. That is 5.2 km and 28:00, and the stored numbers are the integers.
Saturday, November 7. Ride. 18400 meters. 2700 seconds. Note, east loop. 18.4 km and 45:00.
The week total is 23600 meters and 4380 seconds. 23.6 km and 1:13:00. Thursday, November 5, is empty, so today’s total is 0 meters and 0 seconds. The week still has Wednesday.
Your browser talks to one Astro app. Node.js plus Astro is the default. Use TanStack Start if React is your weekday language. The capability line on the card is Astro, HTMX, and D1. The form posts. The server writes the row and returns the week panel. A sum in the page can drift from the sum in the database the moment a second tab saves. One query is the number she sees.
The date is the local date she picked, stored as that calendar day. A timestamp converted to UTC will move a late Wednesday run onto Thursday for someone west of the server. The week is Monday through Sunday of those stored dates. That Monday start is the rule for this v1.
Today’s total uses the same dates. It is the activities whose local date is today in her timezone, which the page sends with the request. The server does not guess “today” from its own clock alone.
Distance stays meters. 5.2 in a float column will not add to 18.4 and land on 23.6 every time you round. 5200 plus 18400 is 23600, and the page divides by 1000 for display. Duration stays seconds for the same reason. 28 minutes stored as 28, next to a 45, is 73. Stored as 1680 and 2700, it is 4380, which is 73 minutes with the seconds still attached if a later activity has them.
Both sports sit in one total. The rows still show run or ride, so she can see what the week was. A per-sport pair is a group-by on that same table when she wants it.
Every query is scoped by owner. An activity id from another account returns an empty page. There is no public profile on this row.
Screens of a Strava alternative
v1 needs the form and the week. The month is the same rows, grouped by date. A map, a route, and a file picker can wait.
New activity
The form is sport, date, meters, seconds, and a note. Save is the only action. Jules is entering the Wednesday run.
The week
The week of November 2 lists both outings and the total. Today, November 5, is called out as empty. November’s month view is this list filtered to that month, one date at a time. The Wednesday row and the Saturday row are the only dates with anything on them.
How a week gets its total
Jules opens the form on Thursday and enters Wednesday’s run, because she forgot it yesterday. Save sends sport, the date 2026-11-04, 5200, 1680, and the note. The app inserts one activity. The response redraws the week. Wednesday appears. Today stays at zero. The week total becomes 5200 and 1680.
On Saturday she adds the ride. The same panel now shows 23600 and 4380. She did not type the total. If she edits the ride to 18000 meters, the week moves with that row, because the total is not a stored counter she could forget to update.
A delete removes the activity and the next read of the week no longer includes it. There is no separate WeekTotal row to get stranded.
GPX is the 3-day row. A track file has points with times. The preview shows a distance and a start, and she accepts before any activity exists. The accepted row is still integer meters and integer seconds, plus the local date of that start. Routes and a year of dots on a grid are the rest of that row. CSV export of the activities is on the card’s feature list and fits beside the import, once the screen totals are already right.
The month view for November is the activities with a local date in that month, ordered by date. Two dates have rows. The other days are blank, which is the point of looking.
Where a Strava alternative gets hard
Eight hours is a form and a sum. Enter the two outings and the week should read 23600 meters and 4380 seconds. Change the ride and the total should move. Delete it and the total should fall back to the run. Today’s zero on November 5 should stay zero.
GPX is the 3-day row because a track is a list of points, and the distance you show has to be computed and then stored as meters she accepts. A preview that writes the activity before she confirms will leave a bad row in the week. Routes are those points kept as a line she can open again. A heatmap is a year of dates with ink where she went. None of that is required to know the week.
Segments, live tracking, and the social graph are the month row. A segment compares one person’s GPS trace with everyone else who crossed the same stretch. Live tracking wants a device on the road, sending location while the outing is still happening. A feed wants follows. The non-goal names all three. The 8-hour log has one user, and the only numbers in it are the ones she typed.
Put the guardrail on the page once, next to the week, so 23.6 km reads as the sum of the rows she typed.
The scope post is the same three-row habit. The prompt post is where you paste the integer rule so the agent does not store 5.2 in a float and call the week done.
Start with the first row
Go to Build your own Strava. Copy the Astro prompt, or TanStack Start if that is what you write.
Tell the agent the first estimate only. Activities, weekly totals, and a month view. Eight hours.
Log the river-path run and the east-loop ride, and check the week against 23600 and 4380. If you need a segment, a live dot on a map, or kudos, keep the $11.99 plan for that part.