<feed xmlns='http://www.w3.org/2005/Atom'>
<title>neko/frontend-vanilla, branch claude/thicket-ready-crank-RmQuI</title>
<subtitle>self-hosted, single user rss reader</subtitle>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/'/>
<entry>
<title>Remove circle styling from NEKO sidebar toggle button</title>
<updated>2026-02-16T23:45:10+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-16T23:45:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=575b394cb26c435422e8b8c6e411a703327d8b40'/>
<id>575b394cb26c435422e8b8c6e411a703327d8b40</id>
<content type='text'>
Strip border-radius, box-shadow, background, and backdrop-filter from
the sidebar toggle in both v2 and v3 frontends so the logo appears flat.

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Strip border-radius, box-shadow, background, and backdrop-filter from
the sidebar toggle in both v2 and v3 frontends so the logo appears flat.

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #7 from adammathes/claude/thicket-ready-crank-RmQuI</title>
<updated>2026-02-16T23:36:49+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-16T23:36:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=c538ccd5cd1d6960c894a2969ee49317009dc9ed'/>
<id>c538ccd5cd1d6960c894a2969ee49317009dc9ed</id>
<content type='text'>
More crank pulls from claude</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
More crank pulls from claude</pre>
</div>
</content>
</entry>
<entry>
<title>Align sidebar CSS breakpoints with JS threshold at 1024px</title>
<updated>2026-02-16T23:28:59+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-16T23:28:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=ed1b953e1336aeda282b46acd1c5e21529fa0950'/>
<id>ed1b953e1336aeda282b46acd1c5e21529fa0950</id>
<content type='text'>
The sidebar default-closed JS logic used 1024px but CSS media queries
used 768px, causing inconsistent behavior on tablets. Updated all
sidebar-related breakpoints to 1024px/1025px to match.

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The sidebar default-closed JS logic used 1024px but CSS media queries
used 768px, causing inconsistent behavior on tablets. Updated all
sidebar-related breakpoints to 1024px/1025px to match.

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix mobile scroll not marking items as read in v3 UI</title>
<updated>2026-02-16T22:58:54+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-16T22:58:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=4555ee294a5acdfbc4b1026d99df54d07c74ed97'/>
<id>4555ee294a5acdfbc4b1026d99df54d07c74ed97</id>
<content type='text'>
Two issues prevented IntersectionObserver from firing on mobile:
1. threshold: 1.0 required items to be 100% visible, but on mobile
   viewports items with descriptions are often taller than the screen
2. root: null used the viewport, but scrolling happens inside
   .main-content (overflow-y: auto) while body has overflow: hidden

Switched to "scrolled past" pattern: items are marked read when they
scroll above the viewport (like the working legacy UI). Set root to
the actual scroll container element.

https://claude.ai/code/session_01NSUnBzNrgQVUNg9PnugF7N
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Two issues prevented IntersectionObserver from firing on mobile:
1. threshold: 1.0 required items to be 100% visible, but on mobile
   viewports items with descriptions are often taller than the screen
2. root: null used the viewport, but scrolling happens inside
   .main-content (overflow-y: auto) while body has overflow: hidden

Switched to "scrolled past" pattern: items are marked read when they
scroll above the viewport (like the working legacy UI). Set root to
the actual scroll container element.

https://claude.ai/code/session_01NSUnBzNrgQVUNg9PnugF7N
</pre>
</div>
</content>
</entry>
<entry>
<title>v3: fix feed toggle from settings page, add navigation tests</title>
<updated>2026-02-16T22:07:12+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-16T22:07:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=ddbdf506164613cd68194a1406f6855ae9d7f22c'/>
<id>ddbdf506164613cd68194a1406f6855ae9d7f22c</id>
<content type='text'>
When on the settings page and clicking a feed that was previously
active, navigate to that feed instead of toggling back to home.
The toggle behavior now only applies when already viewing that feed.
Added tests for navigating from settings to feeds and tags.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When on the settings page and clicking a feed that was previously
active, navigate to that feed instead of toggling back to home.
The toggle behavior now only applies when already viewing that feed.
Added tests for navigating from settings to feeds and tags.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>v3: persist sidebar state via cookie, default closed on tablet/mobile</title>
<updated>2026-02-16T19:28:01+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-16T19:28:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=52ea335714f2b495b92f87636c269b73b4067066'/>
<id>52ea335714f2b495b92f87636c269b73b4067066</id>
<content type='text'>
Sidebar open/close state is now saved to a cookie (neko_sidebar) so it
persists across page reloads. On first visit without a cookie, the
sidebar defaults to closed on tablet and mobile (&lt;=1024px viewport)
and open on desktop. Removes the auto-open-on-resize behavior that
was overriding user preference.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Sidebar open/close state is now saved to a cookie (neko_sidebar) so it
persists across page reloads. On first visit without a cookie, the
sidebar defaults to closed on tablet and mobile (&lt;=1024px viewport)
and open on desktop. Removes the auto-open-on-resize behavior that
was overriding user preference.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>v3 ui: require 100% visibility before marking items as read</title>
<updated>2026-02-16T19:13:22+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-16T19:13:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=0b08b2fb49827399ff0652bc20d5f71e2066025c'/>
<id>0b08b2fb49827399ff0652bc20d5f71e2066025c</id>
<content type='text'>
Change IntersectionObserver threshold from 0.5 to 1.0 so items are only
marked as read when fully scrolled into view, reducing accidental
mark-as-read during fast scrolling.

