<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Marv&#39;s Blog</title>
  <subtitle>Random thoughts and learnings I had, documented publicly.</subtitle>
  <link href="https://blog.lt-mr.de/doc/trunk/www/feed/feed.xml" rel="self" />
  <link href="https://blog.lt-mr.de/doc/trunk/www/" />
  <updated>2026-03-31T00:00:00Z</updated>
  <id>https://blog.lt-mr.de/doc/trunk/www/</id>
  <author>
    <name>Marvin Altemeier</name>
  </author>
  <entry>
    <title>TIL: Copilot CLI and VSCode Integration</title>
    <link href="https://blog.lt-mr.de/doc/trunk/www/blog/copilot_cli_vscode/" />
    <updated>2026-03-31T00:00:00Z</updated>
    <id>https://blog.lt-mr.de/doc/trunk/www/blog/copilot_cli_vscode/</id>
    <content type="html">&lt;p&gt;Today I used the Copilot CLI for the first time instead of going through the VSCode integration directly and was surprised by the UX.
When asking to change files, the CLI opens the diff in VSCode as well, making it easier to review the changes.
Motivates me to check out the integration between VSCode and the CLI further and see what other quality of life features I may be able to benefit from.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Claude vs GitHub Copilot pricing and limits</title>
    <link href="https://blog.lt-mr.de/doc/trunk/www/blog/claude_vs_copilot_pricing/" />
    <updated>2026-03-28T00:00:00Z</updated>
    <id>https://blog.lt-mr.de/doc/trunk/www/blog/claude_vs_copilot_pricing/</id>
    <content type="html">&lt;p&gt;For the month of March, I decided to dive deeper into the wild ocean that is agentic coding. I have been a big fan of the code completions that GitHub Copilot provided in its early versions (and was even an early adopter of &lt;a href=&quot;https://www.tabnine.com/&quot;&gt;TabNine&lt;/a&gt;), but was a bit hesitant to hand over the wheel entirely and essentially become a backseat-developer. Being in full control of the code is what I always enjoyed in this hobby and craft.&lt;/p&gt;
&lt;p&gt;So while I don&#39;t write any code at work anymore, the spark is still bright and I wanted to see what I can achieve with the new tools when I am not writing code, but rather &amp;quot;orchestrating&amp;quot; it.&lt;/p&gt;
&lt;p&gt;I have opted for one month of Claude Pro to use Claude Code with my personal browser game project. While I do not consider myself an experienced prompt engineer, I do try to keep context small. Nevertheless, I kept burning through Claude&#39;s usage limits like they were nothing. Their session limit does not allow any serious coding session and their weekly limit will disappear quickly if you are regularly hitting the session cap. Claude Pro does not cost a lot of money, but I do not feel that I get my money&#39;s worth out of it.&lt;/p&gt;
&lt;p&gt;In comparison, my existing GitHub Copilot pricing and limits seem to be a lot more forgiving. They charge you for what they call &lt;a href=&quot;https://docs.github.com/en/billing/concepts/product-billing/github-copilot-premium-requests&quot;&gt;premium requests&lt;/a&gt;. While strictly defined in the provided link, I find it hard to track what seems to be premium and what is not, because the count of premium requests does not rise as quickly as my usage in Claude.&lt;/p&gt;
&lt;p&gt;When hitting limits, both platforms allow you to pay per additional request. Claude&#39;s approach sticks with the regular usage here as well: You seem to keep burning through their credits like it is nothing. I paid 10 Euro to get some over-limit usage and quickly realized that this wouldn&#39;t last me long.&lt;/p&gt;
&lt;p&gt;Copilot on the other hand charges 0.04 Euro per premium request, which do not rack up quickly.&lt;/p&gt;
&lt;p&gt;While this was no thorough research, my personal observation is clear: Claude will charge me for anything, fast and with little transparency. Copilot will charge me for something, a bit more transparent and with pricing in my favor.&lt;/p&gt;
&lt;p&gt;For now, I am not going to pay for another month of Claude Pro but rather invest a few extra Euros with GitHub when hitting my limits.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Blog setup</title>
    <link href="https://blog.lt-mr.de/doc/trunk/www/blog/blog_setup/" />
    <updated>2026-03-18T00:00:00Z</updated>
    <id>https://blog.lt-mr.de/doc/trunk/www/blog/blog_setup/</id>
    <content type="html">&lt;p&gt;I have been looking into setting up a blog for a long time, but never really imagined having any content for it. Inspired by &lt;a href=&quot;https://simonwillison.net/guides/agentic-engineering-patterns/hoard-things-you-know-how-to-do/&quot;&gt;Simon Willison&lt;/a&gt;, I decided to use this as a sort of public knowledge base, documenting what I know and learn and possibly helping others out with it as well.&lt;/p&gt;
&lt;p&gt;Setting this up, I had a few clear requirements in mind on how this should work out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Serve static HTML. I don&#39;t want to maintain some larger platform like WordPress or the like&lt;/li&gt;
&lt;li&gt;Serve the HTML from a &lt;a href=&quot;https://fossil-scm.org&quot;&gt;fossil&lt;/a&gt; instance. I am versioning this in fossil anyway, no need to include extra deploy steps if not strictly necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything was fairly straightforward, the first &lt;a href=&quot;https://kagi.com&quot;&gt;Kagi&lt;/a&gt; search results recommended &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; for static site generation, which I went with.&lt;/p&gt;
&lt;p&gt;Fossil has built-in support for versioned documentation, meaning you can serve any checked-in HTML (or fossil-wiki) files from the &lt;code&gt;/doc&lt;/code&gt; path. So when building the blog, I am committing the generated static files to the &lt;code&gt;www&lt;/code&gt; directory which will then allow fossil to serve them from &lt;code&gt;blog.lt-mr.de/doc/trunk/www&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This has the obvious downside of having this &amp;quot;polluted&amp;quot; base URL, instead of having a clean slate after &lt;code&gt;.de&lt;/code&gt;. Having a pretty URL was and is not part of my requirements though, so I am accepting it as it is.&lt;/p&gt;
&lt;p&gt;While setting this up, I wondered if this will mean that I have to commit each time I want to look at a newly written blog post, as &lt;code&gt;trunk&lt;/code&gt; in the URL represents the branch the files are pulled from. Luckily, this is a non-issue: in my local &lt;code&gt;fossil ui&lt;/code&gt;, I can look at the currently changed files under &lt;code&gt;/doc/ckout/www&lt;/code&gt;, &lt;code&gt;ckout&lt;/code&gt; representing the changes in my current checkout.&lt;/p&gt;
&lt;p&gt;Deployment of the fossil server is as easy as it gets for me: I am already running a VPS with a Docker reverse proxy. Setting up a Dockerfile to build the image:&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; alpine:edge&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; USERNAME=fossil&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; addgroup -Sg 400 g&lt;span class=&quot;token variable&quot;&gt;$USERNAME&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
  &amp;amp;&amp;amp; adduser -Su 400 -G g&lt;span class=&quot;token variable&quot;&gt;$USERNAME&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$USERNAME&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
  &amp;amp;&amp;amp; apk update &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
  &amp;amp;&amp;amp; apk upgrade &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
  &amp;amp;&amp;amp; apk add fossil&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;VOLUME&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;/fossils&quot;&lt;/span&gt;]&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/fossils&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8181&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;/usr/bin/fossil&quot;&lt;/span&gt;]&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;server&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;--nojail&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;--https&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;--port&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;8181&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;/fossils/blog.fossil&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I added that image to my deployment (I may write about the details some other day) and pointing the DNS to it.&lt;/p&gt;
&lt;p&gt;If everything works as intended, you should be reading this blog right now.&lt;/p&gt;
</content>
  </entry>
</feed>