<feed xmlns='http://www.w3.org/2005/Atom'>
<title>neko, branch claude/investigate-theme-performance-GjjYA</title>
<subtitle>self-hosted, single user rss reader</subtitle>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/'/>
<entry>
<title>Revert polling interval back to 1s</title>
<updated>2026-02-18T22:56:56+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-18T22:56:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=0876a683cdc344b200dbd65aa137969a1528c85d'/>
<id>0876a683cdc344b200dbd65aa137969a1528c85d</id>
<content type='text'>
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
</pre>
</div>
</content>
</entry>
<entry>
<title>Rebuild dist assets to match source changes</title>
<updated>2026-02-18T22:47:00+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-18T22:47:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=b78090371ddc394bf766ba0382568d0c3c6cfd89'/>
<id>b78090371ddc394bf766ba0382568d0c3c6cfd89</id>
<content type='text'>
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
https://claude.ai/code/session_0187FXrbScDSWfbNEk9SfJaj
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix theme performance regressions affecting mobile scroll</title>
<updated>2026-02-18T21:52:21+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-18T21:52:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=1362f00d39e90aef8a8338887222541a5a992178'/>
<id>1362f00d39e90aef8a8338887222541a5a992178</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #19 from adammathes/claude/improve-image-proxy-5iY78</title>
<updated>2026-02-18T21:38:27+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T21:38:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=7776e81b39130c211eb0ec566c6467a28a9fa64c'/>
<id>7776e81b39130c211eb0ec566c6467a28a9fa64c</id>
<content type='text'>
Improve image proxy security, caching, and error handling</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Improve image proxy security, caching, and error handling</pre>
</div>
</content>
</entry>
<entry>
<title>Improve image proxy: streaming, size limits, Content-Type validation</title>
<updated>2026-02-18T21:33:02+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-02-18T21:33:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=c585d7873e9b4bfd9f6efd30f9ce08aed8a0d92b'/>
<id>c585d7873e9b4bfd9f6efd30f9ce08aed8a0d92b</id>
<content type='text'>
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
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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
</pre>
</div>
</content>
</entry>
<entry>
<title>remove pandoc and readme.html generation, update readme with local dev info</title>
<updated>2026-02-18T21:02:22+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T21:02:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=a74885d269d2fddb21be5db402e70ac1a41a0e23'/>
<id>a74885d269d2fddb21be5db402e70ac1a41a0e23</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>update readme</title>
<updated>2026-02-18T16:50:53+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:50:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=a3794d4ae13ad785aa9b695e5fe63ce001592562'/>
<id>a3794d4ae13ad785aa9b695e5fe63ce001592562</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>update documentation with prerequisites and local dev setup</title>
<updated>2026-02-18T16:42:40+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:42:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=4e1d5662353c3d54d3edb9cfe07893bcc56e331b'/>
<id>4e1d5662353c3d54d3edb9cfe07893bcc56e331b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix dockerFile, maybe</title>
<updated>2026-02-18T16:38:47+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:38:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=a0283fa22a64f18b16ca8c57e54b1a521a4df07c'/>
<id>a0283fa22a64f18b16ca8c57e54b1a521a4df07c</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: implement HTTP/2 fallback for SafeClient on protocol errors</title>
<updated>2026-02-18T16:06:42+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:06:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=64830820d23ba58b63509cb721e7551dd30c4997'/>
<id>64830820d23ba58b63509cb721e7551dd30c4997</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
