aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Improve scroll-to-read robustness and add visual feedback for read items ↵Adam Mathes7 days13-245/+144
| | | | across all themes
* Rebuild production assets after rebaseAdam Mathes7 days2-31/+6
|
* Add regression tests for mark-as-read and partial updatesAdam Mathes7 days2-139/+52
|
* Fix mark-as-read regression and add debugging toolsAdam Mathes7 days3-50/+87
|
* Merge pull request #20 from ↵Adam Mathes7 days11-67/+93
|\ | | | | | | | | adammathes/claude/investigate-theme-performance-GjjYA Optimize scroll performance and reduce layout thrashing
| * Revert polling interval back to 1sclaude/investigate-theme-performance-GjjYAClaude7 days5-8/+8
| | | | | | | | https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
| * Rebuild dist assets to match source changesClaude7 days6-32/+44
| | | | | | | | https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
| * Fix theme performance regressions affecting mobile scrollClaude7 days7-41/+55
|/ | | | | | | | | | | | | | | | | | | | | The new theme CSS files introduced several patterns that cause scroll jank and memory pressure, especially on mobile: - terminal.css: Full-viewport fixed pseudo-element with repeating gradient scanlines forced GPU compositing on every scroll frame. Now limited to desktop only with will-change layer promotion. - codex.css/sakura.css: text-rendering: optimizeLegibility on body triggered expensive kerning/ligature computation on all text. - codex.css: font-feature-settings forced text shaper on every glyph. - codex.css: hyphens: auto required dictionary lookups during layout. - style.css: transition: all on buttons and sidebar links caused unnecessary animation work during scroll hover state changes. - main.ts: checkReadItems did O(n) individual querySelector calls per scroll tick; switched to single querySelectorAll batch query. - Polling interval reduced from 1s to 3s (scroll handler already covers the normal case, polling is just a robustness fallback). https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
* Merge pull request #19 from adammathes/claude/improve-image-proxy-5iY78Adam Mathes7 days3-63/+399
|\ | | | | Improve image proxy security, caching, and error handling
| * Improve image proxy: streaming, size limits, Content-Type validationclaude/improve-image-proxy-5iY78Claude7 days3-63/+399
|/ | | | | | | | | | | | | | | | | | | | | | Rewrites the image proxy handler to address several issues: - Stream responses with io.Copy instead of buffering entire image in memory - Add 25MB size limit via io.LimitReader to prevent memory exhaustion - Close resp.Body (was previously leaked on every request) - Validate Content-Type is an image, rejecting HTML/JS/etc - Forward Content-Type and Content-Length from upstream - Use http.NewRequestWithContext to propagate client cancellation - Check upstream status codes, returning 502 for non-2xx - Fix ETag: use proper quoted format, remove bogus Etag request header check - Increase timeout from 5s to 30s for slow image servers - Use proper HTTP status codes (400 for bad input, 502 for upstream errors) - Add Cache-Control max-age directive alongside Expires header Tests: comprehensive coverage for Content-Type filtering, upstream errors, streaming, ETag validation, User-Agent forwarding, and Content-Length. Benchmarks: cache hit path and streaming at 1KB/64KB/1MB/5MB sizes. https://claude.ai/code/session_01CZcDDVmF6wNs2YjdhvCppy
* remove pandoc and readme.html generation, update readme with local dev infoAdam Mathes7 days2-10/+3
|
* update readmeAdam Mathes7 days1-92/+89
|
* update documentation with prerequisites and local dev setupAdam Mathes7 days2-0/+30
|
* fix dockerFile, maybeAdam Mathes7 days1-1/+0
|
* fix: implement HTTP/2 fallback for SafeClient on protocol errorsAdam Mathes7 days2-3/+56
|
* Revert "fix: disable HTTP/2 in SafeClient to avoid unhandled response frame ↵Adam Mathes7 days1-6/+0
| | | | | | errors" This reverts commit ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5.
* fix: disable HTTP/2 in SafeClient to avoid unhandled response frame errorsAdam Mathes7 days1-0/+6
|
* update linter version (again?!)Adam Mathes7 days1-1/+1
|
* Merge branch 'performance-analysis'Adam Mathes7 days1-0/+107
|\
| * docs: add performance benchmarks and analysis for 2026-02-18Adam Mathes7 days1-0/+107
| |
* | Merge pull request #18 from adammathes/claude/improve-test-coverage-iBkwcAdam Mathes7 days6-0/+1104
|\ \ | |/ |/| Add comprehensive test coverage for security and import features
| * Increase test coverage across lowest-coverage packagesclaude/improve-test-coverage-iBkwcClaude8 days6-0/+1104
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Major coverage improvements: - safehttp: 46.7% -> 93.3% (SafeDialer, redirect checking, SSRF protection) - api: 81.8% -> 96.4% (HandleImport 0% -> 100%, stream errors, content types) - importer: 85.3% -> 94.7% (ImportFeeds dispatcher, OPML nesting, edge cases) - cmd/neko: 77.1% -> 85.4% (purge, secure-cookies, minutes, allow-local flags) New tests added: - Security regression tests (CSRF token uniqueness, mismatch rejection, auth cookie HttpOnly, security headers, API auth requirements) - Stress tests for concurrent mixed operations and rapid state toggling - SSRF protection tests for SafeDialer hostname resolution and redirect paths https://claude.ai/code/session_01XUBh32rHpbYue1JYXSH64Q
* | Merge pull request #17 from adammathes/claude/add-css-themes-QGTmPAdam Mathes8 days6-54/+74
|\ \ | |/ |/| Redesign sidebar theme controls layout and fix dark mode visibility
| * Redesign sidebar theme controls layout and fix dark mode visibilityclaude/add-css-themes-QGTmPClaude8 days6-54/+74
|/ | | | | | | | | | | | Split light/dark into ☀ ☽ buttons above a horizontal rule, with the 5 style emoji below. Increases icon size from 0.8rem to 1rem. Replaces opacity-only approach with explicit rgba(0,0,0) color in dark mode (sidebar remains grey in dark theme, so icons need dark ink). Switches hover/active backgrounds to neutral rgba(128,128,128) so they work correctly across all themes and modes. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
* Apply SQL injection fix and repair CI config from fix-sql-injection branchAdam Mathes8 days3-4/+4
|
* Fix lint error and optimize linter config for local runsAdam Mathes8 days2-2/+5
|
* Prune dead E2E testing scripts and targetsAdam Mathes8 days5-147/+2
|
* Remove visual 'selected' state highlight from feed itemsAdam Mathes8 days7-37/+21
|
* Fix scrolling behavior, CI linting, and update DockerfileAdam Mathes8 days7-28/+80
|
* Merge pull request #13 from adammathes/claude/add-css-themes-QGTmPAdam Mathes8 days17-167/+3827
|\ | | | | Add 4 CSS style themes with runtime switcher
| * Replace sidebar style cycle button with 5 emoji iconsClaude8 days7-203/+230
| | | | | | | | | | | | | | | | | | Swap the single cycle button for individual emoji per theme: ○ Default, ◆ Refined, ▮ Terminal, ❧ Codex, ❀ Sakura. Active theme gets a highlighted state. Separated from the light/dark toggle with a thin divider. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
| * Refine themes, add sidebar controls, and theme docsClaude8 days12-338/+646
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Refined: softer dark-mode link color (#a0c4e8), fix export button vertical alignment with inline-flex, tighten settings page spacing (reduce gaps from 3rem to 1.5rem). Terminal: switch accent from cyan to green (#4ae54a dark / #1a7a2e light), add proper light mode with pale steel background, scanlines only in dark mode. Sidebar: add quick-access controls in footer — moon/sun icon toggles light/dark, circle icon cycles through style themes showing current name. Both update reactively on state change. Add THEMES.md with full documentation on creating new themes: variable reference, selector guide, light/dark mode tips, and the registration process. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
| * Add 4 CSS style themes with runtime switcherClaude8 days13-165/+3490
|/ | | | | | | | | | | | | | | | Adds a style theme system that layers additional CSS files on top of the base stylesheet. Themes are loaded/unloaded dynamically via <link> tags. - Default: existing look, unchanged - Refined: typographic rhythm fixes, consistent spacing on settings page - Terminal: monospace, dark phosphor CRT aesthetic (scanlines, cyan glow) - Codex: book/Tufte-inspired with warm paper tones, serif type, fleurons - Sakura: Japanese-inspired calm aesthetic (named for neko = cat) Each theme supports both light and dark mode. Style selection persists in localStorage and is independent of the light/dark toggle. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
* Refine Settings labels and apply heading font to sidebarAdam Mathes8 days6-11/+11
|
* CI: Update golangci-lint-action to v7 and golangci-lint to v2.10.1 to fix ↵Adam Mathes8 days1-2/+2
| | | | version compatibility error
* Refine Settings UI: Fix dark mode text colors, split font controls for ↵Adam Mathes8 days10-165/+253
| | | | headers and body, update monospace stack, and soft-deprecate tags
* Soft deprecate tags feature in Sidebar and fix lint errorsAdam Mathes8 days3-35/+35
|
* Soft deprecate tags feature in SettingsAdam Mathes8 days4-7/+14
|
* Fix feed handling: Send full feed object on update to satisfy backend ↵Adam Mathes8 days2-2/+16
| | | | requirements
* Refine Settings UI: Full-width feed list, simplified data section, removed ↵Adam Mathes8 days5-150/+54
| | | | dividers
* Refine Settings page: Consistently use Helvetica fonts, remove dividers, ↵Adam Mathes8 days4-366/+165
| | | | simplify Feed list to rows
* Redesign Settings page: grid layout and extended import/export optionsAdam Mathes8 days6-232/+645
|
* Fix regression: mark-as-read not triggering on window scrollAdam Mathes8 days4-54/+90
|
* Fix infinite scroll not triggering on scrollAdam Mathes8 days4-21/+143
|
* Configure vitest for low-resource VM environmentsAdam Mathes8 days1-0/+3
|
* Merge pull request #12 from adammathes/claude/fix-open-tickets-IVV1CAdam Mathes8 days5-3/+4
|\ | | | | fix: add explicit height to .main-content so overflow-y scrolls
| * fix: add explicit height to .main-content so overflow-y scrollsClaude8 days5-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the sidebar was changed to position:fixed (overlay mode), flex:1 was removed from .main-content. Without flex:1 or an explicit height, .main-content relied on align-items:stretch for its height constraint. This is unreliable for establishing a definite height that overflow-y:auto respects — the element can grow with its content instead of constraining at 100vh and scrolling. Add height:100% to .main-content so it has a definite height from the parent chain (body 100vh → #app 100% → .layout 100% → .main-content 100%). This ensures overflow-y:auto creates a proper scroll container, which is required for both the scroll-based infinite loading and mark-as-read to work. https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
* | Merge pull request #11 from adammathes/claude/fix-open-tickets-IVV1CAdam Mathes8 days4-76/+75
|\| | | | | fix: replace IntersectionObserver with scroll-position check for infi…
| * fix: replace IntersectionObserver with scroll-position check for infinite scrollClaude8 days4-76/+75
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The IntersectionObserver approach for infinite scroll was unreliable — items would not load when scrolling to the bottom in v3, while v1's polling approach worked fine. The issue was that IntersectionObserver with a custom root element (main-content, whose height comes from flex align-items:stretch rather than an explicit height) didn't fire reliably, and renderItems() being called 3 times per fetch cycle (from both items-updated and loading-state-changed events) kept destroying and recreating the observer. Replace with a simple scroll-position check in the existing onscroll handler, matching v1's proven approach: when the user scrolls within 200px of the bottom of #main-content, trigger loadMore(). This runs on every scroll event (cheap arithmetic comparison) and only fires when content actually overflows the container. Remove the unused itemObserver module-level variable. Update regression tests to simulate scroll position instead of IntersectionObserver callbacks, with 4 cases: scroll near bottom triggers load, scroll far from bottom doesn't, loading=true blocks, and hasMore=false hides sentinel. https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
* | Merge pull request #10 from adammathes/claude/fix-open-tickets-IVV1CAdam Mathes8 days4-12/+107
|\| | | | | fix: store sentinel IntersectionObserver in module-level variable to …