<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: zknill</title><link>https://news.ycombinator.com/user?id=zknill</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 08 May 2026 12:47:23 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=zknill" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[How to make SSE token streams resumable, cancellable, and multi-device]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48047360">https://news.ycombinator.com/item?id=48047360</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 07 May 2026 09:40:15 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=48047360</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48047360</guid></item><item><title><![CDATA[How to make SSE token streams resumable, cancellable, and multi-device]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48036746">https://news.ycombinator.com/item?id=48036746</a></p>
<p>Points: 43</p>
<p># Comments: 10</p>
]]></description><pubDate>Wed, 06 May 2026 14:31:42 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=48036746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48036746</guid></item><item><title><![CDATA[How to make SSE token streams resumable, cancellable, and multi-device]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48019634">https://news.ycombinator.com/item?id=48019634</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 05 May 2026 08:36:44 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=48019634</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48019634</guid></item><item><title><![CDATA[How to make SSE token streams resumable, cancellable, and multi-device]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47972476">https://news.ycombinator.com/item?id=47972476</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 01 May 2026 08:35:54 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47972476</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47972476</guid></item><item><title><![CDATA[How to make SSE token streams resumable, cancellable, and multi-device]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47963693">https://news.ycombinator.com/item?id=47963693</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 30 Apr 2026 15:09:22 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47963693</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47963693</guid></item><item><title><![CDATA[How to build advanced features for AI chatbots on SSE]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47931569">https://news.ycombinator.com/item?id=47931569</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 28 Apr 2026 07:49:37 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47931569</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47931569</guid></item><item><title><![CDATA[Is it easy to build advanced AI features on SSE?]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47922823">https://news.ycombinator.com/item?id=47922823</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 27 Apr 2026 15:20:42 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47922823</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47922823</guid></item><item><title><![CDATA[New comment by zknill in "Vibe Coding Isn't the Problem – It's Your Approvals Process"]]></title><description><![CDATA[
<p>AI generated code, where the author doesn't understand the code, shifts the burden of checking quality and function onto the reviewer.<p>This post says little about that, and suggests some improvements the _reviewer_ can make.<p>I think that's completely the wrong end of the stick to be tackling. As the burden is still on the reviewer and not the author.</p>
]]></description><pubDate>Fri, 24 Apr 2026 08:23:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47887293</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47887293</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47887293</guid></item><item><title><![CDATA[SSE token streaming is easy, they said]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47887234">https://news.ycombinator.com/item?id=47887234</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 24 Apr 2026 08:15:36 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47887234</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47887234</guid></item><item><title><![CDATA[New comment by zknill in "SSE token streaming is easy, they said"]]></title><description><![CDATA[
<p>I wrote about "All your agents are going async"[1], and everyone said "Can't you just do this with SSE". So I figured I'd dig into that claim.<p>[1]: <a href="https://news.ycombinator.com/item?id=47832720">https://news.ycombinator.com/item?id=47832720</a></p>
]]></description><pubDate>Thu, 23 Apr 2026 11:46:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47874603</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47874603</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47874603</guid></item><item><title><![CDATA[SSE token streaming is easy, they said]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/">https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47874589">https://news.ycombinator.com/item?id=47874589</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Thu, 23 Apr 2026 11:45:31 +0000</pubDate><link>https://zknill.io/posts/everyone-said-sse-token-streaming-was-easy/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47874589</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47874589</guid></item><item><title><![CDATA[New comment by zknill in "An MCP Server for Fastmail – National Email Day"]]></title><description><![CDATA[
<p>This is great, I built a manual integration based on JMAP and CalDav cli tooling, but this is neat. Especially:<p>> The OAuth consent screen will give you a choice of three levels of access: read-only (see emails, contacts, calendars), write (update emails, save drafts, edit contacts and events), and send (send emails).</p>
]]></description><pubDate>Thu, 23 Apr 2026 10:18:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47873987</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47873987</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47873987</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>I suspect the answer is that the AI chat-app is built so that the LLM response tokens are sent straight into the HTTP response as a SSE stream, without being stored (in their intermediate state) in a database. BUT the 'full' response _is_ stored in the database once the LLM stream is complete, just not the intermediate tokens.<p>If you look at the gifs of the Claude UI in this post[1], you can see how the HTTP response is broken on page refresh, but some time later the full response is available again because it's now being served 'in full' from the database.<p>[1]: <a href="https://zknill.io/posts/chatbots-worst-enemy-is-page-refresh/" rel="nofollow">https://zknill.io/posts/chatbots-worst-enemy-is-page-refresh...</a></p>
]]></description><pubDate>Wed, 22 Apr 2026 11:13:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861906</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861906</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861906</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>> "and which ones are no longer relevant."<p>This is absolutely the hardest bit.<p>I guess the short-cut is to include all the chat conversation history, and then if the history contains "do X" followed by "no actually do Y instead", then the LLM can figure that out. But isn't it fairly tricky for the agent harness to figure that out, to work out relevancy, and to work out what context to keep? Perhaps this is why the industry defaults to concatenating messages into a conversation stream?</p>
]]></description><pubDate>Wed, 22 Apr 2026 10:46:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861649</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861649</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861649</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>Assuming LROs are "Long running operations", then you kick off some work with an API request, and get some ID back. Then you poll some endpoint for that ID until the operation is "done". This can work, but when you try and build in token-streaming to this model, you end up having to thread every token through a database (which can work), and increasing the latency experienced by the user as you poll for more tokens/completion status.<p>Obviously polling works, it's used in lots of systems. But I guess I am arguing that we can do better than polling, both in terms of user experience, and the complexity of what you have to build to make it work.<p>If your long running operations just have a single simple output, then polling for them might be a great solution. But streaming LLM responses (by nature of being made up of lots of individual tokens) makes the polling design a bit more gross than it really needs to be. Which is where the idea of 'sessions' comes in.</p>
]]></description><pubDate>Wed, 22 Apr 2026 10:07:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861364</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861364</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861364</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>I don't know Kitaru too well, but I do know Temporal a bit.<p>The pattern I describe in the article of 'channels' works really well for one of the hardest bits of using a durable execution tool like Temporal. If your workflow step is long running, or async, it's often hard to 'signal' the result of the step out to some frontend client. But using channels or sessions like in the article it becomes super easy because you can write the result to the channel and it's sent in realtime to the subscribed client. No HTTP polling for results, or anything like that.</p>
]]></description><pubDate>Wed, 22 Apr 2026 09:54:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861279</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861279</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861279</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>With the approach based on pub/sub channels, this is possible to do if you know the name of the session (i.e. know the name of the channel).<p>Of course the hard bit then is; how does the client know there's new information from the agent, or a new session?<p>Generally we'd recommend having a separate kind of 'notification' or 'control' pub/sub channel that clients always subscribe to to be notified of new 'sessions'. Then they can subscribe to the new session based purely on knowing the session name.</p>
]]></description><pubDate>Wed, 22 Apr 2026 09:39:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861198</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861198</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861198</guid></item><item><title><![CDATA[New comment by zknill in "All your agents are going async"]]></title><description><![CDATA[
<p>I don't think this is quite right. I do work for a pub/sub company that's involved in this space, but this article isn't a commercial sales pitch and we do have a product that exists.<p>The article is about how agents are getting more and more async features, because that's what makes them useful and interesting. And how the standard HTTP based SSE streaming of response tokens is hard to make work when agents are async.</p>
]]></description><pubDate>Wed, 22 Apr 2026 09:25:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47861112</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47861112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47861112</guid></item><item><title><![CDATA[All your agents are going async]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/all-your-agents-are-going-async/">https://zknill.io/posts/all-your-agents-are-going-async/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47860949">https://news.ycombinator.com/item?id=47860949</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 22 Apr 2026 09:00:59 +0000</pubDate><link>https://zknill.io/posts/all-your-agents-are-going-async/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47860949</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47860949</guid></item><item><title><![CDATA[All your agents are going async]]></title><description><![CDATA[
<p>Article URL: <a href="https://zknill.io/posts/all-your-agents-are-going-async/">https://zknill.io/posts/all-your-agents-are-going-async/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47845581">https://news.ycombinator.com/item?id=47845581</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 21 Apr 2026 07:19:27 +0000</pubDate><link>https://zknill.io/posts/all-your-agents-are-going-async/</link><dc:creator>zknill</dc:creator><comments>https://news.ycombinator.com/item?id=47845581</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47845581</guid></item></channel></rss>