<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Marek Šuppa</title><link>https://mareksuppa.com/</link><description>Personal site of Marek Šuppa — writing, teaching, and learning.</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>CC BY 4.0</copyright><lastBuildDate>Mon, 13 Apr 2026 13:01:11 +0000</lastBuildDate><atom:link href="https://mareksuppa.com/feed.xml" rel="self" type="application/rss+xml"/><item><title>Displaying account-specific Claude Code rate limits with ccstatusline</title><link>https://mareksuppa.com/til/claude-code-rate-limits-ccstatusline/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/claude-code-rate-limits-ccstatusline/</guid><description>&lt;p&gt;&lt;a href="https://github.com/sirmalloc/ccstatusline"&gt;ccstatusline&lt;/a&gt; is a status bar for &lt;a href="https://docs.anthropic.com/en/docs/claude-code"&gt;Claude Code&lt;/a&gt; &amp;ndash; it makes it easy to see model info, git branch, token count, cost, context window, and all sorts of other things right from the Claude Code CLI. Since &lt;a href="https://github.com/sirmalloc/ccstatusline/pull/168"&gt;v2.1.0&lt;/a&gt; (March 2026) it can also show rate limit utilization via the Anthropic OAuth API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SessionUsage&lt;/code&gt; &amp;ndash; how much of the current 5-hour block you&amp;rsquo;ve already burned through&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WeeklyUsage&lt;/code&gt; &amp;ndash; similar concept for the 7-day rolling window&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BlockResetTimer&lt;/code&gt; / &lt;code&gt;WeeklyResetTimer&lt;/code&gt; &amp;ndash; countdown until the session / weekly reset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="ccstatusline-usage.png" alt="ccstatusline showing session usage at 15%, weekly at 32%, reset timers, cost, and context window"&gt;&lt;/p&gt;</description></item><item><title>Cooldown periods for package updates</title><link>https://mareksuppa.com/til/package-manager-cooldown-periods/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/package-manager-cooldown-periods/</guid><description>&lt;p&gt;The last two weeks of March 2026 were brutal for software supply chains. A &lt;a href="https://arcticwolf.com/resources/blog/teampcp-supply-chain-attack-campaign-targets-trivy-checkmarx-kics-and-litellm-potential-downstream-impact-to-additional-projects/"&gt;cascading campaign&lt;/a&gt; by a threat actor tracked as &lt;strong&gt;TeamPCP&lt;/strong&gt; started with a compromised credential in &lt;a href="https://www.aquasec.com/blog/trivy-supply-chain-attack-what-you-need-to-know/"&gt;Trivy&lt;/a&gt; (Aqua Security&amp;rsquo;s vulnerability scanner), which was then used to hijack &lt;a href="https://www.sysdig.com/blog/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions"&gt;Checkmarx KICS&lt;/a&gt; and then &lt;a href="https://www.wiz.io/blog/threes-a-crowd-teampcp-trojanizes-litellm-in-continuation-of-campaign"&gt;LiteLLM&lt;/a&gt; (an LLM proxy with ~97M monthly PyPI downloads). On top of that, &lt;a href="https://socket.dev/blog/axios-npm-package-compromised"&gt;axios&lt;/a&gt; &amp;ndash; the most popular HTTP client on npm with ~100M weekly downloads &amp;ndash; was &lt;a href="https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan"&gt;compromised&lt;/a&gt; through a stolen maintainer token, with Google&amp;rsquo;s Threat Intelligence Group &lt;a href="https://therecord.media/google-links-axios-supply-chain-attack-north-korea"&gt;attributing the attack&lt;/a&gt; to North Korea&amp;rsquo;s UNC1069.&lt;/p&gt;</description></item><item><title>Storing API keys for Claude Code providers in KeePassXC</title><link>https://mareksuppa.com/til/keepassxc-claude-code-api-keys/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/keepassxc-claude-code-api-keys/</guid><description>&lt;p&gt;A growing number of providers expose Anthropic-compatible API endpoints for Claude Code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.minimax.io/docs/guides/text-ai-coding-tools"&gt;MiniMax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.z.ai/devpack/tool/claude#manual-configuration"&gt;Z.AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api-docs.deepseek.com/guides/anthropic_api"&gt;DeepSeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.moonshot.ai/docs/guide/agent-support"&gt;Moonshot/Kimi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alibabacloud.com/help/en/model-studio/claude-code"&gt;Alibaba/DashScope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration"&gt;OpenRouter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They all work the same way: set &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; and &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;, and Claude Code talks to them instead of Anthropic. Their docs typically suggest putting the key straight into &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;json&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;ANTHROPIC_BASE_URL&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;https://api.minimax.io/anthropic&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;ANTHROPIC_AUTH_TOKEN&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;MINIMAX_API_KEY&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That, unfortunately, involves saving a plaintext secret on disk. Plaintext secrets anywhere near Claude Code are risky &amp;ndash; it has been &lt;a href="https://github.com/anthropics/claude-code/issues/9637"&gt;known&lt;/a&gt; to read &lt;code&gt;.env&lt;/code&gt; files and leak their contents into session transcripts and tool-result logs under &lt;code&gt;~/.claude/&lt;/code&gt;, and &lt;code&gt;settings.json&lt;/code&gt; itself is no safer. A &lt;a href="https://gist.github.com/spideynolove/13785891385ed6916619ebb991b490b9"&gt;popular workaround&lt;/a&gt; is a &lt;code&gt;~/.secrets&lt;/code&gt; file sourced from your shell profile, but that still means the key is stored in plaintext, just somewhere else.&lt;/p&gt;</description></item><item><title>Claude Code Cheat Sheet</title><link>https://mareksuppa.com/links/claude-code-cheat-sheet/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/links/claude-code-cheat-sheet/</guid><description>&lt;p&gt;A nicely organized cheat sheet of Claude Code commands, many of which are not widely known (e.g. &lt;code&gt;/insights&lt;/code&gt;, &lt;code&gt;/review&lt;/code&gt;). &lt;a href="https://news.ycombinator.com/item?id=47501947"&gt;Automatically updated daily&lt;/a&gt;. See also the &lt;a href="https://news.ycombinator.com/item?id=47495527"&gt;Hacker News discussion&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Using --wraps to get tab completions on fish shell aliases</title><link>https://mareksuppa.com/til/fish-wraps-flag/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/fish-wraps-flag/</guid><description>&lt;p&gt;When you write a wrapper function in fish, you can use the &lt;code&gt;--wraps&lt;/code&gt; flag to inherit tab completions from the wrapped command:&lt;/p&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;fish&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fish" data-lang="fish"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;function&lt;/span&gt; &lt;span style="color:#6639ba"&gt;claude&lt;/span&gt;-minimax &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;--wraps&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;claude&amp;#39;&lt;/span&gt; &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;--description&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#39;Run Claude Code against MiniMax M2.7 API&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;https://api.minimax.io/anthropic&amp;#34;&lt;/span&gt; &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#953800"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;MiniMax-M2.7&amp;#34;&lt;/span&gt; &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6639ba"&gt;claude&lt;/span&gt; &lt;span style="color:#953800"&gt;$argv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;--wraps='claude'&lt;/code&gt; tells fish that &lt;code&gt;claude-minimax&lt;/code&gt; is a wrapper around &lt;code&gt;claude&lt;/code&gt;. This means that when you type &lt;code&gt;claude-minimax --&lt;/code&gt; and hit &lt;code&gt;&amp;lt;Tab&amp;gt;&lt;/code&gt;, you get the same completion suggestions as &lt;code&gt;claude --&lt;/code&gt;. Without it, fish has no way of knowing the relationship and you would get no completions at all.&lt;/p&gt;</description></item><item><title>Uploading images to GitHub PRs from the CLI</title><link>https://mareksuppa.com/til/github-pr-images-from-cli/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/github-pr-images-from-cli/</guid><description>&lt;p&gt;GitHub has no public API for uploading images to PR descriptions. The drag-and-drop in the web UI uses an undocumented endpoint (&lt;code&gt;/upload/policies/assets&lt;/code&gt;) that requires browser session cookies &amp;ndash; you simply can not call it with an API token or &lt;code&gt;gh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The GitHub CLI team &lt;a href="https://github.com/cli/cli/issues/1895"&gt;explicitly closed this&lt;/a&gt; as &amp;ldquo;not planned&amp;rdquo;, with the explanation that the upload flow requires a browser to obtain temporary S3 credentials. Pretty understandable but still tough to live with, particularly in this agent era we live in.&lt;/p&gt;</description></item><item><title>How to get the deployed Git commit hash in Portainer CE</title><link>https://mareksuppa.com/til/portainer-ce-git-commit-hash/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/portainer-ce-git-commit-hash/</guid><description>&lt;p&gt;When Portainer Community Edition &lt;a href="https://docs.portainer.io/user/docker/stacks/add"&gt;deploys a stack from a git repository&lt;/a&gt;, it clones the repo, runs &lt;code&gt;docker compose up&lt;/code&gt;, and then &lt;a href="https://github.com/portainer/portainer/blob/develop/api/git/git.go#L56"&gt;&lt;strong&gt;deletes the &lt;code&gt;.git&lt;/code&gt; directory&lt;/strong&gt;&lt;/a&gt;. This means the usual &lt;code&gt;git rev-parse HEAD&lt;/code&gt; trick doesn&amp;rsquo;t work inside the running container &amp;ndash; there&amp;rsquo;s no git history left.&lt;/p&gt;
&lt;p&gt;But Portainer does remember the commit it deployed. The stack API endpoint exposes it in &lt;a href="https://github.com/portainer/portainer/blob/develop/api/git/types/types.go#L30"&gt;&lt;code&gt;GitConfig.ConfigHash&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;bash&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s -H &lt;span style="color:#0a3069"&gt;&amp;#34;X-API-Key: &lt;/span&gt;&lt;span style="color:#953800"&gt;$PORTAINER_API_KEY&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#953800"&gt;$PORTAINER_URL&lt;/span&gt;&lt;span style="color:#0a3069"&gt;/api/stacks/&lt;/span&gt;&lt;span style="color:#953800"&gt;$PORTAINER_STACK_ID&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#0a3069"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; python -m json.tool &lt;span style="color:#1f2328"&gt;|&lt;/span&gt; grep ConfigHash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;json&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;ConfigHash&amp;#34;&lt;/span&gt;&lt;span style="color:#f6f8fa;background-color:#82071e"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;5d346dc4e8b34235c11950e123358ebd85cfa3e8&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is the exact commit SHA that Portainer cloned when it last (re)deployed the stack (&lt;a href="https://docs.portainer.io/faqs/troubleshooting/stacks-deployments-and-updates/how-do-automatic-updates-for-stacks-applications-work"&gt;here&amp;rsquo;s how the update mechanism works&lt;/a&gt;). You can query it at container startup to bake the version into your app. Here&amp;rsquo;s a minimal snippet that writes it to a file (using only Python stdlib, no extra dependencies needed in a slim image):&lt;/p&gt;</description></item><item><title>Google Docs can be exported to Markdown via URL change</title><link>https://mareksuppa.com/til/google-docs-markdown-export/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/google-docs-markdown-export/</guid><description>&lt;p&gt;Google Docs now supports exporting directly to Markdown by tweaking the URL. Take any Google Doc URL like:&lt;/p&gt;
&lt;div class="code-block-wrapper"&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;https://docs.google.com/document/d/1mt8aYM88Jj5qkep1xYC5vj0wBlbX2u6gdxhf_puaiQI/edit?tab=t.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace everything after the document ID with &lt;code&gt;export?format=md&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code-block-wrapper"&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;https://docs.google.com/document/d/1mt8aYM88Jj5qkep1xYC5vj0wBlbX2u6gdxhf_puaiQI/export?format=md&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you use &lt;code&gt;curl&lt;/code&gt; to test it out, you might get just a 307 redirect:&lt;/p&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;bash&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -I &lt;span style="color:#0a3069"&gt;&amp;#34;https://docs.google.com/document/d/1mt8aYM88Jj5qkep1xYC5vj0wBlbX2u6gdxhf_puaiQI/export?format=md&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# HTTP/2 307&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# location: https://doc-0s-...googleusercontent.com/...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Pass &lt;code&gt;-L&lt;/code&gt; to follow it and get the actual Markdown:&lt;/p&gt;</description></item><item><title>Hugo can merge multiple sections into one stream</title><link>https://mareksuppa.com/til/hugo-section-merge/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/til/hugo-section-merge/</guid><description>&lt;p&gt;When building a Hugo site with multiple content types (blog, TIL, links), you can merge them into a single stream on the homepage using &lt;a href="https://gohugo.io/functions/collections/union/"&gt;&lt;code&gt;union&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code-block-wrapper has-lang"&gt;&lt;span class="code-lang-label"&gt;go-html-template&lt;/span&gt;&lt;button class="copy-code-btn" aria-label="Copy code to clipboard"&gt;Copy&lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;{{&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$blog&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;:=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;where&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;site&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.RegularPages&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;Section&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;blog&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;{{&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$links&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;:=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;where&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;site&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.RegularPages&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;Section&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;links&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;{{&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$all&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;:=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;union&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$blog&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$links&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;{{&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;range&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;sort&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;$all&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;Date&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;desc&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;{{&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;end&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is how sites like &lt;a href="https://simonwillison.net/"&gt;simonwillison.net&lt;/a&gt; create a unified content stream from diverse content types.&lt;/p&gt;</description></item><item><title>Write the Paper First</title><link>https://mareksuppa.com/links/write-the-paper-first/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/links/write-the-paper-first/</guid><description>&lt;p&gt;&lt;a href="https://www.cs.jhu.edu/~jason/"&gt;Jason Eisner&lt;/a&gt;&amp;rsquo;s timeless advice on academic writing. The core idea is simple but very impactful: start writing the paper before you have all the results. Writing forces you to clarify your thinking, reveals gaps in your argument, and often redirects the research itself (e.g. what other experiments to do in order to arrive at a coherent story).&lt;/p&gt;</description></item><item><title>skLEP: A comprehensive Slovak NLU benchmark</title><link>https://mareksuppa.com/links/sklep-a-comprehensive-slovak-nlu-benchmark/</link><pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/links/sklep-a-comprehensive-slovak-nlu-benchmark/</guid><description>&lt;p&gt;First comprehensive benchmark for evaluating Slovak natural language understanding. Presented at ACL 2025.&lt;/p&gt;</description></item><item><title>Five things I wish I knew the day I started University</title><link>https://mareksuppa.com/blog/five-things-at-uni/</link><pubDate>Wed, 10 Oct 2018 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/five-things-at-uni/</guid><description>Things I wish someone told me the day I become a university student (for the first time).</description></item><item><title>How to get the most out of RoboCup(Junior)</title><link>https://mareksuppa.com/blog/getting-most-out-of-rcj/</link><pubDate>Thu, 20 Jul 2017 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/getting-most-out-of-rcj/</guid><description>The international RoboCup(Junior) is a unique event. This post summarizes what I would want to know before I participated for the first time.</description></item><item><title>How I built an app for FirefoxOS</title><link>https://mareksuppa.com/blog/how-i-built-a-firefoxos-app/</link><pubDate>Mon, 23 Sep 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/how-i-built-a-firefoxos-app/</guid><description>&amp;hellip; and nearly funded a company.</description></item><item><title>Lavabit</title><link>https://mareksuppa.com/blog/lavabit/</link><pubDate>Fri, 09 Aug 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/lavabit/</guid><description>A few notes on a privacy focused email service and its shutdown.</description></item><item><title>Notes from Nederlands: take two</title><link>https://mareksuppa.com/blog/notes-from-nederlands-take-two/</link><pubDate>Wed, 10 Jul 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/notes-from-nederlands-take-two/</guid><description>Been there, seen that. Nederlands for the first time.</description></item><item><title>Notes from Belgium</title><link>https://mareksuppa.com/blog/notes-from-belgium/</link><pubDate>Sat, 06 Jul 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/notes-from-belgium/</guid><description>Not being somewhere for the first time also has its bright sides. Especially for Belgium.</description></item><item><title>Notes from Nederlands</title><link>https://mareksuppa.com/blog/notes-from-nederlands/</link><pubDate>Sat, 22 Jun 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/notes-from-nederlands/</guid><description>Been there, seen that. Nederlands for the first time.</description></item><item><title>A tale of a physicist and a craftsman</title><link>https://mareksuppa.com/blog/physicist-and-craftsman/</link><pubDate>Thu, 30 May 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/physicist-and-craftsman/</guid><description>Time is the only limit when a physicist meets a craftsman.</description></item><item><title>Writing a blog</title><link>https://mareksuppa.com/blog/blogging/</link><pubDate>Mon, 01 Apr 2013 00:00:00 +0000</pubDate><guid>https://mareksuppa.com/blog/blogging/</guid><description>Those who blog often say that others should start too. Unfortunately, they don&amp;rsquo;t say when.</description></item></channel></rss>