summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* fix: include feed name in unsubscribe notificationHEADmainFuwn2026-02-122-2/+5
|
* feat: strip tracking parameters from entry URLs and filter tracking pixel imagesFuwn2026-02-123-2/+92
| | | | | | Strip UTM, fbclid, gclid, and other tracking query parameters from entry URLs at parse time in the Go worker. Filter out sub-3px tracking pixel images from sanitized HTML content via exclusiveFilter.
* fix: keep scroll position stable when entry list re-sorts after read state ↵Fuwn2026-02-121-6/+7
| | | | change
* fix: prioritise unread entries server-side so they appear in all-entries viewFuwn2026-02-124-33/+59
|
* fix: use singular "entry" in mark-as-read toast when count is 1Fuwn2026-02-121-1/+1
|
* feat: add drag-and-drop reordering for feeds, folders, and custom feedsFuwn2026-02-1212-299/+1089
|
* fix: invalidate unread counts when toggling individual entry read stateFuwn2026-02-121-0/+1
|
* feat: switch search_entries to trigram-based search with similarity rankingFuwn2026-02-121-7/+18
| | | | | | | Uses pg_trgm % operator instead of ILIKE for title/summary matching, enabling the existing GIN trigram indexes. Results are now ranked by similarity score. Threshold lowered to 0.1 for inclusive matching. Also adds owner_id filter that was previously missing.
* fix: prevent read entries from reverting to unread on re-fetchFuwn2026-02-125-10/+89
| | | | | | | | | | | | | | | | | Root cause: cleanup_stale_entries deleted read-but-unsaved entries from active feeds, then the Go worker re-inserted them with new UUIDs, orphaning the user_entry_states rows and making entries appear unread. - cleanup_stale_entries: skip feeds with active subscribers and preserve entries that have been read (not just saved) - Go parser: normalize GUIDs by trimming whitespace and stripping tracking query parameters from URL-based identifiers - Go writer: preserve original published_at on upsert instead of overwriting, preventing old entries from jumping to timeline top - get_unread_counts: apply same time boundary as get_timeline so ancient re-inserted entries don't inflate counts - Realtime listener: ignore INSERT events for entries older than 48h to suppress misleading "new entries" notifications from re-inserts
* Redump latest Supabase schemaFuwn2026-02-111-33/+42
|
* feat: add previous/next navigation buttons on mobile detail viewFuwn2026-02-101-9/+36
|
* fix: mark-all-read undo only reverts affected entriesFuwn2026-02-101-6/+10
| | | | | RPC now returns uuid[] of affected entry IDs. Undo passes those IDs back via p_entry_ids so only entries that actually changed are reverted.
* fix: query entry state directly instead of relying on unfiltered timelineFuwn2026-02-103-11/+38
| | | | | | The detail panel called useTimeline() with no args, creating a separate cache from the entry list's filtered query. Entries not in the first 50 of the global timeline had isSaved/isRead stuck at false.
* fix: let display density apply to main content panelFuwn2026-02-101-1/+1
|
* fix: exclude hidden feeds from total/folder unread counts onlyFuwn2026-02-102-9/+12
| | | | | | Reverts the DB-level filter so individual hidden feeds still show their own unread badge. Filters client-side in totalUnreadCount and getFolderUnreadCount instead.
* fix: exclude hidden feeds from unread countsFuwn2026-02-101-3/+4
| | | | | | get_unread_counts() now filters on hidden_from_timeline = false, so feeds hidden from the timeline no longer inflate the total unread badge or appear in aggregated counts.
* feat: add scrollbar style setting (themed/native/hidden)Fuwn2026-02-104-0/+93
| | | | | Themed scrollbars (default) use 6px thin bars matching the existing colour palette. Synced to body via class toggle in Providers.
* fix: remove font size selector, always use default text-baseFuwn2026-02-102-24/+1
|
* feat: add unread priority option to push unread entries to topFuwn2026-02-103-1/+42
| | | | | | Adds a persisted appearance setting (disabled by default) that partitions the entry list into unread-first, preserving original order within each group.
* feat: add Go worker tests and include in CIFuwn2026-02-103-0/+325
| | | | | | - Add webhook tests: HMAC signing, headers, status handling, timeout - Add writer tests: credential stripping, truncation, edge cases - Add Go test step to CI workflow (actions/setup-go + go test)
* fix: harden CI and close remaining test/security gapsFuwn2026-02-1014-39/+881
| | | | | | | | | - Make webhook URL tests deterministic with injectable DNS resolver - Wire tier parity checker into CI and root scripts - Add rate_limits cleanup cron job (hourly, >1hr retention) - Change rate limiter to fail closed on RPC error - Add Go worker tests: parser, SSRF protection, error classification, authentication, and worker pool (48 test functions)
* feat: reorder feature grid by attention-grabbing impactFuwn2026-02-101-21/+21
|
* fix: use md/lg breakpoints for 3/4-column feature gridFuwn2026-02-102-2/+2
|
* fix: use max-w-screen-xl for features section to fit 4-column gridFuwn2026-02-101-1/+1
|
* fix: widen features section to allow 4-column grid on xl screensFuwn2026-02-101-1/+1
|
* fix: widen feature grid to 4 columns on xl screensFuwn2026-02-101-1/+1
|
* fix: remove typography mention from feature gridFuwn2026-02-101-1/+1
|
* fix: refine feature grid copy for customisation and API cardsFuwn2026-02-101-2/+2
|
* feat: add missing features to marketing feature gridFuwn2026-02-101-0/+30
| | | | | Add folders & custom feeds, muted phrases, full-text search, customisable interface, installable PWA, and API & webhooks cards.
* feat: add offline reading row to pricing comparison tableFuwn2026-02-101-0/+6
|
* feat: gate offline reading to pro and developer plansFuwn2026-02-106-1/+59
| | | | | | | Service worker now only caches Supabase REST responses when the user's tier allows offline reading. Client syncs tier status to SW via postMessage after profile loads. Free users see a descriptive offline banner instead of stale cached data.
* feat: add automatic timeline refresh with scroll position preservationFuwn2026-02-105-4/+75
| | | | | | | New appearance setting (disabled by default) that silently refreshes the entry list when new entries arrive, provided the user is scrolled to the top. Falls back to notification when scrolled down to avoid disrupting reading position.
* feat: scoped mark-all-read, share enhancements, notification z-indexFuwn2026-02-1010-18/+155
| | | | | | | | | - Mark all as read now scopes to current feed/folder instead of all - Added undo button to mark-all-read toast notification - Share notes can be toggled between public and private visibility - Track share view count and display in shares list - Activity-based share expiry: views reset the expiry timer - Fixed notification panel z-index layering behind content area
* fix: service worker cross-origin image handling and CI env varsFuwn2026-02-103-101/+5
| | | | | | Stop SW from intercepting cross-origin image requests (favicons, remote entry images) which caused no-response errors in production. Add Supabase env vars to CI build step.
* refactor: use Supabase Auth display name instead of custom columnFuwn2026-02-105-19/+12
| | | | | | Migrate existing display names from user_profiles to auth.users user_metadata. Drop display_name column from user_profiles. Frontend now reads from auth user metadata and updates via auth.updateUser().
* docs: replace boilerplate README with project documentationFuwn2026-02-102-24/+59
| | | | | Document prerequisites, env vars, scripts, architecture, and project structure for the asa.news web app.
* feat: add vitest tests and GitHub Actions CIFuwn2026-02-1010-6/+1031
| | | | | | 24 tests covering webhook URL validation (SSRF), API key generation/ hashing, and HTML sanitization. CI workflow runs lint, typecheck (build), and test on push/PR to main.
* fix: reduce lint warnings from 34 to 0Fuwn2026-02-1022-44/+27
| | | | | | | | | Disable no-img-element (RSS reader needs <img> for arbitrary external URLs). Remove unused variables/imports and redundant getUser() calls guarded by middleware. Fix exhaustive-deps by adding stable deps, wrapping handlers in useCallback, and suppressing intentional omissions. Fix ref cleanup in use-realtime-entries. Allow triple-slash TS reference directives in no-comments rule.
* fix: P2 security hardening and tier limit parityFuwn2026-02-105-54/+240
| | | | | | Webhook routes switched from admin client to server client (RLS). Added DNS-resolution SSRF protection for webhook URLs with private IP blocking. Added tier limit parity check script.
* fix: resolve Supabase security and performance advisoriesFuwn2026-02-092-955/+3399
| | | | | | Enable RLS on rate_limits table (accessed only via SECURITY DEFINER). Fix api_keys delete policy to use (select auth.uid()) subquery to avoid per-row re-evaluation. Refresh schema dump from live database.
* fix: P0 correctness/security fixes and P1 lint error resolutionFuwn2026-02-099-46/+64
| | | | | | | | | | | P0: add missing 'developer' case to check_custom_feed_limit trigger, scope user_entry_states join to authenticated user in API v1 entries, replace in-memory rate limiting with Supabase-backed check_rate_limit RPC. P1: fix all 9 ESLint errors — useSyncExternalStore for useIsMobile, restructure WebhookSection to avoid set-state-in-effect, move ref mutations into useEffect, replace <a> with <Link> on shared page, ignore generated public/sw.js in eslint config.
* fix: P0 correctness and security fixesFuwn2026-02-0915-30/+175
| | | | | | - Add missing 'developer' case to check_custom_feed_limit trigger (was falling through to else 1) - Scope user_entry_states join to authenticated user in /api/v1/entries (admin client bypasses RLS) - Replace in-memory rate limiting with Supabase-backed solution (UNLOGGED table + check_rate_limit RPC + pg_cron cleanup)
* fix: use online networkMode for offline mutations instead of offlineFirstFuwn2026-02-091-1/+1
| | | | | | | offlineFirst fires the mutation once even when offline, causing a network error that triggers onError and rolls back the optimistic update. online mode pauses the mutation without calling mutationFn, keeping the optimistic state intact until reconnection.
* feat: offline support tier 3 — mutation queue and image cachingFuwn2026-02-094-3/+103
| | | | | | | Paused mutations (read/save toggles) are now persisted to IndexedDB and automatically resumed on reconnection or page reload via TanStack Query's offlineFirst networkMode. Service worker caches images with CacheFirst strategy (500 entries, 7-day expiry) for offline reading.
* feat: offline support tier 2 — prefetch entry content and SW runtime cachingFuwn2026-02-093-7/+75
| | | | | | | Prefetch content_html for the first 10 timeline entries in the background so they are available offline without needing to click each one. Add NetworkFirst runtime caching in service worker for Supabase REST GET requests (24h expiry, 200 entry limit).
* feat: offline support tier 1 — IndexedDB query persistence and offline bannerFuwn2026-02-097-4/+119
| | | | | | Persist React Query cache to IndexedDB via idb-keyval so timeline, entry details, subscriptions, and other read data survive page reloads and brief offline periods. Add network status banner in reader layout.
* fix: add spacing between collapsible appearance settings sectionsFuwn2026-02-091-1/+1
|
* ui: group appearance settings into collapsible sectionsFuwn2026-02-091-197/+228
|
* ui: reorder sidebar footer, import/export tab, and subscription actionsFuwn2026-02-093-47/+47
|
* feat: add per-feed "hide from timeline" optionFuwn2026-02-097-2/+58
|