<?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 library Shit | Ciprian Mandache</title>
<atom:link href="https://ciprian.51k.eu/tag/library/feed/" rel="self" type="application/rss+xml" /><link></link>
<description>Mostly writing code that does stuff...</description>
<lastBuildDate>Mon, 17 Aug 2026 20:19:00 +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 library Shit | Ciprian Mandache</title><link></link>
<width>32</width>
<height>32</height>
</image>
<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.png" 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.png 300w, https://ciprian.51k.eu/upld/2026/08/ctxscope-768x384.png 768w, https://ciprian.51k.eu/upld/2026/08/ctxscope-600x300.png 600w, https://ciprian.51k.eu/upld/2026/08/ctxscope.png 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.png" 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.png 300w, https://ciprian.51k.eu/upld/2026/08/slogging-768x384.png 768w, https://ciprian.51k.eu/upld/2026/08/slogging-600x300.png 600w, https://ciprian.51k.eu/upld/2026/08/slogging.png 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[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.png" 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.png 300w, https://ciprian.51k.eu/upld/2026/08/essessey-768x384.png 768w, https://ciprian.51k.eu/upld/2026/08/essessey-600x300.png 600w, https://ciprian.51k.eu/upld/2026/08/essessey.png 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[streaming]]></category>
<category><![CDATA[structured output]]></category>
<category><![CDATA[tokenizer]]></category>
<category><![CDATA[tool calling]]></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.png" 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.png 300w, https://ciprian.51k.eu/upld/2026/08/elelem-768x384.png 768w, https://ciprian.51k.eu/upld/2026/08/elelem-600x300.png 600w, https://ciprian.51k.eu/upld/2026/08/elelem.png 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>aichteeteapee: A Go HTTP Library Named By Someone Who Thinks Spelling Things Out Is Funny</title><link>https://ciprian.51k.eu/aichteeteapee-a-go-http-library-named-by-someone-who-thinks-spelling-things-out-is-funny/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Sat, 18 Apr 2026 04:24:37 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[aichteeteapee]]></category>
<category><![CDATA[api]]></category>
<category><![CDATA[context]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[http]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[middleware]]></category>
<category><![CDATA[Open Source]]></category>
<category><![CDATA[request context]]></category>
<category><![CDATA[server]]></category>
<category><![CDATA[websocket]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/?p=1161</guid><description><![CDATA[<img
width="300" height="295" src="https://ciprian.51k.eu/upld/2026/04/D4cxln0-f1c9d0d2-1a40-4de5-b9fd-9551ea38a6ef-300x295.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/D4cxln0-f1c9d0d2-1a40-4de5-b9fd-9551ea38a6ef-300x295.webp 300w, https://ciprian.51k.eu/upld/2026/04/D4cxln0-f1c9d0d2-1a40-4de5-b9fd-9551ea38a6ef-1024x1005.webp 1024w, https://ciprian.51k.eu/upld/2026/04/D4cxln0-f1c9d0d2-1a40-4de5-b9fd-9551ea38a6ef-768x754.webp 768w, https://ciprian.51k.eu/upld/2026/04/D4cxln0-f1c9d0d2-1a40-4de5-b9fd-9551ea38a6ef.webp 1200w" sizes="(max-width: 300px) 100vw, 300px" />Say it out loud: aichteeteapee. Go on. Sound it out. Aitch-tee-tee-pee. Yeah. That&#8217;s HTTP. I named my Go HTTP library by spelling &#8220;HTTP&#8221; phonetically and published it with a straight ...]]></description>
</item>
<item><title>goenv: Three Functions, One Env Var, Zero Fucks Given</title><link>https://ciprian.51k.eu/goenv-three-functions-one-env-var-zero-fucks-given/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Mon, 16 Mar 2026 09:00:00 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[configuration]]></category>
<category><![CDATA[environment variables]]></category>
<category><![CDATA[go package]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[goenv]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[helper]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[quickie]]></category>
<category><![CDATA[servicepack]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/goenv-three-functions-one-env-var-zero-fucks-given/</guid><description><![CDATA[<img
width="300" height="300" src="https://ciprian.51k.eu/upld/2026/03/goenv-300x300.png" 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/03/goenv-300x300.png 300w, https://ciprian.51k.eu/upld/2026/03/goenv-150x150.png 150w, https://ciprian.51k.eu/upld/2026/03/goenv-768x768.png 768w, https://ciprian.51k.eu/upld/2026/03/goenv.png 1024w" sizes="(max-width: 300px) 100vw, 300px" />Every service I write needs exactly one piece of information before it does anything else: is this thing running in prod, or is some poor bastard (me, at 2am, half ...]]></description>
</item>
<item><title>gorpitx: Twelve Ways to Turn a Raspberry Pi Into a Broadcast Tower (and a Legal Problem)</title><link>https://ciprian.51k.eu/gorpitx-twelve-ways-to-turn-a-raspberry-pi-into-a-broadcast-tower-and-a-legal-problem/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Fri, 12 Sep 2025 09:00:00 +0000</pubDate>
<category><![CDATA[Embedded]]></category>
<category><![CDATA[Golang]]></category>
<category><![CDATA[Radio]]></category>
<category><![CDATA[embedded]]></category>
<category><![CDATA[go package]]></category>
<category><![CDATA[Go programming language]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[gorpitx]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[package]]></category>
<category><![CDATA[piraterf]]></category>
<category><![CDATA[pizero]]></category>
<category><![CDATA[radio]]></category>
<category><![CDATA[raspberry pi]]></category>
<category><![CDATA[rf transmission]]></category>
<category><![CDATA[rpitx]]></category>
<category><![CDATA[wrapper]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/gorpitx-twelve-ways-to-turn-a-raspberry-pi-into-a-broadcast-tower-and-a-legal-problem/</guid><description><![CDATA[<img
width="300" height="300" src="https://ciprian.51k.eu/upld/2025/09/gorpitx-300x300.png" 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/2025/09/gorpitx-300x300.png 300w, https://ciprian.51k.eu/upld/2025/09/gorpitx-150x150.png 150w, https://ciprian.51k.eu/upld/2025/09/gorpitx-768x768.png 768w, https://ciprian.51k.eu/upld/2025/09/gorpitx.png 1024w" sizes="(max-width: 300px) 100vw, 300px" />When I was building PIrateRF, I had two options. Option one: shell out to a pile of C binaries from rpitx every time I wanted to key up a transmitter, ...]]></description>
</item>
<item><title>ctxerrors: Because Go&#8217;s Error Handling Doesn&#8217;t Have to Be Complete Shit</title><link>https://ciprian.51k.eu/ctxerrors-because-gos-error-handling-doesnt-have-to-be-complete-shit/</link>
<dc:creator><![CDATA[Ciprian Mandache]]></dc:creator>
<pubDate>Sun, 07 Sep 2025 15:20:44 +0000</pubDate>
<category><![CDATA[Golang]]></category>
<category><![CDATA[context]]></category>
<category><![CDATA[contexterrors]]></category>
<category><![CDATA[ctx]]></category>
<category><![CDATA[ctxerrors]]></category>
<category><![CDATA[debugging]]></category>
<category><![CDATA[error]]></category>
<category><![CDATA[error handling]]></category>
<category><![CDATA[golang]]></category>
<category><![CDATA[library]]></category>
<category><![CDATA[package]]></category>
<guid
isPermaLink="false">https://ciprian.51k.eu/?p=945</guid><description><![CDATA[<img
width="300" height="187" src="https://ciprian.51k.eu/upld/2025/09/Screenshot_2025-09-07_18-20-01-300x187.png" 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/2025/09/Screenshot_2025-09-07_18-20-01-300x187.png 300w, https://ciprian.51k.eu/upld/2025/09/Screenshot_2025-09-07_18-20-01-768x478.png 768w, https://ciprian.51k.eu/upld/2025/09/Screenshot_2025-09-07_18-20-01-480x300.png 480w, https://ciprian.51k.eu/upld/2025/09/Screenshot_2025-09-07_18-20-01-640x400.png 640w, https://ciprian.51k.eu/upld/2025/09/Screenshot_2025-09-07_18-20-01.png 870w" sizes="(max-width: 300px) 100vw, 300px" />Look, I&#8217;m gonna be straight with you. Go&#8217;s error handling is fucking verbose, and debugging without context is like trying to find your keys in a pitch-black room while drunk. ...]]></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.296% | Size before compression: 17355 bytes | Size after compression: 16783 bytes. ***
-->