<?xml version="1.0" encoding="UTF-8"?><rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>All The golang Shit | Ciprian Mandache</title>
<atom:link href="https://ciprian.51k.eu/tag/golang/feed/" rel="self" type="application/rss+xml" /><link></link>
<description>Mostly writing code that does stuff...</description>
<lastBuildDate>Tue, 20 Oct 2026 20:34:42 +0000</lastBuildDate>
<language>en-US</language>
<sy:updatePeriod>
hourly	</sy:updatePeriod>
<sy:updateFrequency>
1	</sy:updateFrequency><image>
<url>https://ciprian.51k.eu/upld/2019/02/cropped-terminal-icon-32x32.png</url><title>All The golang Shit | Ciprian Mandache</title><link></link>
<width>32</width>
<height>32</height>
</image>
<item><title>go-asyncapi: load AsyncAPI 3 specs in Go</title><link>https://ciprian.51k.eu/go-asyncapi-load-asyncapi-3-specs-in-go/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Thu, 15 Oct 2026 21:06:39 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[asyncapi]]></category>
<category><![CDATA[claude code]]></category>
<category><![CDATA[code generation]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[event-driven]]></category>
<category><![CDATA[go-asyncapi]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[json]]></category>
<category><![CDATA[json schema]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[parser]]></category>
<category><![CDATA[websocket]]></category>
<category><![CDATA[yaml]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/go-asyncapi-your-asyncapi-spec-is-a-fucking-graph-wearing-a-yaml-costume/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/10/go-asyncapi-linocut-2-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/10/go-asyncapi-linocut-2-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/10/go-asyncapi-linocut-2-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/10/go-asyncapi-linocut-2-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/10/go-asyncapi-linocut-2.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />go-asyncapi reads AsyncAPI 3 documents in Go and hands you servers, channels, operations and messages as plain structs, with every $ref on the way to them followed across files, every ...]]></description>
</item>
<item><title>Why am I still hand-typing WebSocket structs from an AsyncAPI spec?</title><link>https://ciprian.51k.eu/gen-asyncapi-why-am-i-still-hand-typing-websocket-structs/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Thu, 15 Oct 2026 18:25:51 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[asyncapi]]></category>
<category><![CDATA[cli-tool]]></category>
<category><![CDATA[code generation]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[gen-asyncapi]]></category>
<category><![CDATA[go generate]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[go-asyncapi]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[json]]></category>
<category><![CDATA[json schema]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[typescript]]></category>
<category><![CDATA[validation]]></category>
<category><![CDATA[websocket]]></category>
<category><![CDATA[websocket client]]></category>
<category><![CDATA[yaml]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/gen-asyncapi-stop-hand-typing-your-fucking-websocket-structs/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/10/gen-asyncapi-noir-s11-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/10/gen-asyncapi-noir-s11-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/10/gen-asyncapi-noir-s11-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/10/gen-asyncapi-noir-s11-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/10/gen-asyncapi-noir-s11.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />You shouldn&#8217;t be, because the AsyncAPI spec already says exactly what every message looks like and a machine can retype it better than you. I wrote gen-asyncapi so an AsyncAPI ...]]></description>
</item>
<item><title>chatz: A Self-Hosted AI Chat Where the Assistant Draws the Fucking Dashboard</title><link>https://ciprian.51k.eu/chatz-generative-ui-ai-chat/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Sun, 16 Aug 2026 07:22:33 +0000</pubDate>
<category><![CDATA[AI]]></category>
<category><![CDATA[Containers]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ai]]></category>
<category><![CDATA[ai chat]]></category>
<category><![CDATA[anthropic]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[chatz]]></category>
<category><![CDATA[container]]></category>
<category><![CDATA[docker]]></category>
<category><![CDATA[generative ui]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[llm]]></category>
<category><![CDATA[mcp]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[openai]]></category>
<category><![CDATA[postgres]]></category>
<category><![CDATA[self-hosted]]></category>
<category><![CDATA[sqlite]]></category>
<category><![CDATA[sse]]></category>
<category><![CDATA[streaming]]></category>
<category><![CDATA[svelte]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/chatz-generative-ui-ai-chat/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/chatz-1-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/chatz-1-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/chatz-1-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/chatz-1-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/chatz-1.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />Every self-hosted chat UI hands you the same thing: a wall of markdown. You ask the model for last quarter&#8217;s numbers, it writes you a table in monospace, and if ...]]></description>
</item>
<item><title>pr0xteus: Disposable VPN Exits for Apps You Wouldn&#8217;t Trust With Your Password</title><link>https://ciprian.51k.eu/pr0xteus-disposable-vpn-exits/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Fri, 14 Aug 2026 15:15:12 +0000</pubDate>
<category><![CDATA[Containers]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ai skill]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[clawhub]]></category>
<category><![CDATA[container]]></category>
<category><![CDATA[docker]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[networking]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[pr0xteus]]></category>
<category><![CDATA[proxy]]></category>
<category><![CDATA[self-hosted]]></category>
<category><![CDATA[servicepack]]></category>
<category><![CDATA[socks5]]></category>
<category><![CDATA[tailscale]]></category>
<category><![CDATA[vpn]]></category>
<category><![CDATA[wireguard]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/pr0xteus-disposable-vpn-exits/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/pr0xteus-1-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/pr0xteus-1-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/pr0xteus-1-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/pr0xteus-1-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/pr0xteus-1.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />You&#8217;ve got some app that needs to leave the building through a VPN. A scraper, a browser bot, some agent poking at sites that would rather it came from somewhere ...]]></description>
</item>
<item><title>ctxscope: Stop Threading request_id Through Every Function Signature</title><link>https://ciprian.51k.eu/ctxscope-context-scoped-log-attributes-go/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Sat, 08 Aug 2026 20:00:42 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[common-go]]></category>
<category><![CDATA[context]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[ctxscope]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[logging]]></category>
<category><![CDATA[observability]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[request context]]></category>
<category><![CDATA[slog]]></category>
<category><![CDATA[structured logging]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/ctxscope-context-scoped-log-attributes-go/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/ctxscope-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/ctxscope-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/ctxscope-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/ctxscope-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/ctxscope.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />Here&#8217;s the code everybody writes. A request comes in, you generate an id, and something a few calls down needs to log it: func handleOrder(ctx context.Context, requestID string, o Order) ...]]></description>
</item>
<item><title>slogging: Delete Twenty Lines of slog Boilerplate With One Blank Import</title><link>https://ciprian.51k.eu/slogging-configure-search-ship-slog/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Sat, 08 Aug 2026 09:20:58 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[environment]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[handler]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[logging]]></category>
<category><![CDATA[loki]]></category>
<category><![CDATA[observability]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[slog]]></category>
<category><![CDATA[slogging]]></category>
<category><![CDATA[structured logging]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/?p=1385</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/slogging-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/slogging-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/slogging-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/slogging-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/slogging.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />Go 1.21 shipped log/slog and it&#8217;s good. What it doesn&#8217;t ship is any way to configure it, so every service starts with a version of this: var level slog.Level switch ...]]></description>
</item>
<item><title>essessey: Stream a Turn Anywhere Without Rewriting It</title><link>https://ciprian.51k.eu/essessey-stream-a-turn-anywhere-without-rewriting-it/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Wed, 05 Aug 2026 15:52:01 +0000</pubDate>
<category><![CDATA[AI Tooling]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ai]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[elelem]]></category>
<category><![CDATA[essessey]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[llm]]></category>
<category><![CDATA[nats]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[protocol]]></category>
<category><![CDATA[reasoning]]></category>
<category><![CDATA[sse]]></category>
<category><![CDATA[streaming]]></category>
<category><![CDATA[websocket]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/?p=1364</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/essessey-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/essessey-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/essessey-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/essessey-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/essessey.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />The first version streamed over SSE. Then something needed the same turn over NATS, and I found out I&#8217;d built the framing into the wrong layer. event: / data: / ...]]></description>
</item>
<item><title>elelem: Say It Out Loud, You&#8217;ll Get It</title><link>https://ciprian.51k.eu/elelem-say-it-out-loud-youll-get-it/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Tue, 04 Aug 2026 23:53:53 +0000</pubDate>
<category><![CDATA[AI Tooling]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ai]]></category>
<category><![CDATA[anthropic]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[elelem]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[llm]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[openai]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[queue]]></category>
<category><![CDATA[streaming]]></category>
<category><![CDATA[structured output]]></category>
<category><![CDATA[tokenizer]]></category>
<category><![CDATA[tool calling]]></category>
<category><![CDATA[z.ai]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/elelem-say-it-out-loud-youll-get-it/</guid><description><![CDATA[<img
width="300" height="150" src="https://ciprian.51k.eu/upld/2026/08/elelem-300x150.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/08/elelem-300x150.jpg 300w, https://ciprian.51k.eu/upld/2026/08/elelem-768x384.jpg 768w, https://ciprian.51k.eu/upld/2026/08/elelem-600x300.jpg 600w, https://ciprian.51k.eu/upld/2026/08/elelem.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" />The moment that decides what kind of library you&#8217;re writing is the one where a human has to approve a tool call. Everything is lovely right up until then. The ...]]></description>
</item>
<item><title>slog-configurator: Same Zero-Config Logging, Now on the Standard Library</title><link>https://ciprian.51k.eu/slog-configurator-stdlib-logging-zero-config/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Wed, 29 Apr 2026 23:25:03 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[configuration]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[helper]]></category>
<category><![CDATA[logging]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[quickie]]></category>
<category><![CDATA[slog]]></category>
<category><![CDATA[slog-configurator]]></category>
<category><![CDATA[stdlib]]></category>
<category><![CDATA[structured logging]]></category>
<category><![CDATA[wrapper]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/slog-configurator-stdlib-logging-zero-config/</guid><description><![CDATA[<img
width="300" height="163" src="https://ciprian.51k.eu/upld/2026/04/360_F_1527695117_xLoJujJNYHNRJsEANNICi3tVN367XcMB-300x163.webp" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/04/360_F_1527695117_xLoJujJNYHNRJsEANNICi3tVN367XcMB-300x163.webp 300w, https://ciprian.51k.eu/upld/2026/04/360_F_1527695117_xLoJujJNYHNRJsEANNICi3tVN367XcMB.webp 661w" sizes="(max-width: 300px) 100vw, 300px" />Update, August 2026: this package moved. slog-configurator is now github.com/psyb0t/slogging, where the configurator lives at slogconf/ alongside two handlers it always belonged next to: the searchable in-memory ring at handlers/logring/ ...]]></description>
</item>
<item><title>proxq: Async HTTP for Backends That Won&#8217;t Stop Timing Out</title><link>https://ciprian.51k.eu/docker-proxq-async-http-queue-for-slow-backends/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Wed, 29 Apr 2026 23:23:53 +0000</pubDate>
<category><![CDATA[Containers]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[ai skill]]></category>
<category><![CDATA[api-gateway]]></category>
<category><![CDATA[async]]></category>
<category><![CDATA[asynq]]></category>
<category><![CDATA[clawhub]]></category>
<category><![CDATA[container]]></category>
<category><![CDATA[docker]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[http]]></category>
<category><![CDATA[infrastructure]]></category>
<category><![CDATA[llm]]></category>
<category><![CDATA[microservices]]></category>
<category><![CDATA[proxy]]></category>
<category><![CDATA[queue]]></category>
<category><![CDATA[redis]]></category>
<category><![CDATA[reverse proxy]]></category>
<category><![CDATA[self-hosted]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/docker-proxq-async-http-queue-for-slow-backends/</guid><description><![CDATA[<img
width="300" height="213" src="https://ciprian.51k.eu/upld/2026/04/shot-of-a-little-boy-standing-in-a-corner-at-home-300x213.webp" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://ciprian.51k.eu/upld/2026/04/shot-of-a-little-boy-standing-in-a-corner-at-home-300x213.webp 300w, https://ciprian.51k.eu/upld/2026/04/shot-of-a-little-boy-standing-in-a-corner-at-home.webp 612w" sizes="(max-width: 300px) 100vw, 300px" />Some HTTP requests take forever. LLM completions, image generation, video transcoding, big report builds, slow webhook processors: they all sit there chewing on something while your reverse proxy in front ...]]></description>
</item>
</channel>
</rss>
<!--
*** This site runs WP Super Minify plugin v2.0.1 - http://wordpress.org/plugins/wp-super-minify ***
*** Total size saved: 3.448% | Size before compression: 22277 bytes | Size after compression: 21509 bytes. ***
-->