<feed xmlns='http://www.w3.org/2005/Atom'>
<title>neko, branch claude/improve-image-proxy-5iY78</title>
<subtitle>self-hosted, single user rss reader</subtitle>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/'/>
<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>
<entry>
<title>Revert "fix: disable HTTP/2 in SafeClient to avoid unhandled response frame errors"</title>
<updated>2026-02-18T16:04:41+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:04:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=20337a80775d81a69d8019430bb1f3b0d450e259'/>
<id>20337a80775d81a69d8019430bb1f3b0d450e259</id>
<content type='text'>
This reverts commit ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This reverts commit ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: disable HTTP/2 in SafeClient to avoid unhandled response frame errors</title>
<updated>2026-02-18T16:01:45+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T16:01:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5'/>
<id>ee3f5edab92b0ca14dc0b3c98862f721bddaf7d5</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>update linter version (again?!)</title>
<updated>2026-02-18T15:58:11+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@adammathes.com</email>
</author>
<published>2026-02-18T15:58:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=5376acd4316b8007efe6ad4a9d82106dc72c6405'/>
<id>5376acd4316b8007efe6ad4a9d82106dc72c6405</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'performance-analysis'</title>
<updated>2026-02-18T15:53:10+00:00</updated>
<author>
<name>Adam Mathes</name>
<email>adam@trenchant.org</email>
</author>
<published>2026-02-18T15:53:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.adammathes.com/neko/commit/?id=38d6faf2e964fbe9a784832c14b0275dcc5bdd30'/>
<id>38d6faf2e964fbe9a784832c14b0275dcc5bdd30</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
