2ebfc7046d
fix: fallback to direct file fetch in ActivityDetailLoader
Davide Scaini
2026-04-13 13:04:46 +02:00
1587d1cdf3
- brut: _merged/index.json has 586 activities — the count when merge_all last ran. The SSE rebuild bug (already fixed) meant it never re-ran after the full Strava sync added 3256 more. - danilo: _merged/ is 8 KB — basically empty. merge_all likely ran concurrently (multiple file uploads trigger multiple rebuilds without a lock in --no-build mode), causing a race where shutil.rmtree(merged_acts) from one run wiped what another run was writing.
Davide Scaini
2026-04-13 12:35:05 +02:00
7b37f45180
Bug fixed — temp ZIPs now go to /tmp/ (system temp) and are always deleted in a finally block, so they can't leak. A startup hook also auto-cleans any leftovers on next server restart.
Davide Scaini
2026-04-13 12:24:59 +02:00
79e428ff0f
script to rebuild pages
Davide Scaini
2026-04-12 19:48:13 +02:00
d659b90cd9
- DELETE /api/admin/users/{handle}/activities — deletes all activities/*.json, wipes _merged/ and index.json, then triggers a rebuild. Admin-only. - /admin/ page — lists all users, each with a "Delete activities" button. Clicking asks for confirmation in a <dialog> before firing the request. Button shows "Deleted (N)" or an error inline. - "Admin" nav link — appears in the top-right for admins only, hidden for everyone else.
Davide Scaini
2026-04-12 17:46:28 +02:00
82830222ba
For users uploading: - POST /api/upload now returns text/event-stream instead of JSON - Per-file progress events stream back as each file is processed: ↓ 3/47 (6%) — morning_ride.fit - Final done event shows the summary: "12 added, 35 duplicates" - The Vite proxy is configured to stream this properly (no buffering)
Davide Scaini
2026-04-11 08:33:21 +02:00
cbd5a98cd3
- merge.py: keep private activities in _merged/index.json instead of stripping them; privacy filtering is now done client-side - ActivityFeed: detect logged-in user via bincio:me event; show private activities only when viewing your own profile; private cards get a lock badge
Davide Scaini
2026-04-10 23:16:38 +02:00
c99b755382
The culprit is in renderChart(): it calls chart?.remove() which empties the container div, causing the layout to collapse to zero height for a moment. The browser then scrolls to keep the viewport anchored, but since the page got shorter it jumps to the top. When the new SVG is appended, the page is taller again but the scroll position was already reset.
Davide Scaini
2026-04-10 22:58:34 +02:00
bc30e0a2fc
option to keep all activities private from strava zip, fix copy of register link
Davide Scaini
2026-04-10 22:51:29 +02:00
da622131fd
upload zip archive from strava
Davide Scaini
2026-04-10 22:26:11 +02:00
fc6c00c6eb
fix: mobile nav scrolls horizontally without spilling to page width
Davide Scaini
2026-04-10 22:05:42 +02:00
3b8bc159c5
upload strava zip
Davide Scaini
2026-04-10 22:01:44 +02:00
e5eadc69f2
fix: remove double px-4 on user profile page headers
Davide Scaini
2026-04-10 19:20:00 +02:00
9fd088c693
- "Last sync: never": The old blocking sync was killed by nginx at 120s before save_token was reached. The activities made it to disk (ingestion happens per-activity as it goes), but the token's last_sync_at timestamp was never written. After deploying, do a soft reset — it'll set last_sync_at to your most recent activity's timestamp so the next sync only fetches newer ones. - Reset 404: Added POST /api/strava/reset to serve/server.py. The soft reset now looks in _merged/index.json first (multi-user path), falling back to index.json.
Davide Scaini
2026-04-10 18:34:53 +02:00
816f103b4c
fix: write empty index.json for new users at registration so shard resolves immediately
Davide Scaini
2026-04-10 18:20:35 +02:00
3e4ff4019b
limit number of workers
Davide Scaini
2026-04-10 18:13:49 +02:00
e2765ea012
fix for strava auth
Davide Scaini
2026-04-10 18:01:32 +02:00
f67e7552fd
fix to strava sync
Davide Scaini
2026-04-10 17:55:24 +02:00
eeed3fe3b2
Root cause of the 404: _trigger_rebuild was firing bincio render (= full astro build), but: 1. The build took minutes → 404 during that window 2. Even after the build, the output lands in site/dist/ — nginx serves from /var/www/bincio/ which is only updated by the rsync in the post-receive hook, not by the server process
Davide Scaini
2026-04-10 17:48:23 +02:00
61349e6292
fix: resize map before fitBounds and defer with rAF to avoid layout-timing glitch
Davide Scaini
2026-04-10 17:44:52 +02:00
a20df6bd57
fix: hide community stats/tree on about page for non-logged-in users
Davide Scaini
2026-04-10 17:40:16 +02:00
96a3deee5d
fix: serve data/ from disk via nginx alias; return full athlete data from API
Davide Scaini
2026-04-10 15:57:23 +02:00
ae883a7dba
fix: rebuild athlete.json on every ingest; remove bincio-extract references from UI
Davide Scaini
2026-04-10 15:47:50 +02:00
f8e02f3da2
fix: athlete page falls back to /api/athlete when static file not yet rebuilt
Davide Scaini
2026-04-10 15:43:01 +02:00
6a8ef984cb
fix: GET/POST /api/athlete work without a pre-existing athlete.json
Davide Scaini
2026-04-10 15:37:05 +02:00
f790deb54f
fix: athlete page shows empty state instead of error when athlete.json missing
Davide Scaini
2026-04-10 15:35:41 +02:00
8d8b009a78
fix: use shutil.which to find uv in _trigger_rebuild; never 500 on rebuild failure
Davide Scaini
2026-04-10 15:33:06 +02:00
7088b94a87
fix: bincio init always sets private:true even if index.json already exists
Davide Scaini
2026-04-10 15:26:11 +02:00
27f94cf581
fix: respect instancePrivate when determining single-user mode in Base.astro
Davide Scaini
2026-04-10 15:19:41 +02:00
6d3673b2f7
1. Image upload size limit — _MAX_IMAGE_BYTES = 10 MB in both serve/server.py and edit/server.py 2. Image MIME type whitelist — _ALLOWED_IMAGE_TYPES blocks SVG XSS in both servers 3. Filename collision safety — _unique_image_name() helper in both servers 4. OAuth CSRF — state token generated in edit/server.py auth-url, stored in _oauth_states, validated and discarded in callback; strava_api.auth_url() accepts optional state param 5. Error message leak — upload processing errors now return generic "Processing failed" instead of exception type/message 6. Handle injection in subprocess — _trigger_rebuild now asserts handle matches _VALID_HANDLE before passing to subprocess
Davide Scaini
2026-04-10 13:54:50 +02:00
8b7cdd9ed1
explain invitation system
Davide Scaini
2026-04-10 13:42:00 +02:00
053da10ab9
some basic statistics and invite tree, plus watch new data
Davide Scaini
2026-04-10 13:21:31 +02:00
6b2d31a44a
test server imports
Davide Scaini
2026-04-10 13:06:00 +02:00
f37e898eb5
about page
Davide Scaini
2026-04-10 13:05:51 +02:00
469a5954cc
"keep data on the server" opt-in/out
Davide Scaini
2026-04-10 13:01:21 +02:00
683b7d9c1b
limit max number of users
Davide Scaini
2026-04-10 12:35:34 +02:00
b4acf8c1a6
populate pages when a new user joins
Davide Scaini
2026-04-10 12:35:34 +02:00
cbac82a2ba
Fix 1 — new user pages 404 (server.py:228): After registration creates the user's directories, it now calls _write_root_manifest(dd). This rewrites index.json to include the new handle's shard immediately. Since Astro dev re-evaluates getStaticPaths() on every request (reading that file), /u/pres/, /u/pres/stats/, and /u/pres/athlete/ will resolve correctly as soon as the new user navigates there.
Davide Scaini
2026-04-09 21:44:38 +02:00
fb202b4edf
Record / Convert tabs — now gated behind PUBLIC_MOBILE_APP=true. Hidden by default in VPS/dev mode; only show when explicitly opted into the mobile app build.
Davide Scaini
2026-04-09 13:16:00 +02:00
2501c9e0f6
added some data to facilitate debugging... to be decided wether to publish this data or not in github
Davide Scaini
2026-04-09 13:03:19 +02:00
50cdeb3b6e
ActivityFeed — replaced the <button> inside <a> (invalid HTML, unreliable) with the stretched-link pattern: the card is now a <div>, the title <a> carries a ::before pseudo-element that covers the whole card making it clickable, and @handle is a proper <a> with z-index: 10 sitting above the stretched link. Clicking the handle navigates to /u/{handle}/; clicking anywhere else navigates to the activity.
Davide Scaini
2026-04-09 12:32:22 +02:00