aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #24 from adammathes/claude/agents-file-mobile-stars-2nj6yHEADmasterAdam Mathes22 hours5-16/+91
|\ | | | | Fix item ID type coercion in star/read toggles
| * Fix star/read buttons: _id string vs number type mismatchclaude/agents-file-mobile-stars-2nj6yClaude24 hours6-27/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Go API returns _id as a JSON string (due to the `json:",string"` tag on Item.Id), but the frontend compared it with === against numbers from parseInt(). String "5" === number 5 is always false in JS, so toggleStar, mark-as-read, and keyboard shortcuts silently did nothing. Fix: - Coerce _id to Number() when items are loaded from the API - Use Number() coercion in all store.items.find() comparisons as defense - Revert the CSS touch-target changes (the issue was never about size) - Add a regression test with string _id to prevent reintroduction https://claude.ai/code/session_012CNdRhGhU3hxjrwvZt2BHZ
| * Add AGENTS.md and fix star button tap targets on mobileClaude25 hours5-3/+61
|/ | | | | | | | | | | | Add AGENTS.md with TDD workflow and check-in guidance for agents. Fix star buttons being nearly impossible to tap on mobile by: - Adding min-width/min-height of 44px for proper touch targets - Adding flex-shrink: 0 so the button isn't squeezed by long titles - Overriding generic button styles (height, text-transform, font-weight) that bled into the star button https://claude.ai/code/session_012CNdRhGhU3hxjrwvZt2BHZ
* Merge pull request #23 from adammathes/claude/fix-mobile-scrolling-Ls0FrAdam Mathes29 hours3-18/+8
|\ | | | | Remove scrape/text button that caused squished body text
| * Remove scrape/text button that caused squished body textclaude/fix-mobile-scrolling-Ls0FrClaude30 hours3-18/+8
| | | | | | | | | | | | | | | | | | The float:right "text" button inside .dateline was causing .item-description content to wrap around it when .feed-item gained overflow:hidden. Removing the button fixes the squished text regression. The backend scrape endpoint and scrapeItem() handler remain intact for potential future use. https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
* | Merge pull request #22 from adammathes/claude/fix-mobile-scrolling-Ls0FrAdam Mathes41 hours8-5/+176
|\| | | | | Fix mobile horizontal scrolling caused by wide RSS content
| * Exclude test files from tsc build and rebuild production assetsClaude41 hours6-5/+6
| | | | | | | | | | | | | | | | | | | | Test files use Node built-ins (fs, path) which aren't available to the browser-targeted tsconfig. Excluding *.test.ts from tsc is the standard Vite/Vitest pattern — vitest handles test type-checking separately. Also rebuilds web/dist/v3/ to include the CSS overflow fixes. https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
| * Add node_modules to .gitignoreClaude43 hours1-0/+1
| | | | | | | | https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
| * Fix feed-item overflow and flex shrink bug causing mobile horizontal scrollClaude43 hours2-56/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | The previous fix (overflow-x:hidden on .main-content and .item-description) was insufficient because mobile Safari ignores overflow-x:hidden on elements with overflow-y:auto. The real fix is item-level containment: - .feed-item: add overflow:hidden to create a BFC so no child content can push the viewport wider, even during async image load reflows - .item-title: add min-width:0 (fixes flex min-width:auto bug that prevents shrinking below content width) and overflow-wrap:break-word for long titles https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
| * Fix mobile horizontal scrolling caused by wide RSS contentClaude2 days2-1/+158
|/ | | | | | | | | | | RSS feeds can contain tables, iframes, and other elements with explicit widths that overflow the viewport on mobile. Added overflow-x: hidden to .item-description and .main-content, and extended max-width: 100% to cover table and iframe elements inside item descriptions. Includes TDD tests verifying the CSS containment rules. https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
* Merge pull request #21 from adammathes/claude/remove-link-underlines-2IJFWAdam Mathes8 days4-4/+4
|\ | | | | Remove link underline on hover for item titles
| * Remove link underline on hover for item titlesClaude8 days4-4/+4
|/ | | | | | | Removed text-decoration: underline from .item-title:hover in the source CSS and rebuilt the frontend assets so the compiled dist reflects the change. https://claude.ai/code/session_011Y2tBL3goxNWHqUaJ8Bpzh
* Add core robustness tests for scroll-to-read, infinite scroll, and keyboard ↵Adam Mathes11 days1-0/+226
| | | | navigation
* Check in production assets for V3 UIAdam Mathes11 days2-0/+190
|
* Remove visual styling for read items per user requestAdam Mathes11 days10-71/+10
|
* Improve scroll-to-read robustness and add visual feedback for read items ↵Adam Mathes11 days13-245/+144
| | | | across all themes
* Rebuild production assets after rebaseAdam Mathes11 days2-31/+6
|
* Add regression tests for mark-as-read and partial updatesAdam Mathes11 days2-139/+52
|
* Fix mark-as-read regression and add debugging toolsAdam Mathes11 days3-50/+87
|
* Merge pull request #20 from ↵Adam Mathes11 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-GjjYAClaude11 days5-8/+8
| | | | | | | | https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
| * Rebuild dist assets to match source changesClaude11 days6-32/+44
| | | | | | | | https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
| * Fix theme performance regressions affecting mobile scrollClaude11 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 Mathes11 days3-63/+399
|\ | | | | Improve image proxy security, caching, and error handling
| * Improve image proxy: streaming, size limits, Content-Type validationclaude/improve-image-proxy-5iY78Claude11 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 Mathes11 days2-10/+3
|
* update readmeAdam Mathes11 days1-92/+89
|
* update documentation with prerequisites and local dev setupAdam Mathes11 days2-0/+30
|
* fix dockerFile, maybeAdam Mathes11 days1-1/+0
|
* fix: implement HTTP/2 fallback for SafeClient on protocol errorsAdam Mathes11 days2-3/+56
|
* Revert "fix: disable HTTP/2 in SafeClient to avoid unhandled response frame ↵Adam Mathes11 days1-6/+0
| | | | | | errors" This reverts commit ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5.
* fix: disable HTTP/2 in SafeClient to avoid unhandled response frame errorsAdam Mathes11 days1-0/+6
|
* update linter version (again?!)Adam Mathes11 days1-1/+1
|
* Merge branch 'performance-analysis'Adam Mathes11 days1-0/+107
|\
| * docs: add performance benchmarks and analysis for 2026-02-18Adam Mathes11 days1-0/+107
| |
* | Merge pull request #18 from adammathes/claude/improve-test-coverage-iBkwcAdam Mathes11 days6-0/+1104
|\ \ | |/ |/| Add comprehensive test coverage for security and import features
| * Increase test coverage across lowest-coverage packagesclaude/improve-test-coverage-iBkwcClaude12 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 Mathes12 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-QGTmPClaude12 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 Mathes12 days3-4/+4
|
* Fix lint error and optimize linter config for local runsAdam Mathes12 days2-2/+5
|
* Prune dead E2E testing scripts and targetsAdam Mathes12 days5-147/+2
|
* Remove visual 'selected' state highlight from feed itemsAdam Mathes12 days7-37/+21
|
* Fix scrolling behavior, CI linting, and update DockerfileAdam Mathes12 days7-28/+80
|
* Merge pull request #13 from adammathes/claude/add-css-themes-QGTmPAdam Mathes12 days17-167/+3827
|\ | | | | Add 4 CSS style themes with runtime switcher
| * Replace sidebar style cycle button with 5 emoji iconsClaude12 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 docsClaude12 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 switcherClaude12 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 Mathes12 days6-11/+11
|
* CI: Update golangci-lint-action to v7 and golangci-lint to v2.10.1 to fix ↵Adam Mathes12 days1-2/+2
| | | | version compatibility error