| Commit message (Collapse) | Author | Age | Files | Lines |
| |\
| |
| | |
Fix item ID type coercion in star/read toggles
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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 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
|
| |\
| |
| | |
Remove scrape/text button that caused squished body text
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| |\|
| |
| | |
Fix mobile horizontal scrolling caused by wide RSS content
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| | |
| |
| |
| | |
https://claude.ai/code/session_0141nhxmYfoFPVPZ813K1XFD
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| |/
|
|
|
|
|
|
|
|
|
| |
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
|
| |\
| |
| | |
Remove link underline on hover for item titles
|
| |/
|
|
|
|
|
| |
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
|
| |
|
|
| |
navigation
|
| | |
|
| | |
|
| |
|
|
| |
across all themes
|
| | |
|
| | |
|
| | |
|
| |\
| |
| |
| |
| | |
adammathes/claude/investigate-theme-performance-GjjYA
Optimize scroll performance and reduce layout thrashing
|
| | |
| |
| |
| | |
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
|
| | |
| |
| |
| | |
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |\
| |
| | |
Improve image proxy security, caching, and error handling
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
errors"
This reverts commit ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5.
|
| | |
|
| | |
|
| |\ |
|
| | | |
|
| |\ \
| |/
|/| |
Add comprehensive test coverage for security and import features
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| |\ \
| |/
|/| |
Redesign sidebar theme controls layout and fix dark mode visibility
|
| |/
|
|
|
|
|
|
|
|
|
|
| |
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
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |\
| |
| | |
Add 4 CSS style themes with runtime switcher
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| | |
|
| |
|
|
| |
version compatibility error
|