Also fix unused Category import in perf test and add thicket config.json
to repository so future agents can use thicket CLI commands.

Closes NK-s2g59a

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Change IntersectionObserver threshold from 0.5 to 1.0 so items are only
marked as read when fully scrolled into view, reducing accidental
mark-as-read during fast scrolling.

Also fix unused Category import in perf test and add thicket config.json
to repository so future agents can use thicket CLI commands.

Closes NK-s2g59a

https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
</pre>
</div>
</content>
</entry>
<entry>
<title>V3 UI Polish: Improved keyboard navigation, fixed logo position, and updated branding</title>
<updated>2026-02-16T18:57:38+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-16T18:53:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=5cf8275540d7162cd4936a7c0e76dbfe7f66b62c'/>
<id>5cf8275540d7162cd4936a7c0e76dbfe7f66b62c</id>
<content type='text'>
- Fix V3 keyboard navigation delay (resolved NK-wjats7)
- Update V3 document title to 'neko' (resolved NK-4p3s91)
- Fix V3 neko logo/button position to be top-left fixed (resolved NK-89za3s)
- Improve FeedItems (React) stability with ref-based index tracking and robust tests
- Sync V3 styling and selection feedback with V2 patterns
- Rebuild production assets
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Fix V3 keyboard navigation delay (resolved NK-wjats7)
- Update V3 document title to 'neko' (resolved NK-4p3s91)
- Fix V3 neko logo/button position to be top-left fixed (resolved NK-89za3s)
- Improve FeedItems (React) stability with ref-based index tracking and robust tests
- Sync V3 styling and selection feedback with V2 patterns
- Rebuild production assets
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix v3ui: neko button fixed position</title>
<updated>2026-02-16T18:57:38+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-16T17:37:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=96e78c5fdfada73d37644083c7580a1d444ed748'/>
<id>96e78c5fdfada73d37644083c7580a1d444ed748</id>
<content type='text'>
- Remove duplicate neko logo from v3 sidebar
- Keep sidebar toggle button fixed at top-left even when sidebar is open
- Add top padding to v3 sidebar to prevent overlap with the fixed toggle button
- Update v3 tests to match UI changes
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Remove duplicate neko logo from v3 sidebar
- Keep sidebar toggle button fixed at top-left even when sidebar is open
- Add top padding to v3 sidebar to prevent overlap with the fixed toggle button
- Update v3 tests to match UI changes
</pre>
</div>
</content>
</entry>
<entry>
<title>Add performance benchmarks, stress tests, and frontend perf tests</title>
<updated>2026-02-16T18:15:47+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-16T18:15:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=d4caf45b2b9ea6a3276de792cf6f73085e66b1ae'/>
<id>d4caf45b2b9ea6a3276de792cf6f73085e66b1ae</id>
<content type='text'>
Go benchmarks cover item CRUD/filter/sanitization, API endpoints (stream,
item update, feed list), middleware stack (gzip, security headers, CSRF),
and crawler pipeline (feed parsing, mocked crawl). Stress tests verify
concurrent reads/writes and large dataset handling. Frontend perf tests
measure template generation, DOM insertion, and store event throughput.

New Makefile targets: bench, bench-short, stress, test-perf.

https://claude.ai/code/session_01ChDVWFDrQoFjMYHpaLGr9s
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Go benchmarks cover item CRUD/filter/sanitization, API endpoints (stream,
item update, feed list), middleware stack (gzip, security headers, CSRF),
and crawler pipeline (feed parsing, mocked crawl). Stress tests verify
concurrent reads/writes and large dataset handling. Frontend perf tests
measure template generation, DOM insertion, and store event throughput.

New Makefile targets: bench, bench-short, stress, test-perf.

https://claude.ai/code/session_01ChDVWFDrQoFjMYHpaLGr9s
</pre>
</div>
</content>
</entry>
</feed>
