<feed xmlns='http://www.w3.org/2005/Atom'>
<title>neko/frontend-vanilla, branch master</title>
<subtitle>self-hosted, single user rss reader</subtitle>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/'/>
<entry>
<title>Fix star/read buttons: _id string vs number type mismatch</title>
<updated>2026-02-28T22:53:24+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-28T22:53:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=df5e7d93963f0256285b13ddf750761930797e78'/>
<id>df5e7d93963f0256285b13ddf750761930797e78</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Add AGENTS.md and fix star button tap targets on mobile</title>
<updated>2026-02-28T21:31:25+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-28T21:31:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=15aa629972c4bd9fd3ab5ddb442783483f57a61f'/>
<id>15aa629972c4bd9fd3ab5ddb442783483f57a61f</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove scrape/text button that caused squished body text</title>
<updated>2026-02-28T16:19:50+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-28T16:19:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=4ec762350c9bc0704bb81357949f910124fac0c6'/>
<id>4ec762350c9bc0704bb81357949f910124fac0c6</id>
<content type='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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Exclude test files from tsc build and rebuild production assets</title>
<updated>2026-02-28T05:40:51+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-28T05:40:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=474a93374340fa3aa5997b66ac1fecbffa620375'/>
<id>474a93374340fa3aa5997b66ac1fecbffa620375</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix feed-item overflow and flex shrink bug causing mobile horizontal scroll</title>
<updated>2026-02-28T03:57:02+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-28T03:57:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=f1a829f25540c4eff1b4b50548ba44518f8b231a'/>
<id>f1a829f25540c4eff1b4b50548ba44518f8b231a</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix mobile horizontal scrolling caused by wide RSS content</title>
<updated>2026-02-27T15:38:08+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-27T15:38:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=2802ccf8c1212e5ef49226e7063fbf008ea4c13e'/>
<id>2802ccf8c1212e5ef49226e7063fbf008ea4c13e</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove link underline on hover for item titles</title>
<updated>2026-02-21T21:47:32+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-21T21:47:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=c64977f17a9d0c73a23a11d69ab090fa0ca48d31'/>
<id>c64977f17a9d0c73a23a11d69ab090fa0ca48d31</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Add core robustness tests for scroll-to-read, infinite scroll, and keyboard navigation</title>
<updated>2026-02-19T04:22:52+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-19T04:22:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=f81f0c654c795b7e548ec5b5bb4789ffaa1499bf'/>
<id>f81f0c654c795b7e548ec5b5bb4789ffaa1499bf</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove visual styling for read items per user request</title>
<updated>2026-02-19T03:44:25+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-19T03:44:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=40dd80f76b9de72248404b0c097df7d3f04a2362'/>
<id>40dd80f76b9de72248404b0c097df7d3f04a2362</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Improve scroll-to-read robustness and add visual feedback for read items across all themes</title>
<updated>2026-02-19T03:40:46+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-19T03:40:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=8518868ee671c4bc99b27fbda47bb93a1e366eff'/>
<id>8518868ee671c4bc99b27fbda47bb93a1e366eff</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
