Store Tracker is a PWA behind the shared Authentik forward-auth provider.
When the session expires (Android Chrome evicts the PWA cookie), the same-origin
/api XHR is 302'd cross-origin and CORS-blocked, the app showed only a generic
"backend connection" error, and the service worker served the cached shell for
any navigation — so re-auth was impossible without clearing all site data.
Fix:
- App swaps to a "Session expired" screen on an auth error (axios error with no
response, or 401/403) while online. Its "Sign in" button unregisters the
service worker + deletes all caches before navigating (programmatic "clear
site data"), so the re-auth navigation reaches forward-auth -> Authentik.
- vite.config: navigateFallbackDenylist [/[?&]reauth=/] keeps the SW from
serving the cached shell for the re-auth navigation.
Same bug class fixed in books (#19), speedracer, and vpn-stats.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rXJ49eToZ6YFZzDYH8GXd
Adds group_burst (0/1) + burst_window_sec to the Store type and the
StoreModal editor. Drives finbot's Amazon burst-grouping: when ON, finbot
collapses rapid same-merchant charge bursts into one Firefly transaction
group; the optional idle window (blank = 180s) closes the group.
Backend INSERT/UPDATE carry the fields; GET is SELECT * so reads are free.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Added /api/stats to backend (returns route counts + total, respects
same search/category/route filters as the main query). StatsBar now
shows accurate counts across all records, not just the current page.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Manifest with standalone display, dark theme color, 192/512 icons.
NetworkFirst workbox strategy for API routes. Dockerfile uses
--legacy-peer-deps for vite-plugin-pwa peer dep conflict with Vite 8.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each store is a compact row with a route-colored left accent bar.
Tap to bloom open — smooth height animation, route-colored background
glow and border highlight, tags/meta/actions revealed. Rows stagger
in on load/filter change. No swipe gestures needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the card list on mobile with a swipeable rolodex. Current card
is full-size, neighbors are visible at edges with 3D perspective scaling.
Touch swipe or arrow buttons to navigate. Dot indicators for small sets,
X/total counter for larger ones. Filters still work — rolodex resets via
key changes when the store list updates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On mobile (< sm breakpoint) cards are always rendered regardless of the
view toggle. The toggle is already hidden on mobile — this makes the
rendering match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TagInput component shows selected tags as removable chips, autocompletes
from existing tags in the database, and allows adding new tags inline.
Enter/comma to confirm, Backspace to remove last tag.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>