<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Deep Thoughts | Deep Thoughts</title><description/><link>https://blog.trueberryless.org/</link><language>en</language><item><title>Rising community at tomorrow&apos;s horizon</title><link>https://blog.trueberryless.org/blog/npmx/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/npmx/</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here I am. Thoughtfully sitting like the French sculptor Auguste Rodin imagined “The Thinker” (&lt;em&gt;Le Penseur&lt;/em&gt;) in the late 19th century. Thinking about how to write a blog post which should express deepest gratitude, but unable to find the right words to do so.&lt;/p&gt;

&lt;p&gt;Projects come and go. They develop; they move on. Sometimes they finish, but often they don’t - especially personal or side projects. But they rarely evolve at light speed. They rarely explode. Nuke the entire ecosystem with their majesty. Rise like a superhuman. Unite. Shine. And inspire. Bring together what was thought far apart. Combining thoughts of hundreds through vision. Making the impossible possible. Sometimes I feel like I should have become a poet. Until I publish my content… and I realize that tools like &lt;a href=&quot;https://github.com/npmx-dev/npmx.dev&quot;&gt;&lt;img src=&quot;https://github.com/npmx-dev.png&quot; alt=&quot;npmx-dev&quot;&gt;npmx&lt;/a&gt; are the ink for my digital poetry.&lt;/p&gt;
&lt;p&gt;Poetry or not aside: I recently discovered a newly forming community of talented people, connected by the vision of creating a fast and modern browser for the npm registry. What sounds simple on paper - or should I say in the &lt;code dir=&quot;auto&quot;&gt;README.md&lt;/code&gt; - got features added more quickly than it takes Nutella to sell 1,000 jars of their hazelnut cocoa spread; worldwide — goes without saying. In the early days - before people needed vacation (if you know you know), the young project’s main branch struggled to keep up with all the good stuff called “commits” in our world that came around every 37 minutes, 24/7. I wouldn’t have been amazed if GitHub had spun up a dedicated Azure data centre just for our commitment.&lt;/p&gt;
&lt;p&gt;Now what actually is npmx? For those just discovering it, npmx is a lightning-fast, modern browser for the npm registry, reimagining how developers explore and discover packages. It doesn’t host the package itself, it’s just a way to interact with all the awesome npm packages you already love. The community plays a very important role, and we define the features we want to have ourselves. The project started with Daniel Roe asking people on Bluesky for what they wished npmjs.org had, without explaining the reason for his question. This way, a handful of useful features for maintainers and consumers like managing, comparing or even liking packages made their way from ideas to reality. It’s really impressive what people can build together when they have a common belief, unbounded by possibilities, formed by imagination.&lt;/p&gt;
&lt;p&gt;While many faces were familiar, the sheer number of developers, designers, security and a11y experts, organisers, sponsors and all other professionals that I didn’t even know existed before was just mind-blowing. ¡Ay! ¡Estoy abrumado! I am definitely proud of what we have already achieved. And I am looking forward to what we will achieve. As developers, but much more as a community. I am here to stay!&lt;/p&gt;
&lt;p&gt;Leave a comment or two, depending on how talkative you are 👋&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;-resources&quot;&gt;🔗 Resources&lt;/h2&gt;&lt;a href=&quot;#-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://npmx.dev&quot;&gt;npmx.dev&lt;/a&gt; - The official npmx website&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://npmx.dev/blog/alpha-release&quot;&gt;Announcement Post&lt;/a&gt; - Read the official alpha blog post&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmx.dev&quot;&gt;Documentation&lt;/a&gt; - Get started with npmx&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chat.npmx.dev&quot;&gt;Discord Server&lt;/a&gt; - Chat with the community&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://npmx.dev/recharging&quot;&gt;Vacation&lt;/a&gt; - One-week break; Discord offline&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>Mindspace</category><category>Collaboration</category></item><item><title>Recommended Git Config</title><link>https://blog.trueberryless.org/blog/recommended-git-config/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/recommended-git-config/</guid><description>Do you wanna improve your workflow? Are you looking for some tips and tricks for git? Then this post is definitely worth checking out 😉

</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In order to optimize my git workflow, specifically for GitHub, I present you with some configs and tricks that I set up.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;automatic-rebase&quot;&gt;Automatic rebase&lt;/h2&gt;&lt;a href=&quot;#automatic-rebase&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Since I like to keep my commit history linear, I personally prefer to rebase instead of merge when I pull new changes from the remote repository. This means that if I run &lt;code dir=&quot;auto&quot;&gt;git pull&lt;/code&gt;, it will not perform a &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;merge&lt;/code&gt; but rather a &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; followed by a &lt;code dir=&quot;auto&quot;&gt;rebase&lt;/code&gt;, which results in my local commits being automatically included on top of the remote commits coming in. That way, I avoid having merge commits that would IMHO pollute the history.&lt;/p&gt;
&lt;p&gt;If you want to try this out yourself, use the &lt;code dir=&quot;auto&quot;&gt;--rebase&lt;/code&gt; parameter on &lt;code dir=&quot;auto&quot;&gt;pull&lt;/code&gt; like that:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rebase&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you feel happy with this workflow, you can set it in your global config, so you don’t need to include the &lt;code dir=&quot;auto&quot;&gt;--rebase&lt;/code&gt; option anymore:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull.rebase&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;default-branch-main&quot;&gt;Default branch: &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt;&lt;/h2&gt;&lt;a href=&quot;#default-branch-main&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;By default, git often initializes new repositories with &lt;code dir=&quot;auto&quot;&gt;master&lt;/code&gt; as the primary branch. However, most modern platforms (especially GitHub) have moved towards using &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt;. Instead of renaming your branch every time you run &lt;code dir=&quot;auto&quot;&gt;git init&lt;/code&gt;, you can tell git to use &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; globally by default:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init.defaultBranch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;adding-co-authors&quot;&gt;Adding co-authors&lt;/h2&gt;&lt;a href=&quot;#adding-co-authors&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I really like to credit people who contributed in any way to my commits. What I find annoying, however, is that you have to know the GitHub email address of the user you want to &lt;a href=&quot;https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors&quot;&gt;Co-author&lt;/a&gt;. I used to go to the people’s profile, search for a recent commit they made and appending &lt;code dir=&quot;auto&quot;&gt;.patch&lt;/code&gt; to the GitHub commit URL. In the diff that you get this way, you can manually extract the email of the user. But why should I manually do this 1min work if I could spend 10h automating it?&lt;/p&gt;
&lt;div&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/automation.png&quot; alt=&quot;An xkcd comic strip titled &amp;#x27;Automation&amp;#x27; exploring the discrepancy between theoretical expectation and reality. In the &amp;#x27;THEORY&amp;#x27; panel, a graph shows a brief spike for &amp;#x27;WRITING CODE&amp;#x27; before a sharp decline as &amp;#x27;AUTOMATION TAKES OVER,&amp;#x27; leaving vast &amp;#x27;FREE TIME.&amp;#x27; In the &amp;#x27;REALITY&amp;#x27; panel, the &amp;#x27;WRITING CODE&amp;#x27; spike leads into a fluctuating line of &amp;#x27;DEBUGGING&amp;#x27; and &amp;#x27;RETHINKING&amp;#x27; that eventually climbs steadily upward as &amp;#x27;ONGOING DEVELOPMENT,&amp;#x27; leaving &amp;#x27;NO TIME FOR ORIGINAL TASK ANYMORE&amp;#x27; as the workload permanently increases beyond the original baseline.&quot;&gt;&lt;button aria-label=&quot;Zoom image: An xkcd comic strip titled &amp;#x27;Automation&amp;#x27; exploring the discrepancy between theoretical expectation and reality. In the &amp;#x27;THEORY&amp;#x27; panel, a graph shows a brief spike for &amp;#x27;WRITING CODE&amp;#x27; before a sharp decline as &amp;#x27;AUTOMATION TAKES OVER,&amp;#x27; leaving vast &amp;#x27;FREE TIME.&amp;#x27; In the &amp;#x27;REALITY&amp;#x27; panel, the &amp;#x27;WRITING CODE&amp;#x27; spike leads into a fluctuating line of &amp;#x27;DEBUGGING&amp;#x27; and &amp;#x27;RETHINKING&amp;#x27; that eventually climbs steadily upward as &amp;#x27;ONGOING DEVELOPMENT,&amp;#x27; leaving &amp;#x27;NO TIME FOR ORIGINAL TASK ANYMORE&amp;#x27; as the workload permanently increases beyond the original baseline.&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/is_it_worth_the_time.png&quot; alt=&quot;An xkcd comic titled &amp;#x27;Is It Worth the Time?&amp;#x27; featuring a grid that calculates the time-saving break-even point over five years. The horizontal axis lists task frequency (50/day to yearly) and the vertical axis lists time saved per task (1 second to 1 day). Each cell shows the maximum time you should spend automating; for instance, saving 30 seconds on a daily task justifies 12 hours of work, while saving 1 second on a yearly task justifies only 5 seconds. The table uses various units like minutes, hours, days, weeks, and months to illustrate the limits of efficient automation.&quot;&gt;&lt;button aria-label=&quot;Zoom image: An xkcd comic titled &amp;#x27;Is It Worth the Time?&amp;#x27; featuring a grid that calculates the time-saving break-even point over five years. The horizontal axis lists task frequency (50/day to yearly) and the vertical axis lists time saved per task (1 second to 1 day). Each cell shows the maximum time you should spend automating; for instance, saving 30 seconds on a daily task justifies 12 hours of work, while saving 1 second on a yearly task justifies only 5 seconds. The table uses various units like minutes, hours, days, weeks, and months to illustrate the limits of efficient automation.&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/div&gt;
&lt;p&gt;Sorry, I just had to include those two &lt;a href=&quot;https://xkcd.com/1319/&quot;&gt;legendary&lt;/a&gt; &lt;a href=&quot;https://xkcd.com/1205/&quot;&gt;xkcds&lt;/a&gt; in here.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So I created a little bash script which simplifies adding Co-authors to your commits. All you need is &lt;code dir=&quot;auto&quot;&gt;gh&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;jq&lt;/code&gt; installed, and the little bash script below.&lt;/p&gt;
&lt;starlight-tabs&gt; &lt;div&gt; &lt;ul role=&quot;tablist&quot;&gt; &lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-15&quot; id=&quot;tab-15&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt;  MacOS &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-16&quot; id=&quot;tab-16&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;  Linux &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-17&quot; id=&quot;tab-17&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;  Windows &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div id=&quot;tab-panel-15&quot; aria-labelledby=&quot;tab-15&quot; role=&quot;tabpanel&quot;&gt; &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-16&quot; aria-labelledby=&quot;tab-16&quot; role=&quot;tabpanel&quot; hidden&gt; &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-17&quot; aria-labelledby=&quot;tab-17&quot; role=&quot;tabpanel&quot; tabindex=&quot;0&quot; hidden&gt; &lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Just use WSL please.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt; &lt;/div&gt;  &lt;/starlight-tabs&gt;  
&lt;p&gt;Save this bash script as &lt;code dir=&quot;auto&quot;&gt;git-ucommit&lt;/code&gt; to a folder that is in your &lt;code dir=&quot;auto&quot;&gt;$PATH&lt;/code&gt; (like &lt;code dir=&quot;auto&quot;&gt;~/bin&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;/usr/local/bin&lt;/code&gt;) and make it executable with &lt;code dir=&quot;auto&quot;&gt;chmod +x ~/bin/git-ucommit&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;~/bin/git-ucommit&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Check for dependencies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; /dev/null &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; /dev/null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Error: &apos;gh&apos; (GitHub CLI) and &apos;jq&apos; are required.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;=()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;usernames&lt;/span&gt;&lt;span&gt;=()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Parse arguments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$#&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-gt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;--user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;usernames&lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;shift&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;--message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;shift&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;*)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;shift&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;esac&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;trailer_args&lt;/span&gt;&lt;span&gt;=()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Resolve GitHub usernames to Co-authored-by trailers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;usernames&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;user_json&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;gh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;users/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$user&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-ne&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Warning: Could not find GitHub user &apos;$user&apos;. Skipping.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$user_json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.name // .login&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$user_json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jq&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.id&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$id+$user@users.noreply.github.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;trailer_args&lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--trailer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Co-authored-by: $name &amp;#x3C;$email&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Execute the commit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$message&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;final_msg&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$message&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;interpret-trailers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;trailer_args&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$final_msg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# No -m flag? Inject trailers and open the editor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;trailer_args&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Since the file name starts with &lt;code dir=&quot;auto&quot;&gt;git-&lt;/code&gt;, you do not even need to create a git alias, as it is smart enough to detect your executable and just allows you run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ucommit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fix: suggestions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trueberryless&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delucis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Unfortunately, I didn’t find a way to add those options to the default &lt;code dir=&quot;auto&quot;&gt;commit&lt;/code&gt; command, so I prepended the letter &lt;code dir=&quot;auto&quot;&gt;u&lt;/code&gt; to it, which stands for users.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;I myself integrated this functionality into my &lt;a href=&quot;https://github.com/nix-darwin/nix-darwin&quot;&gt;&lt;img src=&quot;https://github.com/nix-darwin.png&quot; alt=&quot;nix-darwin&quot;&gt;nix-darwin&lt;/a&gt; setup. Check out my &lt;a href=&quot;https://github.com/trueberryless/nix/blob/a1be76b4723b0061c34cca1063a477774156ce0a/modules/git-tools.nix&quot;&gt;Nix module&lt;/a&gt; if you can profit from this setup.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;&lt;a href=&quot;#summary&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔄 Automatic Rebase on Pull&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git config --global pull.rebase true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sets your global configuration to perform a rebase instead of a merge when pulling. This keeps your git history linear and avoids unnecessary merge commits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;🌱 Modern Default Branch&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git config --global init.defaultBranch main&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ensures every new local repository you initialize starts with &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; instead of &lt;code dir=&quot;auto&quot;&gt;master&lt;/code&gt;, aligning your local environment with GitHub’s defaults.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;👥 Simplified Co-Authoring&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git ucommit -m &quot;message&quot; -u &amp;#x3C;username&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Uses a custom bash script alongside &lt;code dir=&quot;auto&quot;&gt;gh&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;jq&lt;/code&gt; to automatically resolve GitHub usernames to the correct “Co-authored-by” trailers, saving you from manual email lookups.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;&lt;a href=&quot;#resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here are some helpful resources for optimizing your Git and GitHub workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cli.github.com/manual/&quot;&gt;GitHub CLI (gh) Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors&quot;&gt;Creating a commit with multiple authors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-interpret-trailers&quot;&gt;Git Interpret Trailers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it! With these tweaks, your local environment stays modern, your history stays clean, and giving credit to your collaborators becomes a breeze. Happy coding!&lt;/p&gt;</content:encoded><category>Education</category></item><item><title>Uncommon Git Commands</title><link>https://blog.trueberryless.org/blog/uncommon-git-commands/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/uncommon-git-commands/</guid><description>Are you using the git CLI? Do you also have these moments sometimes where you just can&apos;t remember the right command flag which achieves what you want to do and you are too lazy to search the man page for it? Or are you just looking for some funny little tips and tricks post? Don&apos;t worry, I got you covered!

</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I like to use the &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; CLI. I have tried UIs like GitKraken, Fork or GitHub Desktop. I don’t like them.&lt;/p&gt;
&lt;p&gt;The majority of commands can be remembered after a short amount of time because you use them daily. However, there are some commands you only need here and there, which makes them really difficult to memorize. Every time I need them, I haven’t used them for so long that I forget which option it was. Then I have to look them up again, feeling frustrated and uncool for not knowing Git by heart. It’s embarrassing.&lt;/p&gt;
&lt;p&gt;So I decided to write this little post, which doesn’t help memorizing them, but I’ll always know where I can look them up quickly 😅&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;checkout-a-remote-branch-on-fork&quot;&gt;Checkout a remote branch on fork&lt;/h2&gt;&lt;a href=&quot;#checkout-a-remote-branch-on-fork&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When contributing to open source, it is common that you want to checkout a branch of the upstream branch, that doesn’t exist in your remote fork yet. Neither does it exist in your local repository. Now when it comes to checking out a remote branch on a local repository, &lt;code dir=&quot;auto&quot;&gt;git switch&lt;/code&gt; is your friend. Just remember to fetch the upstream, so git knows the reference you want to track. However, what if the branch is not in &lt;em&gt;your&lt;/em&gt; remote repository - your fork.&lt;/p&gt;
&lt;p&gt;I usually have set up the original remote repository as the upstream repo locally, which can be done with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upstream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/&amp;#x3C;org&gt;/&amp;#x3C;repo&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With this information, git can then fetch the upstream:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upstream&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And now comes the magic: Create and checkout a branch, that until then only exists in the original remote repo with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;checkout&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;branch&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upstream/&amp;#x3C;branch&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;I know that it is pretty annoying that you have to specify the branch name two times, but in theory you could name the local branch differently.&lt;/p&gt;
&lt;p&gt;Also don’t forget that this branch does not yet exist in your remote fork, but you can push it easily with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;branch&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;rename-the-commit-message-of-an-older-commit&quot;&gt;Rename the commit message of an older commit&lt;/h2&gt;&lt;a href=&quot;#rename-the-commit-message-of-an-older-commit&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Renaming commits is not recommended when the commit is already pushed to the remote as you are changing the commit history for everyone.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;If you want to rename the last commit, just use:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--amend&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When you already have multiple local commits, you have to start an interactive rebase with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rebase&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HEAD~3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Here, 3 is the number of commits you want to adapt. If your commit is back 10 commits, you need to put a 10 there instead.&lt;/p&gt;
&lt;p&gt;Git will open your favourite editor with some text like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pick 64e085f Commit Message 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pick e5f607a Commit Message 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pick a9b0c1d Commit Message 3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can now edit this text like a normal file and replace all the &lt;code dir=&quot;auto&quot;&gt;pick&lt;/code&gt; keywords where you want to change the commit message with &lt;code dir=&quot;auto&quot;&gt;reword&lt;/code&gt;. After you save and close the file, git will repeatedly open text files with the old commit message, which you can freely edit to your likings. After you adapted everything you wanted and close the last file, the rebase is finished and you can check your corrections with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--oneline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Interactive rebasing is incredibly useful, as other options like &lt;code dir=&quot;auto&quot;&gt;squash&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;break&lt;/code&gt; or even &lt;code dir=&quot;auto&quot;&gt;exec&lt;/code&gt; are available. Just keep in mind that it makes more sense to do this on a branch where only you work to avoid team friction.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;clean-up-local-branches&quot;&gt;Clean up local branches&lt;/h2&gt;&lt;a href=&quot;#clean-up-local-branches&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When a PR is merged, the branch is usually deleted after it is safely merged into the default branch. But the branch still exists locally. If you want to delete all the local branches, which got deleted in your remote repository, you can run this command in most shells (use &lt;code dir=&quot;auto&quot;&gt;wsl&lt;/code&gt; on Windows):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-vv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;awk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/: gone] / {print $1}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;^\*$&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xargs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-I&lt;/span&gt;&lt;span&gt;{} git branch -d &quot;{}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;This is a destructive action. Therefore I included a safeguard by using the lowercase &lt;code dir=&quot;auto&quot;&gt;-d&lt;/code&gt; parameter. If your branches are not cleanly merged, git will not delete them. If you are sure you want to delete all those branches no matter what, use &lt;code dir=&quot;auto&quot;&gt;-D&lt;/code&gt; instead.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;remove-tracked-files-with-gitignore&quot;&gt;Remove tracked files with .gitignore&lt;/h2&gt;&lt;a href=&quot;#remove-tracked-files-with-gitignore&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We’ve all been there: you create a &lt;code dir=&quot;auto&quot;&gt;config.json&lt;/code&gt; or a &lt;code dir=&quot;auto&quot;&gt;.env&lt;/code&gt; file, write some code, and commit it. Later, you realize that file should definitely not be in the repository, so you add it to your &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The problem? Git is already tracking it. Adding a file to &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt; only stops Git from tracking &lt;em&gt;new&lt;/em&gt; files. To tell Git to “forget” a file it is already tracking without deleting it from your hard drive, you use the &lt;code dir=&quot;auto&quot;&gt;--cached&lt;/code&gt; flag:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cached&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;file_path&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you accidentally committed an entire directory (like &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;dist&lt;/code&gt;), you can do it recursively:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cached&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x3C;folder_name&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If your repository has become a bit of a mess and you want to “reset” the tracking for everything to strictly follow your current &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt; rules, run this sequence from the repository root:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cached&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Refactor: apply .gitignore to all tracked files&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This removes everything from the index and adds it all back. Because the files are now in your &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt;, Git will simply skip over them during the &lt;code dir=&quot;auto&quot;&gt;add&lt;/code&gt; step, effectively untracking them.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;If the file contained secrets, untracking it is not enough. The secret is still present in earlier commits and may already be on the remote, so rotate the secret and consider rewriting history as well.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;&lt;a href=&quot;#summary&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🛰️ Track Upstream Branch&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git fetch upstream &amp;#x26;&amp;#x26; git checkout -b &amp;#x3C;branch&gt; upstream/&amp;#x3C;branch&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Fetches the latest references from the original repository and creates a local branch that tracks the upstream version in one logical flow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔄 Rename Older Commits&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git rebase -i HEAD~n&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Use this to rewrite history. In the interactive editor, change &lt;code dir=&quot;auto&quot;&gt;pick&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;reword&lt;/code&gt; for any of the last &lt;code dir=&quot;auto&quot;&gt;n&lt;/code&gt; commits you want to modify.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧹 Prune Local Branches&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git fetch -p &amp;#x26;&amp;#x26; git branch -vv | awk &apos;/: gone] / {print $1}&apos; | grep -v &apos;^\*$&apos; | xargs -I{} git branch -d &quot;{}&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A pipeline that identifies local branches whose remote counterparts have been deleted (“gone”) and attempts to delete them safely.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧺 Untrack “Ignored” Files&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;git rm --cached &amp;#x3C;file&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Removes files from the Git index while keeping them physically on your disk. Essential for when you added a file to &lt;code dir=&quot;auto&quot;&gt;.gitignore&lt;/code&gt; after it was already committed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;&lt;a href=&quot;#resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here are some helpful resources for learning git and other situations you often find yourself in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learngitbranching.js.org/&quot;&gt;https://learngitbranching.js.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ohshitgit.com/&quot;&gt;https://ohshitgit.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it for now, more useful uncommon git commands might be added in the future!&lt;/p&gt;</content:encoded><category>Education</category></item><item><title>What open source really is about</title><link>https://blog.trueberryless.org/blog/what-os-is-about/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/what-os-is-about/</guid><description>You are pondering project after project on GitHub and just can&apos;t decide which ones you want to contribute to? If you find yourself thinking that way, read on to find out about the most appreciated way to contribute to OSS.

</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;tldr&quot;&gt;tl;dr&lt;/h2&gt;&lt;a href=&quot;#tldr&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Have fun.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;freedom&quot;&gt;Freedom&lt;/h2&gt;&lt;a href=&quot;#freedom&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You could stop reading right now. Contributing to open-source projects is not about creating a reputation. It doesn’t bring you any fame. You can’t force yourself to create, write or refactor code just for the sake of helping out. Although it might seem that many projects can only be sustainably maintained through more contributors, the additional effort for maintainers to review pull requests that got created due to the need for recognition actually slows down progress as those maintainers have to invest their time into analysing your code. And don’t even get me started with vibe-coded issues or code changes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;experience&quot;&gt;Experience&lt;/h2&gt;&lt;a href=&quot;#experience&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I am not claiming to understand open source and its contributions by any means. And I think everyone has their own opinion on that, which is totally fair because it differs depending on the communities and languages that exist. So in this post, I am gonna share my current personal opinion, which changes over time. It changes in every programmer’s lifetime with the experiences you make, socially and in terms of knowledge.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;community&quot;&gt;Community&lt;/h2&gt;&lt;a href=&quot;#community&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Contributions are not just coding. And open source is not just about contributions. You can give value by triaging and responding to issues, commenting on discussions, continuously improving workflows, updating dependencies, supporting others with the knowledge you have already learned, or really any non-code contribution as long as you interact with the people in a friendly way. Software is shaped by the people that build it. And you can help build this community around it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;&lt;a href=&quot;#motivation&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Programming in this sense is the challenge of self-discovery. You have to find what you love. You gotta do what interests you. Your motivation is the only substance that allows you to perform at your best. But you may not know what motivates you from the beginning. Sometimes discipline beats motivation. Some people discover their passion &lt;em&gt;through&lt;/em&gt; the discipline of showing up. Not everyone knows what they love from the start.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;journey&quot;&gt;Journey&lt;/h2&gt;&lt;a href=&quot;#journey&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Start simple. Notice a docs typo, share personal feedback in a discussion, report an issue you stumbled upon in your own projects or just get in touch with the people of the community to see if this is the place you would like to be. Nobody is perfect, and neither are most first contributions - even from people who later become maintainers. And you will get a warm welcome even if you make mistakes because that’s human. Just avoid over-relying on AI to do the work for you. Learning the codebase yourself is part of the journey. Not every PR will be accepted, and that’s okay. Sometimes the timing isn’t right, or the approach doesn’t fit the project’s vision.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;reciprocity&quot;&gt;Reciprocity&lt;/h2&gt;&lt;a href=&quot;#reciprocity&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If open-source software has helped you in your journey, contributing back helps sustain the ecosystem we all benefit from. When you are working at a company, it makes sense to suggest sponsoring the projects you depend on. Because if maintainers can focus full time on keeping the software up-to-date via financial support, they will not consider changing the FOSS license to a commercial one. If everyone thought this way, everyone would be better off.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;interest&quot;&gt;Interest&lt;/h2&gt;&lt;a href=&quot;#interest&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;One thing I noticed during my contributions is that maintainers generally appreciate contributions which actually affected &lt;em&gt;you&lt;/em&gt;. This might sound obvious for some of you, but it is a crucial detail my past self also forgot to care about. Fixing issues you didn’t encounter yourself can help you learn to recognize common design patterns. They are also useful if you want to get started with a project, on your way to finding your passion with discipline. However, by doing so you give yourself the huge disadvantage of not knowing the motivation behind it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;enjoyment&quot;&gt;Enjoyment&lt;/h2&gt;&lt;a href=&quot;#enjoyment&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;And I think that this detail sets apart “good” from “bad” developers. The former ones do not try to be the best, they just mostly do the stuff they enjoy. Open-source projects are created in people’s spare time for a reason. I couldn’t bear writing software in my free time which doesn’t affect me. But I somehow manage to sit down after a full work day, still having the strong will to submit yet another pull request to my favourite open-source project. Because I have fun doing so!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Feel free to share this post with the people you think could benefit from it.&lt;/p&gt;</content:encoded><category>Mindspace</category></item><item><title>Comparing minor features of Spotify and YouTube Music</title><link>https://blog.trueberryless.org/blog/spotify-vs-youtube-music-2025/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/spotify-vs-youtube-music-2025/</guid><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since Spotify recently updated their prices across all available premium plans, I decided to test out one competitive platform: YouTube Music from Google.&lt;/p&gt;
&lt;p&gt;While many reviews and comparisons focus on the major differences, like price, algorithms, music recommendations, playlist creations and other promoted features by those platforms (including garbage AI features), this post focuses on unnecessary comparisons between little things most people don’t care about.&lt;/p&gt;

&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;crossfade&quot;&gt;Crossfade&lt;/h2&gt;&lt;a href=&quot;#crossfade&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Spotify has made me love a simple but yet so powerful feature called “Crossfade”. It allows users to personalize how many seconds (0-12s) between the current and the following song should be overlapped to reduce “non-playing” time because many songs lower the volume in the end, so you don’t strictly benefit listening to the potential silence.&lt;/p&gt;
&lt;p&gt;YouTube Music doesn’t offer such functionalities and there are also many other features I wish to see in more streaming platforms that Spotify has built upon the years:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Listening to music together with Jams&lt;/li&gt;
&lt;li&gt;Generating new playlists from single tracks&lt;/li&gt;
&lt;li&gt;Add one song to multiple playlists at the same time&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;shuffle&quot;&gt;Shuffle&lt;/h2&gt;&lt;a href=&quot;#shuffle&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;While for hard-core reddit users and maybe even intermediate music enthusiasts it is probably common knowledge that the Spotify shuffle algorithm is completely broken and unfair towards lesser known artists, Spotify &lt;a href=&quot;https://newsroom.spotify.com/2025-11-13/shuffle-update-fewer-repeats/&quot;&gt;recently&lt;/a&gt; added a new “Fewer Repeats” shuffle mode, which ironically is enabled by default as if Spotify is admitting that its old algorithm is less recommendable. Whether the option between the new and the old, now so-called “Standard” shuffle adds more confusion or finally satisfies all users that have been begging for such a seemingly simple fix for multiple years by now, will yet have to be decided by each individual listener.&lt;/p&gt;
&lt;p&gt;While it might seem for most YouTube Music listeners that the shuffle algorithm of their streaming platform “just works”, in my opinion the UX is far from perfect. The option to shuffle a playlist or album with one click is nowhere near to be seen because you either need to always listen to the first song of your playlist before being able to activate shuffle or you need to fumble around to find the hidden menu item “Shuffle play” with winter gloves. Definitely more convenient in Spotify where shuffle stats are saved between plays, respecting your preference much better.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;volume&quot;&gt;Volume&lt;/h2&gt;&lt;a href=&quot;#volume&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This is clearly the only section where YouTube Music leads the way in my opinion, while sacrificing your hearing ability at the same time. Although Spotify allows to configure the maximum volume deeply nested in the settings somewhere (Settings → Playback → Volume Controls → Volume Level) with three different options: &lt;code dir=&quot;auto&quot;&gt;Quiet&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Normal&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Loud&lt;/code&gt;, I am really dissatisfied that &lt;code dir=&quot;auto&quot;&gt;Loud&lt;/code&gt; on 100% is equivalent to about 80% of the non-customizable YouTube Music volume. And while I get that too loud listening activities are just simply bad for your health - no debate about that -, we all know that everyone once was in their 20s where we don’t care about our hearing capabilities in later life.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;adding-songs-to-playlists&quot;&gt;Adding songs to playlists&lt;/h2&gt;&lt;a href=&quot;#adding-songs-to-playlists&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I know there are a lot of people out there that have never created their own playlist as streaming services already offer great managed playlists with your music style ready to be saved to your library. Nonetheless, I am this kind of guy who wants to believe that they have control over their own playlist and when I discover a new song, I want to add it to all of my playlists where this song fits into. Spotify made some huge but in my opinion very beneficial redesigns of exactly this process. Therefore, they now offer a great overview where you can ideally manage the songs in your playlists.&lt;/p&gt;
&lt;p&gt;In YouTube Music, songs have to added one-by-one to your playlists which is a tedious process if you have around 20 playlists that are based on moods and one song usually fits into multiple moods or lets say categories.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;mixes-and-smart-shuffle&quot;&gt;Mixes and Smart Shuffle&lt;/h2&gt;&lt;a href=&quot;#mixes-and-smart-shuffle&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Both music services offer quite good options for enhancing your static playlists with similar songs if you feel like discovering new songs that would fit besides known and loved ones. Spotify once again gives you much more options however, as there is the “Smart Shuffle” mode which temporarily adds those songs to your playlist until disabled. Moreover, they have the “Go to song radio”, which generates a whole playlist based on the song you currently vibe most to. This playlist can then optionally be saved to your library of course. On YouTube Music, the radio feature is called “Start mix” which just puts similar songs into the queue, not allowing you to save the awesome mix as a playlist.&lt;/p&gt;
&lt;p&gt;To confuse you even more, Spotify also offers a “Mix” feature on playlists that allows complete customization of the transition between songs with equalizers, fade-ins and -outs, bpm controll and some more features I do not understand as a casual listener. Although this might be very cool for transition lovers and DJs starters, I personally can not see any potential benefit for normal music lovers and would much more prefer to be able to loop over specific parts of songs instead, which would be super helpful if the hook of one song is extremly good, but you don’t like the boring rap part in between.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;track-sorting&quot;&gt;Track Sorting&lt;/h2&gt;&lt;a href=&quot;#track-sorting&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Yes, the order of my tracks in my playlists matter. Spotify and YouTube Music offer great ways to sort your playlist, with Spotify once again offering more flexibility by allowing sorting by title, artist, album and date added. YouTube Music really thinks that dates are everything I care about — well maybe I do.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;playlist-sorting&quot;&gt;Playlist Sorting&lt;/h2&gt;&lt;a href=&quot;#playlist-sorting&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Not so important for most people I would assume, but still relevant enough to be written about in this post of untalked features: Spotify once again allows to order your playlists, albums and artists in your library by recent listening activity, recent song additions, title and also creator. Plus they offer pins so you can always expect to hit your favourite playlist when you know the positioning by heart. This seems like a little advantage but trust me, the speed difference is incredible.&lt;/p&gt;
&lt;p&gt;Talking about speed, YouTube Music offers the “Speed dial” which are basically pins but on your Home tab (?) It takes some time to get used to, especially since other playlists are already listed on the home page &lt;em&gt;above&lt;/em&gt; your speed dial, which one could argue makes them more quickly accessible with your thumb. Nonetheless, sorting playlists in my library should be a must-feature. And sorry if I am just too stupid, but I still don’t understand what the difference between “Recent activity” and “Recently played” is supposed to be, especially when you consider the third option: “Recently saved”. YouTube Music should really think about their DAU (Dumbest Assumable User) or offer info boxes. Either way, removing one of those three options and adding alphabetical order would be my recommendation for improvements.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;library-filtering&quot;&gt;Library Filtering&lt;/h2&gt;&lt;a href=&quot;#library-filtering&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Not much to write, I really enjoy the UX and UI design of both YouTube Music and Spotify. Both offer wunderful tabs for playlists, artists, albums and more that each offer “sub-filtering” as I like to call it, e.g. “Subscriptions” or “By you”, “By Spotify” and “Downloaded”, respectively for YouTube Music and Spotify. As you can once again see, Spotify simply offers more and they feel smarter and also faster. Not sure why the YouTube Music tabs have a little .5s delay, but it ruins the flow of picking a little bit.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;lyrics&quot;&gt;Lyrics&lt;/h2&gt;&lt;a href=&quot;#lyrics&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In general, it feels like YouTube Music offers lyrics on more songs than Spotify, but I didn’t run any fancy benchmarks. Both services are largely accurate compared to what I believe is sung. Since I have been using Spotify for much longer now, I can only remember mismatches on the former platform. However, AFAIK lyrics are provided by Musixmatch and Spotify offers somewhat okay-ish ways to report wrong lyrics. Personally, I would love to be able to also suggest the correct lyrics when submitting feedback, as how should Musixmatch know which part of the lyrics are the reasons for my reporting action.&lt;/p&gt;
&lt;p&gt;YouTube Music probably has the advantage in this point since they use both Musixmatch and LyricFind and as I know Google probably some additional AI comparison to fill the gaps.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;discoverability&quot;&gt;Discoverability&lt;/h2&gt;&lt;a href=&quot;#discoverability&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;YouTube Music people mostly rave about the awesomeness of the YouTube algorithm and its understanding of your liking which leads to better discoverability of new songs. Admittedly, the algorithm of Google even after a short time of usage feels much more suited than what Spotify would have been able to learn from my habits for over three years now, which is incredible on the one hand but totally understanable and comprehensible on the other hand, given that Google almost exclusively makes billions of dollars every year thanks to nearly perfect advertisment match-making. What I try to say is: Google has the advantage because their business model relies on a secret, yet powerful algorithm, while Spotify’s primary selling point is simply Spotify. Correct me if I’m wrong in the comments, pls!&lt;/p&gt;
&lt;p&gt;As a result, YouTube Music has the better algorithm and understands very well what you want to listen to at any point in time. Their recommendations are delightful and therefore, the discoverability of new songs feels like sensory overload. Spotify’s recommendations are decent, once in a while I really listen to new songs that I actually enjoy and save into at least five playlists at once thanks to the overview feature.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;integrations-and-ecosystem&quot;&gt;Integrations and Ecosystem&lt;/h2&gt;&lt;a href=&quot;#integrations-and-ecosystem&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;And now the final argument, why - as you might have noticed - I prefer Spotify over YouTube Music: The fr*cking ecosystem of Spotify. While many talk about the obvious advantage of syncing what you currently play between all your devices and having (almost*) full control of what you play on another device, which is pretty cool, I am writing about the little benefits here: The Raycast Spotify integration makes controlling music while working on my MacBook extremely fun and enjoyable. stats.fm just produces awesome daily, weekly, monthly and overall stats about my listening activity on Spotify: I know exactly, how many times I have listened to each song and if I continue to list advantages of stats.fm the post would be twice as long. Nonetheless, I have to mention the weekly creation of amazing looking images with my top artists and songs of the week.&lt;/p&gt;
&lt;p&gt;*: The one thing I miss when controlling music from another device on Spotify is volume controll. When my headphones are connected to my phone and I work on my laptop, I want to be able to control the volume nonetheless. I understand that this is another topic when joining a jam, where only the host should be able to control the volume to avoid trolls, but within my own devices, this seems like a reasonable feature.&lt;/p&gt;
&lt;p&gt;YouTube Music doesn’t offer any cool stats, the Raycast integration needs the YouTube Music “app” (it’s a wrapper of the webpage) downloaded which doesn’t even work when using nix-darwin. Public API endpoints would really benefit YouTube Music to allow third-party apps to visualize your music habits.&lt;/p&gt;
&lt;p&gt;And even more important, the integrations that exists (obviously with YouTube itself) are terrible. Google doesn’t split my music and the videos I watch in any reasonable way. I mean: Why on earth would I want to see all my library playlists on my YouTube profile and have to scroll all the way down to finally be able to find the “Watch Later” video playlist ?!? If I wanna watch videos, I wanna go into the YouTube app and if I wanna listen to music, I wanna go into the YouTube Music app. It’s that simple. No need for some automatically generated YouTube Music playlist “Liked music”, which shows YouTube videos that are by pure coincidence also music videos at the same time. I understand that this separation is really hard, as the two platforms evolved as one and are now supposed to serve two different purposes. But Google charges the apps separately, so the should also provide this separation in the apps. This is the point where I think about adding a “Rage” tag to the post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To be fair:&lt;/strong&gt; YouTube Music offers a simple toggle under Settings → General → “Show your liked music from YouTube” which allows users to filter your “Liked music” playlist for only tracks you liked on YouTube Music. However, the other way around for whole playlists would also be very beneficial. I simply don’t want to see my music playlists on my YouTube profile, private or public, whatever.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;stats-for-nerds&quot;&gt;Stats for nerds&lt;/h2&gt;&lt;a href=&quot;#stats-for-nerds&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;My ratings (stars or whatever you want to imagine):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spotify: 9/10&lt;/li&gt;
&lt;li&gt;YouTube Music: 6.5/10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Distribution of points from this post (by heading):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spotify: 8/11 (Crossfade, Shuffle, Adding songs, Mixes, 2x Sorting, Filtering, Ecosystem)&lt;/li&gt;
&lt;li&gt;YouTube Music: 3/11 (Volume, Lyrics, Discoverability)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;a href=&quot;#conclusion&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Spotify offers way more customization, flexibility and settings.
YouTube Music just knows what you want to hear.&lt;/p&gt;
&lt;p&gt;All in all, I find it pretty sad that the music industry is so broken, where artists need 1000x more listeners to achieve the same profit compared to hard copies like they were available before I was born. And since the whole industry is basically controlled by the ‘Big Three’ - Universal Music Group (UMG), Sony Music Entertainment (SME), and Warner Music Group (WMG) - it is impossible for Spotify to be profitable in the long run, with competitions like YouTube Music which do not necessarily need to raise prices as the companies behind all other platforms have other apps that make enough money for compensation.&lt;/p&gt;
&lt;p&gt;To be honest, all this comparison and deep write is a waste of time, let’s just go back to gramophone records. Nonetheless, share your disagreements and maybe also your positive opinions in the comments below. Happy listening and lower the volume from time to time!&lt;/p&gt;</content:encoded><category>Review</category><category>Yappin&apos;</category></item><item><title>Add Additional Content to Starlight&apos;s Table of Contents</title><link>https://blog.trueberryless.org/blog/starlight-customize-toc-additional-content/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-customize-toc-additional-content/</guid><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This guide shows how you can append additional content like credits, ads or additional information below to list of headings in your right &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; sidebar.&lt;/p&gt;

&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;append-content&quot;&gt;Append content&lt;/h2&gt;&lt;a href=&quot;#append-content&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starlight’s table of contents can be modified by &lt;a href=&quot;https://starlight.astro.build/guides/overriding-components/&quot;&gt;overriding&lt;/a&gt; the &lt;a href=&quot;https://starlight.astro.build/reference/overrides/#tableofcontents&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;TableOfContents.astro&lt;/code&gt; component&lt;/a&gt;. Follow these steps to append a small Astro component after the existing table of contents:&lt;/p&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;
&lt;p&gt;Create a small &lt;code dir=&quot;auto&quot;&gt;Card.astro&lt;/code&gt; component that will be displayed after the table of contents. If you want to follow common conventions, it is recommended to create a new &lt;code dir=&quot;auto&quot;&gt;src/components/&lt;/code&gt; folder where you can place all your components:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Card.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;aside&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;mark&gt;&lt;span&gt;not-content&lt;/span&gt;&lt;/mark&gt;&lt;span&gt; starlight-table-of-contents-aside&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;Some card!&lt;/span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;With some text 🙌&lt;/span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;aside&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;26 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-aside&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;relative&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;background-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-gray-6&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;border-radius&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;border&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-text-accent&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;box-shadow&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-shadow-md&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;overflow-y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hidden&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-aside&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-white&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-text-h5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;text-decoration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-line-height-headings&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;margin-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-aside&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-text-xs&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;normal&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;text-decoration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!important&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-gray-3&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;overflow-wrap&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; anywhere&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note the usage of the &lt;code dir=&quot;auto&quot;&gt;&quot;not-content&quot;&lt;/code&gt; class feature &lt;a href=&quot;https://starlight.astro.build/components/using-components/#compatibility-with-starlights-styles&quot;&gt;provided by Starlight&lt;/a&gt; to make sure that Starlight’s styles for elements do not apply here as it is a custom component.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span id=&quot;step-2&quot;&gt;&lt;/span&gt;
&lt;p&gt;Create the &lt;code dir=&quot;auto&quot;&gt;TableOfContents.astro&lt;/code&gt; component, which will be used as the replacement of Starlight’s default table of contents component:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/TableOfContents.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/TableOfContents.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./Card.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;mark&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/mark&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;mark&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/mark&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;As you can see, the default table of contents are displayed by importing the component from Starlight and using it &lt;em&gt;before&lt;/em&gt; our card. See the &lt;a href=&quot;#prepend-content&quot;&gt;“Prepend content” section&lt;/a&gt; to display the card above the table of contents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last but not least, do not forget to set the component override in your Astro config:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;details&gt;&lt;summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;3 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// @ts-check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// https://astro.build/config&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;My Docs&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;14 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;social&lt;/span&gt;&lt;span&gt;: [{ &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://github.com/withastro/starlight&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; }],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;sidebar&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Guides&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// Each item here is one entry in the navigation menu.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Example Guide&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;guides/example&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Reference&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;autogenerate&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;components&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;TableOfContents&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./src/components/TableOfContents.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;prepend-content&quot;&gt;Prepend content&lt;/h2&gt;&lt;a href=&quot;#prepend-content&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you would prefer the table of contents &lt;em&gt;after&lt;/em&gt; your component, you need to swap the order of the elements from &lt;a href=&quot;#step-2&quot;&gt;Step 2 above&lt;/a&gt; and assign &lt;code dir=&quot;auto&quot;&gt;margin-bottom&lt;/code&gt; instead:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/TableOfContents.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/TableOfContents.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./Card.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;ins&gt;&lt;span&gt;margin-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The rest of the 3 steps are the same, so do not forget to complete them all!&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;place-content-at-bottom&quot;&gt;Place content at bottom&lt;/h2&gt;&lt;a href=&quot;#place-content-at-bottom&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you want to have more spacing between your new shiny content and the table of contents, you can use some CSS tricks to achieve this. Add these global styles to the bottom of your &lt;code dir=&quot;auto&quot;&gt;TableOfContents.astro&lt;/code&gt; component to introduce two new flexboxes which will transform your card to the bottom:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/TableOfContents.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;details&gt;&lt;summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;16 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/TableOfContents.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./Card.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-table-of-contents-wrapper-container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is:global&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;min-width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;72&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;right-sidebar-panel&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;min-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;flex-direction&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;right-sidebar-panel&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sl-container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;flex-direction&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;justify-content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;space-between&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;flex&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;mobile-support&quot;&gt;Mobile support&lt;/h2&gt;&lt;a href=&quot;#mobile-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;TableOfContents.astro&lt;/code&gt; is only rendered when the right sidebar is visible. This is not the case on mobile devices, where the &lt;a href=&quot;https://starlight.astro.build/reference/overrides/#mobiletableofcontents&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;MobileTableOfContents.astro&lt;/code&gt; component&lt;/a&gt; will be rendered.&lt;/p&gt;
&lt;p&gt;However, if you want to show your additional content on mobile devices, it is recommended to override the &lt;a href=&quot;https://starlight.astro.build/reference/overrides/#pagination&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Pagination.astro&lt;/code&gt; component&lt;/a&gt; as adding content to the mobile view of the right sidebar would look out of place.&lt;/p&gt;
&lt;p&gt;Here is a quick demonstration of how your custom &lt;code dir=&quot;auto&quot;&gt;Pagination.astro&lt;/code&gt; override could look like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Pagination.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/Pagination.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./Card.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;starlight-pagination-mobile-content&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-pagination-mobile-content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;min-width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;72&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlight-pagination-mobile-content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that the card will have much more width when displayed under the pagination than in the table of contents. So make sure to use responsive design inside your additional content.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;source-code&quot;&gt;Source code&lt;/h2&gt;&lt;a href=&quot;#source-code&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can also find the complete source code for all three variants on &lt;a href=&quot;https://github.com/trueberryless/starlight-customize-toc-additional-content&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9919?v=4&quot; alt=&quot;GitHub&quot;&gt;GitHub&lt;/a&gt; or open the project directly in &lt;a href=&quot;https://stackblitz.com/github/trueberryless/starlight-customize-toc-additional-content&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/28635252?v=4&quot; alt=&quot;icon&quot;&gt;StackBlitz&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Starlight</category><category>Education</category></item><item><title>Customize the &quot;Overview&quot; title of your Starlight Table of Contents</title><link>https://blog.trueberryless.org/blog/starlight-customize-toc-overview-title/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-customize-toc-overview-title/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This guide shows how you can customize the first heading in the right sidebar (table of contents) of every &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; page globally and individually.&lt;/p&gt;

&lt;p&gt;Each Starlight page contains a table of contents on the right side (except if &lt;a href=&quot;https://starlight.astro.build/reference/frontmatter/#tableofcontents&quot;&gt;disabled&lt;/a&gt;). To be able to link to the top of the page, the first entry of this sidebar has the title “Overview” (as you can also see on this page’s sidebar), which can be customized &lt;a href=&quot;#global-definition&quot;&gt;globally&lt;/a&gt; and even on a &lt;a href=&quot;#frontmatter-override&quot;&gt;per-page basis&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;global-definition&quot;&gt;Global definition&lt;/h2&gt;&lt;a href=&quot;#global-definition&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you want to set the title of the first table of contents entry once for all pages, you can follow these steps to achieve this for monolingual and multilingual sites:&lt;/p&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;
&lt;p&gt;Create &lt;a href=&quot;https://starlight.astro.build/guides/route-data/#how-to-customize-route-data&quot;&gt;route middleware&lt;/a&gt; to customize the data shown by Starlight.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use this example code to configure the “Overview” title:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/routeData.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/route-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Back to top&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If your site is &lt;a href=&quot;https://starlight.astro.build/guides/i18n/&quot;&gt;multilingual&lt;/a&gt;, you can also assign different titles depending on the locale:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/routeData.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/route-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;virtual:starlight/user-config&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;defaultLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;defaultLocale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt; ??&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;defaultLocale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;translations&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Record&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&gt; =&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Back to top&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;de&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Zurück nach oben&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;ins&gt;&lt;span&gt;translations&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; ?? &lt;/span&gt;&lt;span&gt;defaultLang&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;frontmatter-override&quot;&gt;Frontmatter override&lt;/h2&gt;&lt;a href=&quot;#frontmatter-override&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In order to set the first table of contents heading to something different on individual pages, follow the steps below:&lt;/p&gt;
&lt;ol role=&quot;list&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://starlight.astro.build/reference/frontmatter/#customize-frontmatter-schema&quot;&gt;Extend your frontmatter schema&lt;/a&gt; in &lt;code dir=&quot;auto&quot;&gt;src/content.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/content.config.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineCollection&lt;/span&gt;&lt;ins&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;/ins&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docsLoader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/loaders&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docsSchema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/schema&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;collections&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;defineCollection&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;docsLoader&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;docsSchema&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;extend&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;overviewTitle&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;optional&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This allows you to use the &lt;code dir=&quot;auto&quot;&gt;overviewTitle&lt;/code&gt; in your middleware like that:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/routeData.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/route-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;const &lt;/span&gt;&lt;span&gt;individualOverviewTitle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;overviewTitle&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;ins&gt;&lt;span&gt;individualOverviewTitle&lt;/span&gt;&lt;/ins&gt;&lt;span&gt; ?? &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Back to top&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For the sake of completeness, here is a multilingual middleware that supports overriding on individual pages:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/routeData.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/route-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;virtual:starlight/user-config&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;defaultLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;defaultLocale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt; ??&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;starlightConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;defaultLocale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;translations&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Record&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&gt; =&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Back to top&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;de&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Zurück nach oben&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;individualOverviewTitle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;overviewTitle&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;overviewItem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;individualOverviewTitle&lt;/span&gt;&lt;span&gt; ?? &lt;/span&gt;&lt;span&gt;translations&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt; ?? &lt;/span&gt;&lt;span&gt;defaultLang&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;source-code&quot;&gt;Source code&lt;/h2&gt;&lt;a href=&quot;#source-code&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can also find the complete source code for all four variants on &lt;a href=&quot;https://github.com/trueberryless/starlight-customize-toc-overview-title&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9919?v=4&quot; alt=&quot;GitHub&quot;&gt;GitHub&lt;/a&gt; or open the project directly in &lt;a href=&quot;https://stackblitz.com/github/trueberryless/starlight-customize-toc-overview-title&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/28635252?v=4&quot; alt=&quot;icon&quot;&gt;StackBlitz&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Starlight</category><category>Education</category></item><item><title>How VS Code Snippets can improve your workflow when working with Astro</title><link>https://blog.trueberryless.org/blog/vscode-snippets/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/vscode-snippets/</guid><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article demonstrates how code snippets can be created in Visual Studio Code that can significantly boost your productivity when regularly working with &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections&quot;&gt;Astro’s content collections&lt;/a&gt;.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;This article arose from a suggestion by &lt;a href=&quot;https://github.com/sarah11918&quot;&gt;&lt;img src=&quot;https://github.com/sarah11918.png&quot; alt=&quot;sarah11918&quot;&gt;Sarah Rainsberger&lt;/a&gt; and highlights a feature contributed by &lt;a href=&quot;https://github.com/HiDeoo&quot;&gt;&lt;img src=&quot;https://github.com/HiDeoo.png&quot; alt=&quot;HiDeoo&quot;&gt;HiDeoo&lt;/a&gt; - all code examples are also by HiDeoo.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;

&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-need-for-snippets&quot;&gt;The need for snippets&lt;/h2&gt;&lt;a href=&quot;#the-need-for-snippets&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Astro supports &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/#defining-the-collection-schema&quot;&gt;schema validation&lt;/a&gt; for your frontmatter fields in Markdown and MDX files. Therefore, many content files of your collections will have the same structure between the code fences (&lt;code dir=&quot;auto&quot;&gt;---&lt;/code&gt;). If you are tired of typing the same frontmatter fields over and over again, you can create a code snippet that will automatically generate the basic structure of the desired frontmatter while letting you conveniently edit the fields with &lt;code dir=&quot;auto&quot;&gt;TAB ⇥&lt;/code&gt; inputs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;creating-a-snippet&quot;&gt;Creating a snippet&lt;/h2&gt;&lt;a href=&quot;#creating-a-snippet&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can create global snippets which can be scoped to multiple languages or language-specific snippets. Since we want the frontmatter snippet in Markdown &lt;em&gt;and&lt;/em&gt; MDX files, we will create a global snippet under &lt;code dir=&quot;auto&quot;&gt;Code/User/snippets/markdown.code-snippets&lt;/code&gt; with the scope &lt;code dir=&quot;auto&quot;&gt;markdown,mdx&lt;/code&gt;. Follow the instructions in the &lt;a href=&quot;https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets&quot;&gt;official documentation&lt;/a&gt; for the correct steps for your Operating System.&lt;/p&gt;
&lt;p&gt;Here is an example of how your snippet could look like. You can freely adjust the &lt;code dir=&quot;auto&quot;&gt;body&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;prefix&lt;/code&gt; as you see fit:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;Code/User/snippets/markdown.code-snippets&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Add Markdown frontmatter&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scope&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;markdown,mdx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ffmt&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;---&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title: $TM_FILENAME_BASE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description: The description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;---&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;## ${1:Heading}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The flexibility of snippets allows you to create powerful and bespoke productivity boosters. You can enhance the basic configuration from above with the specific frontmatter fields you need, change how the title gets generated, and more.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;using-the-snippet&quot;&gt;Using the snippet&lt;/h2&gt;&lt;a href=&quot;#using-the-snippet&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Create an empty Markdown (&lt;code dir=&quot;auto&quot;&gt;.md&lt;/code&gt;) or &lt;code dir=&quot;auto&quot;&gt;.mdx&lt;/code&gt; file. Start typing &lt;code dir=&quot;auto&quot;&gt;ffmt&lt;/code&gt; and press &lt;code dir=&quot;auto&quot;&gt;TAB ⇥&lt;/code&gt; to trigger the snippet. If you do not see any suggestions, you can manually trigger them with &lt;code dir=&quot;auto&quot;&gt;Ctrl + Space&lt;/code&gt; and select the &lt;code dir=&quot;auto&quot;&gt;&quot;Add Markdown frontmatter&quot;&lt;/code&gt; snippet. Depending on your exact configuration, you can now tab through the fields to edit them to your current use case. For example the snippet from above allows you to directly edit the heading and then jumps to the content. The title field of the frontmatter will be set to the file name without its extension.&lt;/p&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/screenshot-triggering-ffmt-snippet.nCLSUPdm_1R4htC.webp&quot; alt=&quot;Screenshot of the Visual Studio Code editor, displaying generated content from a code snippet.  &quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;954&quot; height=&quot;444&quot;&gt;&lt;button aria-label=&quot;Zoom image: Screenshot of the Visual Studio Code editor, displaying generated content from a code snippet.&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;further-resources&quot;&gt;Further resources&lt;/h2&gt;&lt;a href=&quot;#further-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you find snippets useful and want to explore a VS Code extension which includes a decent set of preconfigured snippets, check out &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SheltonLouis.astro-snippets&quot;&gt;Astro Snippets by Shelton Louis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read more tips and tricks for working with Astro and Starlight on &lt;a href=&quot;https://hideoo.dev/notes&quot;&gt;HiDeoo’s blog&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Automation</category><category>Education</category></item><item><title>Star Days ★</title><link>https://blog.trueberryless.org/blog/featuring/star-days/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/featuring/star-days/</guid><description>A star day is a day declared one day in advance to only one cause. In a star day, everything besides daily habits, self care, and the most urgent of matters becomes noise. There only exists the topic of the day to engage with, or silence!

</description><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Featuring &lt;a href=&quot;https://github.com/LanHikari22&quot;&gt;&lt;img src=&quot;https://github.com/LanHikari22.png&quot; alt=&quot;LanHikari22&quot;&gt;@Lan&lt;/a&gt; - check out more of his work &lt;a href=&quot;https://github.com/deltatraced/delta-trace/tree/webview/lan/posts/2025&quot;&gt;on GitHub&lt;/a&gt;!&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;1-quick-description&quot;&gt;1 Quick Description&lt;/h2&gt;&lt;a href=&quot;#1-quick-description&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A star day is a day declared one day in advance to only one cause. In a star day, everything besides daily habits, self care, and the most urgent of matters becomes noise. There only exists the topic of the day to engage with, or silence!&lt;/p&gt;
&lt;p&gt;Unrelated thoughts as well as actions become noise unless they serve the mission.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;2-purpose&quot;&gt;2 Purpose&lt;/h2&gt;&lt;a href=&quot;#2-purpose&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This is an attention-management strategy and not a task or time management strategy.&lt;/p&gt;
&lt;p&gt;It is set a day in advance, where we agree on the singular attention of the day to come so that we can prepare mentally for it.&lt;/p&gt;
&lt;p&gt;Rather than fighting to stay focused in a world of distractions, or negotiating with ourselves over what counts as a productive activity during the day. This sets the terms before the day starts. And when the day starts, we keep our head empty, and we stay mindful that all that we do and think about serves the cause agreed on beforehand.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;3-on-anti-productivity&quot;&gt;3 On anti-productivity&lt;/h2&gt;&lt;a href=&quot;#3-on-anti-productivity&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Productivity is concerned with external measures of performance and delivery. Many tools focus on optimizing productivity metrics, meeting deadlines, etc.&lt;/p&gt;
&lt;p&gt;This tool takes a different approach. It relies on internal pressure instead. Its only measure of success is singular attention. So long as you maintain full presence, you can use the best tools at your disposal. There is nothing else to it.&lt;/p&gt;
&lt;p&gt;The section is called “anti-productivity” to signify that what truly matters is full presence with the star subject alone. Ideas on improving execution efficiency are noise in this period. It also highlights that commitment is set on a different axis from performance, and so deserves a category apart from productivity.&lt;/p&gt;
&lt;p&gt;Productivity concerns can be reviewed later, or they can be made the star topic of the day for deliberate planning!&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;4-motivation&quot;&gt;4 Motivation&lt;/h2&gt;&lt;a href=&quot;#4-motivation&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;External productivity tools often fix symptoms rather than causes. If one is not careful, they can be used to make unfocused days bearable rather than promote deep work and flow states. They can introduce planning overhead and fixation on details that may not make a big impact in the long term such as precise placement of scheduled events, or counts of to-dos done. They risk being a source of guilt to their users by putting them in a perpetual catching-up state with seemingly endless work.&lt;/p&gt;
&lt;p&gt;But why maximize the number of to-do items completed a day, dream of an ideal of an empty to-do list, or perfectly execute a weekly schedule? What is the goal for this?&lt;/p&gt;
&lt;p&gt;One goal is to work at our best and be fulfilled, and to be able focus on the specifics of our work and not any unnecessary scaffolding around it.&lt;/p&gt;
&lt;p&gt;The problem begins internally, before any productivity tool is put in place. The bottleneck to flow is often in how we pay attention to the daily objects of experience and how we negotiate commitments with ourselves and others.&lt;/p&gt;
&lt;p&gt;With low attention, the cost of multitasking and distractions becomes too high that no productivity tool can recover it. With low commitment, we may stray from our objectives, only do the easy parts, or cut corners. Star days begin from this earlier stage of experience, focusing on attention and commitment as foundations.&lt;/p&gt;
&lt;p&gt;One cannot be behind in a star day, because all they need is full presence with the mission.&lt;/p&gt;
&lt;p&gt;Another motivation is that by declaring an entire day for one cause, we have more incentive to put in all the effort necessary and face hardships that require high mental preparation and perseverance. This is harder to do when you’re trying to squeeze them into a 2 hour slot window. This also allows momentum to build quicker since we can absorb the problem domain more deeply than if we had no clear purpose for day.&lt;/p&gt;
&lt;p&gt;The star topic doesn’t have to be work-related only. It could be for a hobby you’ve always wanted to start, or social activities with friends!&lt;/p&gt;</content:encoded><category>Mindspace</category><category>Collaboration</category></item><item><title>How to fully autogenerate Starlight sidebars (without losing control)</title><link>https://blog.trueberryless.org/blog/starlight-autogenerate-whole-sidebar/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-autogenerate-whole-sidebar/</guid><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever wanted to simplify sidebar generation in your &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; project? Have you tried autogenerating the entire sidebar only to find it doesn’t let you customise the structure to your needs?&lt;/p&gt;
&lt;p&gt;This post demonstrates two Starlight features that make fully autogenerated sidebars flexible and reduce maintenance.&lt;/p&gt;

&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;use-case&quot;&gt;Use case&lt;/h2&gt;&lt;a href=&quot;#use-case&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In medium to large Starlight projects, the problem arises that the manual creation and maintenance of the &lt;a href=&quot;https://starlight.astro.build/reference/configuration/#sidebar&quot;&gt;Starlight sidebar configuration&lt;/a&gt; is a tedious and time-consuming task.&lt;/p&gt;
&lt;p&gt;In the past, Starlight didn’t provide the right primitives for this, and the recommended approach was to move the autogeneration of the sidebar configuration one level deeper - so that only folders without nested subfolders were autogenerated. However, with the introduction of &lt;a href=&quot;https://starlight.astro.build/guides/route-data/&quot;&gt;Route Data&lt;/a&gt; and the more recent &lt;a href=&quot;https://starlight.astro.build/reference/configuration/#generateid&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;generateId()&lt;/code&gt; hook of &lt;code dir=&quot;auto&quot;&gt;docsLoader&lt;/code&gt;&lt;/a&gt;, these scenarios can now be solved much more easily and efficiently.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;solving-the-ordering-issue&quot;&gt;Solving the ordering issue&lt;/h2&gt;&lt;a href=&quot;#solving-the-ordering-issue&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A common problem always was: “How can I customise the order of sidebar folders if I autogenerate the sidebar?” Old issues like &lt;a href=&quot;https://github.com/withastro/starlight/issues/1223&quot;&gt;#1223&lt;/a&gt; suggest a solution inspired by &lt;a href=&quot;https://content.nuxt.com&quot;&gt;Nuxt Content&lt;/a&gt; where each segment of the whole route can be &lt;a href=&quot;https://v2.content.nuxt.com/usage/content-directory#ordering&quot;&gt;prefixed with numbers + dots&lt;/a&gt; to determine numeric ordering on a file-based level. An example for such a project could look like this:&lt;/p&gt;
&lt;starlight-file-tree data-pagefind-ignore=&quot;true&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;src/content/docs/nested-folder
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;1.frameworks
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M16.660 1.240L17.940 0.360L17.940 12.760L22.700 12.760Q19.060 16.480 11.820 23.760L11.820 23.760L1.300 12.880L5.700 12.880L5.700 0.240L6.180 0.600Q8.380 2.120 9.500 2.840L9.500 2.840Q11.500 4.120 11.920 4.120Q12.340 4.120 13.860 3.120L13.860 3.120Q14.780 2.560 16.660 1.240L16.660 1.240Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;1.vue.md&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M16.660 1.240L17.940 0.360L17.940 12.760L22.700 12.760Q19.060 16.480 11.820 23.760L11.820 23.760L1.300 12.880L5.700 12.880L5.700 0.240L6.180 0.600Q8.380 2.120 9.500 2.840L9.500 2.840Q11.500 4.120 11.920 4.120Q12.340 4.120 13.860 3.120L13.860 3.120Q14.780 2.560 16.660 1.240L16.660 1.240Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;2.nuxt.md&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;2.examples
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M16.660 1.240L17.940 0.360L17.940 12.760L22.700 12.760Q19.060 16.480 11.820 23.760L11.820 23.760L1.300 12.880L5.700 12.880L5.700 0.240L6.180 0.600Q8.380 2.120 9.500 2.840L9.500 2.840Q11.500 4.120 11.920 4.120Q12.340 4.120 13.860 3.120L13.860 3.120Q14.780 2.560 16.660 1.240L16.660 1.240Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;1.vercel.md&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M16.660 1.240L17.940 0.360L17.940 12.760L22.700 12.760Q19.060 16.480 11.820 23.760L11.820 23.760L1.300 12.880L5.700 12.880L5.700 0.240L6.180 0.600Q8.380 2.120 9.500 2.840L9.500 2.840Q11.500 4.120 11.920 4.120Q12.340 4.120 13.860 3.120L13.860 3.120Q14.780 2.560 16.660 1.240L16.660 1.240Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;2.netlify.md&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/starlight-file-tree&gt;
&lt;p&gt;If you want to use this approach in Starlight, it doesn’t work out-of-the-box, but with a simple setup you can make it work.&lt;/p&gt;
&lt;p&gt;Starlight &lt;a href=&quot;https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.35.0&quot;&gt;0.35.0&lt;/a&gt; introduced a callback function which you can pass to &lt;code dir=&quot;auto&quot;&gt;docsLoader()&lt;/code&gt; that can manipulate the id (URL) of the generated page. By splitting the entry by &lt;code dir=&quot;auto&quot;&gt;&quot;/&quot;&lt;/code&gt; and removing any number + dot on the segment level, you have the same functionality now in Starlight:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/content.config.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineCollection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docsLoader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/loaders&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docsSchema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/schema&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;leadingNumberAndDotRegEx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;\d&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;\.&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;fileExtensionRegEx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;\.&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;md&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;mdx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;collections&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;docs&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;defineCollection&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;docsLoader&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Remove file extension and&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// leading numbers + dot from each segment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;generateId&lt;/span&gt;&lt;span&gt;: ({ &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt; }) =&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fileExtensionRegEx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;segment&lt;/span&gt;&lt;span&gt;) =&gt; &lt;/span&gt;&lt;span&gt;segment&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;leadingNumberAndDotRegEx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;docsSchema&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The URL to access the pages now changes e.g., from &lt;code dir=&quot;auto&quot;&gt;/nested-folder/1.frameworks/1.vue&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;/nested-folder/frameworks/vue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, the folder names in the sidebar still include the &lt;code dir=&quot;auto&quot;&gt;1.&lt;/code&gt; prefixes. So let’s solve the sidebar manipulation as well:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;solving-the-sidebar-folder-naming-issue&quot;&gt;Solving the sidebar folder naming issue&lt;/h2&gt;&lt;a href=&quot;#solving-the-sidebar-folder-naming-issue&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starlight &lt;a href=&quot;https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.32.0&quot;&gt;0.32.0&lt;/a&gt; introduced &lt;a href=&quot;https://starlight.astro.build/guides/route-data/&quot;&gt;Route Data&lt;/a&gt;, which we can now utilize to manipulate folder names in the sidebar to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;remove any leading number + dot from the folder name and&lt;/li&gt;
&lt;li&gt;apply “Title Case” so they don’t look completely lowercase&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/routeData.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/route-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;leadingNumberAndDotRegEx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;\d&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;\.&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;wordSplitterRegEx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;\w\S&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toTitleCase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;wordSplitterRegEx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;word&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;word&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;charAt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;toUpperCase&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;word&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;toLowerCase&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cleanGroupLabels&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;entries&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;[])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt; of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entries&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Remove leading number + dot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;let &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;leadingNumberAndDotRegEx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Convert to Title Case&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toTitleCase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Recurse into children&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;cleanGroupLabels&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;entries&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const &lt;/span&gt;&lt;span&gt;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineRouteMiddleware&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sidebar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;starlightRoute&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;cleanGroupLabels&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sidebar&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Internationalisation (i18n)&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Internationalisation (i18n)&lt;/p&gt;&lt;div&gt;&lt;p&gt;Note that &lt;a href=&quot;https://starlight.astro.build/guides/sidebar/#internationalization&quot;&gt;internationalisation (i18n) of folder names&lt;/a&gt; is a missing feature with such a setup as there is currently nowhere to define translations of folder names, they just get converted into title case. Implementing logic to dynamically load translations could involve reading the &lt;a href=&quot;https://starlight.astro.build/reference/route-data/#locale&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;locale&lt;/code&gt; field from the route data&lt;/a&gt; and define translations in &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; files. Otherwise, &lt;a href=&quot;#using-hideoos-plugin&quot;&gt;use HiDeoo’s plugin&lt;/a&gt;, which &lt;a href=&quot;https://starlight-auto-sidebar.netlify.app/guides/i18n/&quot;&gt;supports i18n&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Don’t forget to add the &lt;code dir=&quot;auto&quot;&gt;routeData.ts&lt;/code&gt; file to your &lt;code dir=&quot;auto&quot;&gt;astro.config.mjs&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Autogenerate whole sidebar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;social&lt;/span&gt;&lt;span&gt;: [{ &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://github.com/withastro/starlight&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;sidebar&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Root Folder&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;autogenerate&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nested-folder&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;routeMiddleware&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./src/routeData.ts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Of course you can adjust the code to your needs (e.g., remove the “Title Case” transformation because your file names are already written correctly).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;using-hideoos-plugin&quot;&gt;Using HiDeoo’s plugin&lt;/h2&gt;&lt;a href=&quot;#using-hideoos-plugin&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you want to autogenerate your whole sidebar and still have the flexibility to customise everything you want, &lt;a href=&quot;https://github.com/HiDeoo&quot;&gt;&lt;img src=&quot;https://github.com/HiDeoo.png&quot; alt=&quot;HiDeoo&quot;&gt;HiDeoo&lt;/a&gt; also made a dedicated plugin for such use cases: &lt;a href=&quot;https://starlight-auto-sidebar.netlify.app&quot;&gt;Starlight Auto Sidebar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Especially those two features got mentioned in this article:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controlling the &lt;a href=&quot;https://starlight-auto-sidebar.netlify.app/metadata/#order&quot;&gt;order&lt;/a&gt; of individual directories&lt;/li&gt;
&lt;li&gt;Adapting the &lt;a href=&quot;https://starlight-auto-sidebar.netlify.app/metadata/#label&quot;&gt;displayed label&lt;/a&gt; of individual folders&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, if you want to automate the whole generation without having to specify labels and orders manually for each directory, coding the solution yourself (with some guidelines in this blog) is the preferred and recommended solution.&lt;/p&gt;
&lt;p&gt;If you want to check out the code presented in this blog, feel free to visit the &lt;a href=&quot;https://stackblitz.com/github/trueberryless/starlight-autogenerate-whole-sidebar?file=src%2Fcontent.config.ts&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/28635252?v=4&quot; alt=&quot;icon&quot;&gt;StackBlitz&lt;/a&gt; or the source code in the &lt;a href=&quot;https://github.com/trueberryless/starlight-autogenerate-whole-sidebar&quot;&gt;&lt;img src=&quot;https://github.com/trueberryless.png&quot; alt=&quot;trueberryless&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Education</category><category>Starlight</category></item><item><title>Stop Outsourcing Your Soul to AI</title><link>https://blog.trueberryless.org/blog/cognitive-erosion/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/cognitive-erosion/</guid><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It has been more than two and a half years since the release of ChatGPT. The 30&lt;sup&gt;th&lt;/sup&gt; November, 2022 marked the beginning of a new era. The start of AI. Nowadays, many professions and people in private lives, especially in the information technology sector, use it on a daily basis. And we do not even know where we are on the Gartner hype cycle or if AI will improve following Kurzweil’s “Law of Accelerating Returns”.&lt;/p&gt;
&lt;p&gt;The trend is still rising, but at the same time I have noticed a slight but steady degradation of knowledge on a human basis because people delegate more and more creative work to AI. As a result, I have decided to write a little blog post, where I can share my thoughts, trying to discourage the overuse of Artificial Intelligence which would ruin our cognitive capabilities. And although I know that very little people read this, it does not stop me from trying. Otherwise, I might have missed my opportunity in helping humanities future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This whole blog post is created from my observations of developments of social changes with special focus on ways of using Artificial Intelligence with my interpretation and is therefore very opinionated. I have not looked at any studies that would support or oppose my opinion.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;how-people-tend-to-use-ai&quot;&gt;How people tend to use AI&lt;/h2&gt;&lt;a href=&quot;#how-people-tend-to-use-ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;AI is awesome. I do not want to question this statement. It helped and still helps me improve my workflow, gathering new knowledge, diving into new waters and exploring new technologies. For people who are not interested in how AI works, such intelligent tools seem like magic. As a result, I like to see their eyes sparkle and their mouths left open when I explain to them that everything AI is based on is probability. What word is most likely to be the next one based on properties and emotions in a highly dimensional virtual space. &lt;a href=&quot;https://www.youtube.com/watch?v=LPZh9BOjkQs&quot;&gt;But that is another topic.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What I would like to focus on is how people have come to use AI, especially over the past months - if not years. Since our brains are lazy by default, we tend to outsource more work to AI the less focused we are on a specific task. In other words, if you do not put most of your commitment into your current project, you are likely on the verge of just prompting an AI with it. Another potential reason for offshoring work to the AI world is ignorance of the underlying technologies, which makes it difficult for you to come up with your own solutions.&lt;/p&gt;
&lt;p&gt;I am by no means a scientist, but I think that watching AI doing your work - because due to your incompetence the outcome you produce is not aligning with your vision - gives you so much dopamine that your brain wants to do it more often. Moreover, the human being as a social figure always aims to be connected to somebody and engaging with AI satisfies those needs. This behaviour is typical for our brains and also happens when watching social media or consuming explicit content. It is deeply marked in our cerebral cortex and the whole gaming industry and entertainment sectors use it recklessly to optimise for money.&lt;/p&gt;
&lt;p&gt;I noticed this trend myself, as you can clearly see from &lt;a href=&quot;https://blog.trueberryless.org/blog/authors/artificial-intelligence/&quot;&gt;some of my posts where I admittedly used AI&lt;/a&gt; to help me write them. But I think this is not a shame. Every content creator who uses AI should experience first-hand the pitfalls of creating content directly for the viewer or reader, in order to realise how little they subsequently know about the topic. This will enable them to learn from their mistake and be aware of how easily laziness can lead you down such a despised path. Only the excellent among us strove for hand-crafted content all along.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;negative-side-effects&quot;&gt;Negative side effects&lt;/h2&gt;&lt;a href=&quot;#negative-side-effects&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I pointed out the main drawbacks of using AI too extensively that I observed. I will now give you two smaller reasons I have noticed in myself for why you should not use AI for expressive work.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;communication-decline&quot;&gt;Communication decline&lt;/h3&gt;&lt;a href=&quot;#communication-decline&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;While watching a promotion video from “The Browser Company™” (see the last link in the &lt;a href=&quot;#resources-with-better-evidence&quot;&gt;resource section below&lt;/a&gt;) I noticed that visions can be very far apart nowadays. I see this trend not only in the Dia browser, but in many different aspects of technology and parts of our lives. One side of the trend wants to integrate AI everywhere possible, widening our dependence on it. One example is using AI to compose and write messages to our closest friends and colleagues because it makes us more efficient. I believe that it just makes us stupid in the long run.&lt;/p&gt;
&lt;p&gt;If people do not train their brains for coming up with words for communication, building useful sentences and meaning that can be understood by other human beings, our very foundation of interacting with each other is broken and we would be back at the level of &lt;em&gt;Homo habilis&lt;/em&gt; - the last species that likely did not use fully developed verbal language. See, I used AI to help me research this very bit of information, but chose my words consciously to express myself. This way, I not only learned something new, but can now also remember it. A capability you will never have when outsourcing writing to AI.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;loneliness&quot;&gt;Loneliness&lt;/h3&gt;&lt;a href=&quot;#loneliness&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Being alone on a mental level is in my opinion one of the most underrated modern dangers of society. The ironic part about it is, that if everyone is alone, we all have it in common, making us not alone with each one’s loneliness. But my thoughts are wandering in other oceans again.&lt;/p&gt;
&lt;p&gt;AI strongly encourages us to be alone. It &lt;del&gt;acts&lt;/del&gt; was intentionally trained to act as a perfect friend, colleague or whatever you wanna call it. Recently I noticed that ChatGPT’s responses explicitly include my name which feels very weird on multiple layers if you ask me. One could argue that this is private artificial doxxing, which of course is a oxymoron in itself as doxxing by definition is public. Nevertheless, the more you use AI, the more &lt;em&gt;often&lt;/em&gt; you want to use AI. Particularly after the introduction of AI voice modes this trend kept rising like there is no tomorrow. Congratulations ClosedAI, you just reinvented addiction.&lt;/p&gt;
&lt;p&gt;In worst case scenarios, this can leads people to fear talking with other people. Abandoning friendships. Withdrawal from society. Such habits are serious problems and should best be examined by a doctor or psychologist.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;proposal-of-ai-usage-layer-model&quot;&gt;Proposal of AI usage layer model&lt;/h2&gt;&lt;a href=&quot;#proposal-of-ai-usage-layer-model&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Proposing a global solution for all people of such a problem is impossible. Since each individual has their own experiences with AI, their own thoughts and feelings, optimists or pessimists, I cannot speak for everyone. In fact, I think I can only speak for myself, learn and share my own ways of handling and limiting my usage of AI and hope that those experiences can help you as well.&lt;/p&gt;
&lt;p&gt;My ideal experiences with AI - the optimal golden way between the overuse of AI alongside cognitive erosion and letting the hype pass besides you without taking any advantage of it - is using AI &lt;a href=&quot;https://en.wikipedia.org/wiki/If_and_only_if&quot;&gt;iff&lt;/a&gt; you and only you gain any benefits. In other words, control your usage and limit it to an extreme, where only ever you should come into contact with the content the AI produces. Such a limitation has many consequences, here are some examples to better demonstrate and emphasise what I mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use AI for personal learning sessions: If you initially want to dive into a new, completely unknown topic, AI can give you general overviews and show you connections to other parts of knowledge and real-world uses. While this does not necessarily mean that you really learn faster or more efficiently, it helps to take the step forward and get the ball rolling.&lt;/li&gt;
&lt;li&gt;Use AI for stupid and repetitive workloads and ask for help if you are certain that the problem or task has already been solved thousands of times by others. Current LLMs are trained based on existing data which means they are meant to be good at solving solved problems, not reinventing the wheel, but suggesting to use the existing round instrument.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;Do not use AI to express yourself to other people. Think about what meaning you want to convey, what knowledge you want to share and pack your thoughts into your own words. This helps you immensely to harden your own thoughts and remember what you learned and feel much better.&lt;/li&gt;
&lt;li&gt;Do not use AI to generate complex and creative work. Nowadays, there are hundreds - probably thousands - of tools, which help you create art, music, code, designs, plans, etc. with the help of or completely with AI. While this makes it seem that you can be more productive, it just makes you more ignorant the more often you fall back to those methods instead of doing what you love to do yourself. It is completely fine to say that small packages of the work can be outsourced to AI, mostly repetitive tasks that just take more time doing manually. Creative and original work, however, should remain human and made with love. If you do not like what you do at all, this is a signal that you should probably stop doing it at all.&lt;/li&gt;
&lt;li&gt;Do not fall for all the shiny AI stuff out there. Tools like &lt;a href=&quot;https://lovable.dev&quot;&gt;Lovable&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;&lt;img src=&quot;https://github.com/features.png&quot; alt=&quot;features&quot;&gt;GitHub Copilot&lt;/a&gt;, &lt;a href=&quot;https://cursor.com/en&quot;&gt;Cursor&lt;/a&gt;, &lt;a href=&quot;https://openai.com/index/chatgpt-can-now-see-hear-and-speak/&quot;&gt;ChatGPT Voice&lt;/a&gt; and new on the board: &lt;a href=&quot;https://academy.openai.com/public/resources/intro-gpt-5&quot;&gt;GPT-5&lt;/a&gt;, just to name a few, do not want to actually help you. They want either directly your data, or own your workflow so you cannot escape once you got used to it. Unfortunately, people get used to AI fascinatingly fast.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, what I mean is that AI should be used for brainstorming and helping each individual for creating an end product - not to be confused with AI creating the end product -, but not for communicating with other people and the final results themselves (eg image creation, writing blogs, posts on social media, communicating with chats, motivation speeches, essays, etc.). In my opinion, the human brain can only evolve and learn from its own mistakes and experience. And you can never learn from your mistakes when it was actually the AI generating them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI has a place in ideation, but expressive work should remain human.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;the-paradigm&quot;&gt;The Paradigm&lt;/h3&gt;&lt;a href=&quot;#the-paradigm&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I recently discovered a software design pattern called the “Onion Architecture”. To keep the explanation short, the main key principle of this architecture is its division into layers, where each layer is only connected to its two neighbours (siblings excluded), the inner and outer layer.&lt;/p&gt;
&lt;p&gt;To transfer this paradigm into the current context, you can imagine the AI as a tool available to you, which is unconnected to all other parts by being only surrounded by your brain, and only your brain can access, manipulate, create, and modify the outer layers - in this example, writing blogs, creating content, communicating with people via chats or speeches, or expressing yourself with art or design.&lt;/p&gt;
&lt;p&gt;Here you can see an image that represents my idea of a limited, but ideal usage of AI:&lt;/p&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/paradigm.DCxV81I4_Z1rdEHr.webp&quot; alt=&quot;Cognitive Erosion Paradigm: Layered, green circles with &amp;#x22;AI&amp;#x22; in the centre, surrounded by the &amp;#x22;Brain&amp;#x22;, which is surrounded by multiple circular segments labelled with &amp;#x22;Design&amp;#x22;, &amp;#x22;Blog&amp;#x22;, &amp;#x22;Chats&amp;#x22;, &amp;#x22;Art&amp;#x22;, &amp;#x22;Content&amp;#x22;, and &amp;#x22;Speech&amp;#x22; clockwise.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;512&quot; height=&quot;512&quot;&gt;&lt;button aria-label=&quot;Zoom image: Cognitive Erosion Paradigm: Layered, green circles with &amp;#x22;AI&amp;#x22; in the centre, surrounded by the &amp;#x22;Brain&amp;#x22;, which is surrounded by multiple circular segments labelled with &amp;#x22;Design&amp;#x22;, &amp;#x22;Blog&amp;#x22;, &amp;#x22;Chats&amp;#x22;, &amp;#x22;Art&amp;#x22;, &amp;#x22;Content&amp;#x22;, and &amp;#x22;Speech&amp;#x22; clockwise.&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;p&gt;If such an architectural approach and the paradigm in this context are optimal or just opinionated can be criticised in the comments below.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;a href=&quot;#conclusion&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;As I said in the beginning, this blog post is very opinionated and aims to just share my experience with everyone so you can also learn from my mistakes and optimise your own usage of AI and have it better under your control. In the end you can do whatever you want, but be aware of the degradation of your own brain when you also fall into the pitfall of overuse.&lt;/p&gt;
&lt;p&gt;Also one thing to note: It took me several months to write this blog post, refine it and start from zero again. No blog is perfect as you might have noticed with this one. There are probably some grammatical error here and there, some sentences that actually do not make sense, but this makes humans human. Moreover, there are very likely many strong opinions in this blog where you would totally argue against and completely disagree with me (I’m eager to see your comments expressing your outrage.), however this makes me me. My brain, my thoughts, my opinion.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“errare humanum est”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;resources-with-better-evidence&quot;&gt;Resources with better evidence&lt;/h2&gt;&lt;a href=&quot;#resources-with-better-evidence&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you are interested in articles which are based on more scientific studies or approaches, feel free to read some or all of those. They are in no particular order, so just start in the middle and keep going upward or downward. 😊&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lou.gg/blog/ai-artificial-incompetence&quot;&gt;AI: Artificial Incompetence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.theregister.com/AMP/2025/07/11/ai_code_tools_slow_down/&quot;&gt;AI coding tools make developers slower but they think they’re faster, study finds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://futurism.com/companies-fixing-ai-replacement-mistakes&quot;&gt;Companies That Tried to Save Money With AI Are Now Spending a Fortune Hiring People to Fix Its Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tomshardware.com/tech-industry/artificial-intelligence/linus-torvalds-reckons-ai-is-90-percent-marketing-and-10-percent-reality&quot;&gt;Linus Torvalds reckons AI is ‘90% marketing and 10% reality’&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ftt5KqJ5D0Q&quot;&gt;The AI Girlfriend situation is SAD (YouTube.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.economist.com/science-and-technology/2025/07/16/will-ai-make-you-stupid&quot;&gt;Will AI make you stupid?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/itsalexvacca/status/1935343874421178762&quot;&gt;AI isn’t making us more productive. It’s making us cognitively bankrupt. (X.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.forbes.com/sites/lanceeliot/2024/08/24/being-addicted-to-generative-ai/&quot;&gt;Being Addicted To Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tech.co/news/another-study-ai-making-us-dumb&quot;&gt;Yet Another Study Finds That AI Is Making Us Dumb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cognitiontoday.com/is-ai-making-us-smarter-or-dumber-or-artificially-smarter/&quot;&gt;Is AI making us smarter Or dumber?… Or artificially smarter? (AI symbiotic crisis)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hbr.org/2025/05/research-gen-ai-makes-people-more-productive-and-less-motivated&quot;&gt;Research: Gen AI Makes People More Productive—and Less Motivated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=JCZUIm4S9QQ&quot;&gt;The most powerful ways to “hack” our new Dia browser (YouTube.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;</content:encoded><category>Mindspace</category></item><item><title>Vibe-coding a VS Code Extension for Terraform projects</title><link>https://blog.trueberryless.org/blog/terraform-variables-resolution/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/terraform-variables-resolution/</guid><pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I want to talk about a small VS Code extension that I vibe-coded in a single day to make working with Terraform easier. I will first explain what Terraform is, and then jump right into the functionality and reasons behind this extension. Feel free to skip the first section if you are already familiar with Terraform.&lt;/p&gt;

&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;what-is-terraform&quot;&gt;What is Terraform?&lt;/h2&gt;&lt;a href=&quot;#what-is-terraform&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Terraform is an infrastructure-as-code (IaC) tool that lets you define your entire cloud or on-prem infrastructure as code. Its configuration language, invented by &lt;a href=&quot;https://github.com/hashicorp&quot;&gt;&lt;img src=&quot;https://github.com/hashicorp.png&quot; alt=&quot;hashicorp&quot;&gt;HashiCorp&lt;/a&gt;, is called HCL (HashiCorp Configuration Language) and features an intuitive, human-readable syntax. The &lt;em&gt;native syntax&lt;/em&gt; has the advantage that the learning curve is low, it is consistent for all providers and pleasant to read and write for humans, whilst the JSON-based variant is easier for machines to generate and parse.&lt;/p&gt;
&lt;p&gt;What makes Terraform very powerful are two basic features: &lt;strong&gt;variables&lt;/strong&gt; and &lt;strong&gt;modules&lt;/strong&gt;. Variables enable you to create resources where the actual values can be inserted from somewhere else and modules group any number of resources, which has the advantage of reusability and nesting. While both features sound very basic, the combination of the two makes a dream team. Because the openness of Terraform enables you to define input variables for each module and also export variables via outputs.&lt;/p&gt;
&lt;p&gt;A simple module is therefore structured like this:&lt;/p&gt;
&lt;starlight-file-tree data-pagefind-ignore=&quot;true&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;azure-resource-group/
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M8.850 11.880L8.850 4.200L15.150 8.040L15.150 15.720L8.850 11.880ZM22.590 4.200L15.900 8.040L15.900 15.720L22.590 11.880L22.590 4.200ZM8.100 3.840L1.410 0.120L1.410 7.560L8.100 11.280L8.100 3.840ZM8.850 12.750L8.850 20.160L15.150 23.880L15.150 16.470L8.850 12.750Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;main.tf&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M8.850 11.880L8.850 4.200L15.150 8.040L15.150 15.720L8.850 11.880ZM22.590 4.200L15.900 8.040L15.900 15.720L22.590 11.880L22.590 4.200ZM8.100 3.840L1.410 0.120L1.410 7.560L8.100 11.280L8.100 3.840ZM8.850 12.750L8.850 20.160L15.150 23.880L15.150 16.470L8.850 12.750Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;variables.tf&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M8.850 11.880L8.850 4.200L15.150 8.040L15.150 15.720L8.850 11.880ZM22.590 4.200L15.900 8.040L15.900 15.720L22.590 11.880L22.590 4.200ZM8.100 3.840L1.410 0.120L1.410 7.560L8.100 11.280L8.100 3.840ZM8.850 12.750L8.850 20.160L15.150 23.880L15.150 16.470L8.850 12.750Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;outputs.tf&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M23.780 10.803L23.818 10.803Q23.628 8.029 21.918 5.331L21.918 5.331Q20.664 3.469 18.916 2.234Q17.168 0.999 15.002 0.467L15.002 0.467Q13.748 0.125 12.646 0.125L12.646 0.125L10.746 0.125Q7.326 0.467 4.438 2.595L4.438 2.595Q1.132 5.369 0.296 9.245L0.296 9.245Q0.068 10.423 0.068 11.145L0.068 11.145L0.068 13.045Q0.448 16.351 2.082 18.631L2.082 18.631Q4.172 21.709 7.288 22.925L7.288 22.925Q9.454 23.685 11.202 23.875L11.202 23.875L13.102 23.875Q17.434 23.495 20.474 20.303L20.474 20.303Q22.944 17.833 23.666 14.375L23.666 14.375Q23.742 14.071 23.799 13.539Q23.856 13.007 23.932 12.703L23.932 12.703L23.932 11.411Q23.780 11.145 23.780 10.803L23.780 10.803ZM11.924 21.975L11.924 21.975Q9.188 21.975 6.870 20.569L6.870 20.569Q4.590 19.239 3.279 16.921Q1.968 14.603 1.968 11.867Q1.968 9.131 3.317 6.813Q4.666 4.495 6.984 3.165L6.984 3.165Q9.378 1.759 12.152 1.759L12.152 1.759Q14.850 1.835 17.149 3.184Q19.448 4.533 20.778 6.813L20.778 6.813Q22.146 9.131 22.108 11.867Q22.070 14.603 20.683 16.921Q19.296 19.239 17.016 20.569L17.016 20.569Q14.660 21.975 11.924 21.975ZM15.496 18.289L14.774 18.289Q14.432 18.289 14.166 18.175L14.166 18.175Q14.014 18.175 13.900 17.947L13.900 17.947Q13.862 17.833 13.824 17.795L13.824 17.795L13.824 10.081Q12.874 10.157 11.031 10.214Q9.188 10.271 8.238 10.309L8.238 10.309L8.238 11.259L9.416 11.259Q9.758 11.259 9.948 11.487Q10.138 11.715 10.138 12.095L10.138 12.095L10.138 17.567Q10.138 18.289 9.416 18.289L9.416 18.289L8.352 18.289L8.352 19.239L15.496 19.239L15.496 18.289ZM11.696 8.675L11.696 8.675Q12.570 8.675 13.140 8.067Q13.710 7.459 13.710 6.642Q13.710 5.825 13.102 5.217Q12.494 4.609 11.658 4.609Q10.822 4.609 10.252 5.217Q9.682 5.825 9.682 6.642Q9.682 7.459 10.290 8.067Q10.898 8.675 11.696 8.675Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;README.md&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/starlight-file-tree&gt;
&lt;p&gt;All files except &lt;code dir=&quot;auto&quot;&gt;main.tf&lt;/code&gt; are optional (the &lt;code dir=&quot;auto&quot;&gt;README.md&lt;/code&gt; isn’t Terraform-specific), but I prefer following best practices, so the example includes them.&lt;/p&gt;
&lt;p&gt;Let’s look at a simple example. Imagine we want to manage a resource group in Azure with Terraform. In the &lt;code dir=&quot;auto&quot;&gt;variables.tf&lt;/code&gt; file we define what inputs we expect inside the module. Each of the two blocks represents the variable and properties of the variable, like the &lt;code dir=&quot;auto&quot;&gt;description&lt;/code&gt; or the &lt;code dir=&quot;auto&quot;&gt;type&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;variables.tf&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;variable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;description &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Name of the resource group&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type        &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;variable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;location&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;description &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Azure region&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type        &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;default     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;westeurope&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You might have noticed that the &lt;code dir=&quot;auto&quot;&gt;location&lt;/code&gt; variable also has a &lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt; property, which makes the variable optional and provides a fallback value if none is specified. These variables can then be used inside the &lt;code dir=&quot;auto&quot;&gt;main.tf&lt;/code&gt; file. In here, we define the actual resources we want to generate:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;main.tf&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;provider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;azurerm&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;features&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;azurerm_resource_group&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;this&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name     &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;location &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In this case, we just define our simple resource group, which you can think of as a folder in Azure - very amateurish explanation. Now the last part which we can implement, is the &lt;code dir=&quot;auto&quot;&gt;outputs.tf&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;outputs.tf&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;resource_group_id&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;description &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The ID of the resource group&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;value       &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;azurerm_resource_group&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is very useful if we want to use information like the ID of the resource group later in other parts of our Terraform project.&lt;/p&gt;
&lt;p&gt;As I already wrote, the &lt;code dir=&quot;auto&quot;&gt;README.md&lt;/code&gt; is not actually part of the Terraform definitions, but helps us understand the purpose of the module:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt; Azure Resource Group Module&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;A minimal Terraform module that creates an Azure Resource Group.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;##&lt;/span&gt;&lt;span&gt; Usage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;hcl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;module &quot;rg&quot; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;source = &quot;./azure-resource-group&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name   = &quot;my-resource-group&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;As the &lt;code dir=&quot;auto&quot;&gt;README.md&lt;/code&gt; already suggests, we can now use this module to create an Azure Resource Group anywhere inside our project. We just need to make sure that the path to the module folder is correct and Terraform knows how to interpret the &lt;code dir=&quot;auto&quot;&gt;main.tf&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;variables.tf&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;outputs.tf&lt;/code&gt; files. In this case, since we do not specify the &lt;code dir=&quot;auto&quot;&gt;location&lt;/code&gt; variable, it will be set to &lt;code dir=&quot;auto&quot;&gt;&quot;westeurope&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rg&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;source &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./azure-resource-group&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;my-resource-group&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;I hope this section gave you a better basic understanding of what Terraform is and what you can do with it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-tedious-task-of-terraform&quot;&gt;The tedious task of Terraform&lt;/h2&gt;&lt;a href=&quot;#the-tedious-task-of-terraform&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You might have noticed that the &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; field of a module creates an awesome flexibility for the whole project since you can define modules anywhere and use them anywhere inside the project.&lt;/p&gt;
&lt;p&gt;However, this feature also has a huge drawback when it comes to maintainability: Resolving the actual values behind variables can be very tedious. While in this simple example it might seem easy to manage, the bigger the project grows, the more nested it is, the harder and more time-consuming understanding and adapting Terraform code can be. Therefore, I made an extension.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What should the extension do?&lt;/strong&gt; The main goal of the extension is to provide the actual values of the variables everywhere you use them. If a module gets called from multiple places or just multiple times, the information should provide which use case sets the variable to which value. If modules get nested deeply, the values should resolve until we reach the &lt;code dir=&quot;auto&quot;&gt;.tfvars&lt;/code&gt; files. These are the files where you can define the hard-coded values for variables.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;how-to-start-a-vs-code-extension&quot;&gt;How to start a VS Code extension&lt;/h2&gt;&lt;a href=&quot;#how-to-start-a-vs-code-extension&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Creating the basic template project for a VS Code extension is as easy as running this command when you have &lt;a href=&quot;https://github.com/nodejs&quot;&gt;&lt;img src=&quot;https://github.com/nodejs.png&quot; alt=&quot;nodejs&quot;&gt;Node&lt;/a&gt; installed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--package&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--package&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generator-code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This command temporarily installs the Yeoman (a generator software), and enters an interactive mode where some questions have to be answered, like the project name, type and description. In the following block you can see all questions and default answers:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? What type of extension do you want to create? New Extension (TypeScript)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? What&apos;s the name of your extension? HelloWorld&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;### Press &amp;#x3C;Enter&gt; to choose default for all options below ###&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? What&apos;s the identifier of your extension? helloworld&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? What&apos;s the description of your extension? LEAVE BLANK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? Initialize a git repository? Y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? Which bundler to use? unbundled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? Which package manager to use? npm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ? Do you want to open the new folder with Visual Studio Code? Open with `code`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For further information regarding VS Code extensions I want to link to &lt;a href=&quot;https://code.visualstudio.com/api/get-started/your-first-extension&quot;&gt;the official documentation&lt;/a&gt;, as it is always up-to-date in contrast to my explanations here.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;3-2-1-vibe-coding&quot;&gt;3… 2… 1… Vibe-Coding!&lt;/h2&gt;&lt;a href=&quot;#3-2-1-vibe-coding&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I like to start new projects by asking &lt;a href=&quot;https://github.com/openai&quot;&gt;&lt;img src=&quot;https://github.com/openai.png&quot; alt=&quot;openai&quot;&gt;ChatGPT&lt;/a&gt; for general technical questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How would you suggest achieving such a project?&lt;/li&gt;
&lt;li&gt;How long do you estimate it will take me?&lt;/li&gt;
&lt;li&gt;How difficult will it be?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Brainstorming with AI bots seems like a very sensible way to get a better overview of new projects, especially when diving into completely new waters.
Creating a VS Code extension was exactly such a use case because I had never created anything for VS Code or any other IDE before.
After this initial brainstorming phase, I prefer to use &lt;a href=&quot;https://github.com/anthropics&quot;&gt;&lt;img src=&quot;https://github.com/anthropics.png&quot; alt=&quot;anthropics&quot;&gt;Claude&lt;/a&gt; for programming all the files necessary for such an extension since in my experience this AI bot really has the ability to nail code. I hardly encountered bugs or runtime issues with Claude code, so I use it exactly for such use cases – initial starters. The drawback of Claude is its very limited free trial, which is why I am always careful when choosing my words and try to think of as many possible mistakes the AI could make ahead of time.
So this is how it began: I took some time to formulate my exact scenario and wish into the limited context windows of a random words machine called Claude and immediately received a huge &lt;code dir=&quot;auto&quot;&gt;extension.ts&lt;/code&gt; implementation. Of course there were obvious differences between my vision and the communication to this LLM, so I had to tell it another time what the important considerations are and in order to be able to receive more code, I also used my magic trick: “If this is too big for one file, just give me the whole extension.ts in multiple files, which should work of course.”&lt;/p&gt;
&lt;p&gt;Claude then went on a long journey.&lt;/p&gt;
&lt;p&gt;After some struggling to keep it going my tokens were all used and I had to figure out the remaining code myself. Nonetheless, I managed to get a running version since not much was missing and immediately realised some improvements that went unnoticed until now. Since I had to wait for my tokens to refill, I did exactly this.&lt;/p&gt;
&lt;p&gt;The next morning the improvement session began, and after two long conversations, the context window was completely full and I could not even send messages in the same chat any more, although my tokens were not expired yet. However, all I wanted to achieve and get out of Claude was now available and I could run some tests in one of my bigger projects. After confirming and adjusting some code manually, I was satisfied for now and so I decided that the first public release was ready.&lt;/p&gt;
&lt;p&gt;Some trial and error with &lt;a href=&quot;https://github.com/github&quot;&gt;&lt;img src=&quot;https://github.com/github.png&quot; alt=&quot;github&quot;&gt;GitHub Actions&lt;/a&gt; later, I managed to &lt;a href=&quot;https://code.visualstudio.com/api/working-with-extensions/publishing-extension#create-a-publisher&quot;&gt;set up the publisher&lt;/a&gt; for a VS Code extension. And two patch versions later, I was quite happy with the results.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-final-result&quot;&gt;The Final Result&lt;/h2&gt;&lt;a href=&quot;#the-final-result&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Try out the extension yourself by clicking on the button below. There are still many improvements to be made, so if you are interested in helping out, feel free to contribute on &lt;a href=&quot;https://github.com/trueberryless/terraform-variables-resolution&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9919?v=4&quot; alt=&quot;GitHub&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;a href=&quot;vscode:extension/trueberryless.terraform-variables-resolution&quot;&gt;  Install Terraform Variables Resolution  &lt;/a&gt;
&lt;p&gt;Here you can see the example from &lt;a href=&quot;#what-is-terraform&quot;&gt;the Terraform explanation&lt;/a&gt;, showing how this extension visually adds the values of the variables in VS Code:&lt;/p&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/example.BpaBtxf4_1O9rPk.webp&quot; alt=&quot;Terraform Variables Resolution Example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;418&quot; height=&quot;105&quot;&gt;&lt;button aria-label=&quot;Zoom image: Terraform Variables Resolution Example&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;</content:encoded><category>Automation</category><category>Plugins</category><category>Tool</category></item><item><title>Earworms and the message hidden within the pattern</title><link>https://blog.trueberryless.org/blog/earworms/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/earworms/</guid><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yes, this title is a small nod to the excellent Netflix series “Arcane”, but that’s not what this post is about.&lt;/p&gt;
&lt;p&gt;Today, I want to share some thoughts about earworms, a term that originated in German (“Ohrwurm”) and was later adopted into English as a literal translation. The meaning behind this rather abstract term is catchy tunes—&lt;em&gt;sticky music&lt;/em&gt;, as Wikipedia calls it. This phenomenon often occurs unpredictably, especially when our thoughts drift away from the present moment.&lt;/p&gt;

&lt;p&gt;While many of my blog-post ideas strike on train rides, while lying in bed, or when I’m simply reflecting on life, the inspiration for this post literally hit me whilst showering, as the good old &lt;em&gt;shower thoughts&lt;/em&gt; are intended to be. The reason – as you might be able to guess from the topic – was an earworm about a melody where I could have sworn that I haven’t heard it for a long time, like 4–5 weeks.&lt;/p&gt;
&lt;p&gt;And this always seems to be the confusing parts about earworms: Nobody really knows who decides when to play. Is it the brain hitting “play” when it’s a little numb? You know what I mean, those moments when you don’t really know what you are currently thinking and you don’t have to think about what to think, you are just enjoying the moment. There is another Austrian idiom for this exact scenario: “ins Narrenkastl schauen”, which means something like &lt;em&gt;to stare into space&lt;/em&gt;. And I think that exactly those absent-minded moments are the origin and reason why earworms happen.&lt;/p&gt;
&lt;p&gt;But this still leaves the question: Who decides what to play in someone’s head when it happens? Like who is the DJ? From my own experience I have noticed a repeating pattern, especially if you have just been listening to music in the last half of an hour. My brain at least, likes to repeat parts of the &lt;strong&gt;penultimate song&lt;/strong&gt; heard, in other words the song, which was played before the last song. This theory works even better if the last song was paused in the middle or just not perfectly at the end of it.&lt;/p&gt;
&lt;p&gt;The exact reason for that is completely unknown to me, but if I had to guess, I would say that the rhythms of the completed song (the penultimate one) are still ringing somewhere in your mind since the song itself was maybe one of those “I-just-fade-out-my-volume-to-end-me”-songs, which is not my favourite type of ending to music, but it encourages the brain to go on.&lt;/p&gt;
&lt;p&gt;At least that’s what I think. I would be very interested if you have experienced similar patterns, so feel free to write your own blog post about it or just share this one with friends so you can discuss it with them!&lt;/p&gt;</content:encoded><category>Mindspace</category><category>Yappin&apos;</category></item><item><title>How to create a Rehype plugin that turns GitHub links into beautiful badges</title><link>https://blog.trueberryless.org/blog/rehype-github-badge-links/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/rehype-github-badge-links/</guid><description>Discover how a tiny Rehype plugin can give your GitHub links a big visual upgrade. With just a few lines of code, we’ll turn regular profile links into elegant badges with avatars, inspired by Antfu’s site and powered by Astro + Starlight.

</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I added a very little neat feature to this blog, which you might have noticed as a regular reader. It’s nothing huge, but gives every blog this little lovely touch I, which I have longed for a long time. I am &lt;del&gt;talking&lt;/del&gt; writing about all those green badges with profile pictures you can see in this blog as well.&lt;/p&gt;
&lt;p&gt;The inspiration to create them was taken from none other than &lt;a href=&quot;https://github.com/antfu&quot;&gt;&lt;img src=&quot;https://github.com/antfu.png&quot; alt=&quot;antfu&quot;&gt;Antfu&lt;/a&gt; himself, as he has those badges all over the place on his website (as time of writing).&lt;/p&gt;
&lt;p&gt;Initially I thought they would require some long and tedious programming session to accomplish the same visual beauty. However, after some Vibe Coding - as &lt;a href=&quot;https://x.com/karpathy/status/1886192184808149383&quot;&gt;Andrej Karpathy coined the term&lt;/a&gt; - I quickly realised that those badges were just a small &lt;a href=&quot;https://github.com/rehypejs&quot;&gt;&lt;img src=&quot;https://github.com/rehypejs.png&quot; alt=&quot;rehypejs&quot;&gt;rehype&lt;/a&gt; plugin away from existence.&lt;/p&gt;
&lt;p&gt;This is the whole code behind the rehype plugin:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/lib/rehype-github-badge-links.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hastscript&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;visit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;unist-util-visit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rehypeGitHubBadgeLinks&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tree&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;visit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tree&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tagName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://github.com/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;https:&lt;/span&gt;&lt;span&gt;\/\/&lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;\.&lt;/span&gt;&lt;span&gt;com&lt;/span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;\w&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;// Add GitHub badge class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[]).&lt;/span&gt;&lt;span&gt;concat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gh-badge&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;// Build avatar image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;avatarImg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;https://github.com/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.png&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;// Prepend avatar image to original children&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;children&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unshift&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;avatarImg&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Basically all this plugin does, is walking through the HTML, looking for links which reference to any GitHub profile. If it finds one, it adds an &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;img&gt;&lt;/code&gt; tag before the text content with the profile picture of the GitHub user or organisation. This is possible very consistently thanks to GitHub’s feature of making the picture available as a resource behind the profile link appended with &lt;code dir=&quot;auto&quot;&gt;.png&lt;/code&gt;. Read more about that feature in &lt;a href=&quot;https://dev.to/10xlearner/how-to-get-the-profile-picture-of-a-github-account-1d82&quot;&gt;this awesome article on &lt;code dir=&quot;auto&quot;&gt;dev.to&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With a little bit of additional styling it looks really cute in my opinion. Please note that since this is a &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; page, I use available CSS variables, like in line four:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gh-badge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inline-flex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;align-items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;center&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;background-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-accent-low&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;border-radius&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9999&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.9&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;text-decoration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inherit&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;transition&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; background-color &lt;/span&gt;&lt;span&gt;0.2&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ease&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;transform&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;translateY&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0.29&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;border&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-accent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gh-badge&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;hover&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;background-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-accent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gh-badge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;border-radius&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9999&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1.3&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1.3&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now to put everything together, let’s say for example in an Astro site, you just need to add the rehype plugin to the configuration like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rehypeGitHubBadgeLinks&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./src/lib/rehype-github-badge-links&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;markdown&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;rehypePlugins&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;rehypeGitHubBadgeLinks&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read more about the injection of rehype plugins in Astro in &lt;a href=&quot;https://docs.astro.build/en/reference/configuration-reference/#markdownrehypeplugins&quot;&gt;their configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Do not forget to add the CSS in a similar way depending on your framework - in Starlight you can configure custom global CSS styles following &lt;a href=&quot;https://docs.astro.build/en/guides/styling/#scoped-styles&quot;&gt;these instructions&lt;/a&gt; - and you can admire your own badge links too. Feel free to share this post with anyone you want to persuade to use these features too.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;✨ Bones point&lt;/summary&gt;&lt;p&gt;If you want to use such a badge for other links too, I recommend that you craft yourself a little Astro component like this one:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/BadgeLink.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gh-badge&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;={&lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;={&lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;}&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;={&lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;={&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Just make sure that the CSS is globally (or &lt;a href=&quot;https://docs.astro.build/en/guides/styling/#scoped-styles&quot;&gt;scope&lt;/a&gt; it in the component above) and it’s ready to be used:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BadgeLink&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;../components/BadgeLink.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;BadgeLink&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://github.com/withastro/starlight&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/starlight.png&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Starlight&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;</content:encoded><category>Plugins</category><category>Education</category></item><item><title>Accelerating translations with continuous integration</title><link>https://blog.trueberryless.org/blog/accelerating-translations-with-continuous-integration/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/accelerating-translations-with-continuous-integration/</guid><description>&amp;lt;p&amp;gt;I have been working in OSS on &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/github&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://github.com/github.png&amp;quot; alt=&amp;quot;github&amp;quot; /&amp;gt;GitHub&amp;lt;/a&amp;gt; for over a year now and although I thought I found everything I want to contribute to, I recently discovered &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/pelikhan&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://github.com/pelikhan.png&amp;quot; alt=&amp;quot;pelikhan&amp;quot; /&amp;gt;Peli&amp;#39;s&amp;lt;/a&amp;gt; personal project &amp;lt;a href=&amp;quot;https://github.com/pelikhan/action-continuous-translation&amp;quot;&amp;gt;action-continuous-translation&amp;lt;/a&amp;gt; and I am very happy that I started doing regular contributions there and being part of the little community now.&amp;lt;/p&amp;gt;

</description><pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For the last year, I have been working a lot in various Open Source Communities on GitHub in my free time and I have been enjoying these somehow relaxing contributions because they help me gain new knowledge on a daily basis.&lt;/p&gt;
&lt;p&gt;After some time contributing I also got to know how kind and welcoming communities behind those projects are. These people have all one thing in common with you: They want to build great stuff in their leisure time. Especially the &lt;a href=&quot;https://github.com/withastro/astro&quot;&gt;&lt;img src=&quot;https://github.com/withastro.png&quot; alt=&quot;withastro&quot;&gt;Astro&lt;/a&gt; community is the one and only I have enjoyed being in the most, since it’s the most rewarding and friendly at the same time. Not all communities can achieve such a great status among OSS.&lt;/p&gt;
&lt;p&gt;Recently, I discovered another evolving project founded by &lt;a href=&quot;https://github.com/pelikhan&quot;&gt;&lt;img src=&quot;https://github.com/pelikhan.png&quot; alt=&quot;pelikhan&quot;&gt;pelikhan&lt;/a&gt; which aims to automatically translate all your documentation, blogs or shop sites whenever something changes with the help of AI. Whilst initially sceptical, reading more about the project in its README.md had me hooked.&lt;/p&gt;
&lt;p&gt;The approach of strictly guiding AI into only translating little chunks - mostly sentences or paragraphs with perfectionist instructions - made me think that this could really work. So I tried it out in my own project, my blog. And to my surprise, those translations were much better than I expected. Of course you notice that it was translated by AI - handmade work will hopefully never be replaced entirely - but if you fairly mention that you use AI in an aside, this is much more accessibly for people than nothing.&lt;/p&gt;
&lt;p&gt;So I took a closer look at the actual code of the project. After noticing some little inconsistencies, spaces for improvements and missing but very cool features here and there, I started contributing there as well. I mean, after one year of contributions in bigger project, PRs were nothing new to me.&lt;/p&gt;
&lt;p&gt;You have to know that this was a Friday evening - almost night in my timezone - and &lt;a href=&quot;https://github.com/pelikhan&quot;&gt;&lt;img src=&quot;https://github.com/pelikhan.png&quot; alt=&quot;pelikhan&quot;&gt;Peli&lt;/a&gt; was currently online, also doing commits after commits to the project. I quickly noticed that, in contrast to the other projects I am part of, Peli did not waste any time merging PRs. It felt very rewarding this night because I just kept going until 1am, Peli merging faster than I could improve features, docs and fixes. Another aspect that felt great was that since this was a young project, Peli did not hesitate to just merge, try it out locally and then pushing little fixes I missed.&lt;/p&gt;
&lt;p&gt;Fast-forward three days and I am now an official contributor to the project, making it greater and greater almost daily, mainly focusing on docs and the support for my heart project: &lt;a href=&quot;https://starlight.astro.build/&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; - as you might already have guessed from &lt;a href=&quot;https://blog.trueberryless.org/blog/tags/starlight/&quot;&gt;my blogs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Peli and I have our virtual productivity sessions between 4pm and 8pm UTC, extending longer on weekends. So if you want to join us as an early bird of the project or got interested in using it, feel free to check it out on &lt;a href=&quot;https://github.com/pelikhan/action-continuous-translation&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9919?v=4&quot; alt=&quot;GitHub&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Automation</category><category>GitHub</category><category>Plugins</category><category>Markdown</category><category>Tool</category></item><item><title>Some aspects of creating a blog are really easy, and some are extremely difficult!</title><link>https://blog.trueberryless.org/blog/writing-blogs-is-hard-and-easy/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/writing-blogs-is-hard-and-easy/</guid><description>&amp;lt;p&amp;gt;Talk a little bit about how one can become better (not master by any means, nobody is perfect) in writing a blog post. These are just my thoughts after two awesome guys from the &amp;lt;a href=&amp;quot;https://astro.build/chat&amp;quot;&amp;gt;Astro Community&amp;lt;/a&amp;gt; (&amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/jdtjenkins&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://github.com/jdtjenkins.png&amp;quot; alt=&amp;quot;jdtjenkins&amp;quot; /&amp;gt;Jacob&amp;lt;/a&amp;gt; and &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/louisescher&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://github.com/louisescher.png&amp;quot; alt=&amp;quot;louisescher&amp;quot; /&amp;gt;Lou&amp;lt;/a&amp;gt;) decided to write blogs about how hard and easy it is to write blog posts.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Please read their posts first as this is the follow-up on both of them:&amp;lt;/p&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/&amp;quot;&amp;gt;&amp;quot;Why is writing blog posts so hard?&amp;quot; - Jacob Jenkins&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;https://lou.gg/blog/why-writing-blogs-isnt-hard&amp;quot;&amp;gt;&amp;quot;Why Writing Blogs isn&amp;#39;t hard&amp;quot; - Louis Escher&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog/writing-blogs-is-hard-and-easy/&amp;quot;&amp;gt;&amp;quot;Some aspects of creating a blog are really easy, and some are extremely difficult!&amp;quot; - Felix Schneider&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;p&amp;gt;After that you have successfully completed this awesome trilogy of blog posts about blog posts.&amp;lt;/p&amp;gt;

</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After a very interesting discussion in the &lt;a href=&quot;https://github.com/withastro&quot;&gt;&lt;img src=&quot;https://github.com/withastro.png&quot; alt=&quot;withastro&quot;&gt;Astro&lt;/a&gt; &lt;a href=&quot;https://astro.build/chat&quot;&gt;Discord&lt;/a&gt; - started by none other than core maintainer &lt;a href=&quot;https://github.com/alexanderniebuhr&quot;&gt;&lt;img src=&quot;https://github.com/alexanderniebuhr.png&quot; alt=&quot;alexanderniebuhr&quot;&gt;Alex&lt;/a&gt; himself (btw congratulations on this recent achievement 🎉) -, I joked around that someone could write a blog about reasons why it is so difficult for many people to not only write, but also maintain a blog as a whole.&lt;/p&gt;
&lt;p&gt;The man who nominated me as an Astro Support Squad - &lt;a href=&quot;https://github.com/jdtjenkins&quot;&gt;&lt;img src=&quot;https://github.com/jdtjenkins.png&quot; alt=&quot;jdtjenkins&quot;&gt;Jacob&lt;/a&gt; (btw thank you very much for noticing me within this awesome community 😍) - took that quite literally and wrote a blog about it. No joke. Check it out: &lt;a href=&quot;https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/&quot;&gt;https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/&lt;/a&gt; This is his very first blog btw (and hopefully not his last one, as I really enjoyed reading his style).&lt;/p&gt;
&lt;p&gt;Our beloved everywhere-helper, Blogger, Designer and StudioCMSer - &lt;a href=&quot;https://github.com/louisescher/&quot;&gt;&lt;img src=&quot;https://github.com/louisescher.png&quot; alt=&quot;louisescher&quot;&gt;Lou&lt;/a&gt; (btw thank you for giving me some blog writing tips in advance so I can more confidently write this 🤩) - jumped immediately on this awesome hype-train (as Twitch users might call it) and published &lt;a href=&quot;https://lou.gg/blog/why-writing-blogs-isnt-hard&quot;&gt;his follow-up post&lt;/a&gt; within fricking 12 hours!!! Believe me, I checked the commits, Lou literally pushed within 4min of the 12h mark.&lt;/p&gt;
&lt;p&gt;As I will include many references to both of their blogs, it’s best if you read theirs first. And then mine. Or maybe it’s better if you just read theirs, I’m not yet sure how mine will develop.&lt;/p&gt;
&lt;p&gt;But what I can &lt;del&gt;say&lt;/del&gt; write, is that mine will fully focus on just the writing skills.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;how-to-setup-a-blog-technical-challenges&quot;&gt;How to setup a blog (technical challenges)&lt;/h2&gt;&lt;a href=&quot;#how-to-setup-a-blog-technical-challenges&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Whilst this blog doesn’t focus on how to build a blog, deploy it and all this technical stuff, I want to mention that everyone can do it. Like Lou mentioned, as a non-technical person, you can always just create an account on &lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt; and such alternatives. If you are a little into programming, you can let your creativity a little bit more space and thanks to the awesome &lt;a href=&quot;https://starlight-blog-docs.vercel.app/&quot;&gt;Starlight Blog&lt;/a&gt; project from &lt;a href=&quot;https://github.com/HiDeoo&quot;&gt;&lt;img src=&quot;https://github.com/HiDeoo.png&quot; alt=&quot;HiDeoo&quot;&gt;HiDeoo&lt;/a&gt; you do not need much knowledge to deploy your own website. Nowadays, where there are also PaaS (Platform as a Service) providers like &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;, which make deploying stuff a Click-Ops adventure, there no more is any excuse in not being able to publish your blog because of technical difficulties.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;okay-jokes-aside-now-writing-skills&quot;&gt;Okay, jokes aside, now: Writing skills&lt;/h2&gt;&lt;a href=&quot;#okay-jokes-aside-now-writing-skills&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;But this blog should focus on mainly on the “Writing Skill” as I said, so let’s continue there. As I myself initially had a hard time writing blogs, I can totally agree with Jacob that getting started is hard. It’s not like reading through the &lt;a href=&quot;https://docs.astro.build/en/install-and-setup/&quot;&gt;Astro “Getting started” guide&lt;/a&gt; where you just have to follow the instructions and then ask on Discord what a &lt;code dir=&quot;auto&quot;&gt;InvalidContentEntryDataError&lt;/code&gt; means &lt;sub&gt;please use the &lt;code dir=&quot;auto&quot;&gt;#support&lt;/code&gt; thread if you do 🫶&lt;/sub&gt; (&lt;a href=&quot;https://docs.astro.build/en/reference/errors/invalid-content-entry-data-error/&quot;&gt;If you are still wondering&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;On the other hand, the goal seems so close and doable. Just write some words. What’s so hard in writing those fricking words? Actually, I myself don’t know. Why are you asking me? The only thing that helped me getting out of the spiral of “You-Want-To-Write-But-Every-Time-You-Stare-At-The-Blinking-Cursor-Your-Brain-Goes-Numb” (let’s make that the hashtag of the week) was Lou’s tip of not wanting as much of yourself in your first blog. Why do you want a perfect blog to start with? Just because of your reputation? So people don’t think wrong of you? Feel disappointed? To be honest: That’s bullshit! Not just because your first blog will very likely not be read by anyone (with the exception of Jacob’s exceptional blog), but also because you are just making it harder for yourself. My personal mind ceiling was that I thought I must write at least 500 words to begin with. But who says that? To be honest, if I could look back, I sometimes think: “Man, it would have been so unique and cool if my first ever blog was just like a regular tweet”, or even extremer: One. Word. Nobody will stop you from publishing this blog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hello 👋&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(Sorry if I now took your awesome idea,
and included your whole blog post in here
- wow cool, that rhymes)&lt;/p&gt;
&lt;p&gt;See? I can do whatever I want, even being a fricking poet (typical German behaviour), and nobody will judge me. Okay, maybe someone will hate on this blog because it’s “a waste of time, no meaning in all this useless content”, but who &lt;strong&gt;&lt;em&gt;c a r e s&lt;/em&gt;&lt;/strong&gt;? It’s &lt;em&gt;your&lt;/em&gt; blog, &lt;span id=&quot;comment-reference&quot;&gt;nobody asked for their opinions (unless you have a comment section under your blog 🙄 &lt;em&gt;cough&lt;/em&gt; &lt;a href=&quot;https://lou.gg/blog/why-writing-blogs-isnt-hard#chapter-five-its-the-8th-of-july&quot;&gt;Lou&lt;/a&gt;&lt;/span&gt;). So don’t think about what others might think about your writing style, content, use of language or even if you make grammar mistakes. Those all make you human and getting everything perfect is not only completely unnecessary, it’s also &lt;a href=&quot;https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/#:~:text=hrad&quot;&gt;hrad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another part of writing blogs is not just getting started, but the difficulty of maintaining one flow, one thought if you will. As a listener of well-written speeches you subconsciously notice that it was good, it was fulfilling, sublime. And that’s what I love about such blogs or speeches. They just feel right somehow. But I myself have accepted that I can’t accomplish such achievements in my own creative work. And I’m much better off with that acceptance. Because the benefit of accepting imperfection is getting things done. Not just 50%, not just 90%. Done. Completed, 100%. And this is something that many people struggle with, my past self included - actually just myself included.&lt;/p&gt;
&lt;p&gt;But as Lou mentions, there are other easy methods to keep a common thread in the whole post, sticking to the story whilst thoughts might wander around in your own brain. Bringing all those thoughts on paper, or in this case on the keyboard can be challenging, especially when you are starting writing. But there is a reason why we learn such skills at school, they improve our cognitive health and development immensely. This is also why I heavily agree with Lou when he states that AI should never be used in the process of writing. It just has no benefits, neither for the reader and even less for you.&lt;/p&gt;
&lt;p&gt;So I don’t want to repeat what Lou says, but bullet points have helped me out a lot in the past. They just give me the feeling of constant structure, while my mind can play around with different thoughts and theories. This makes sure that you always come back to what you initially wanted to include in your post. “And if you can’t come up with bullet points?”, you might ask. Then you might need some more brainstormings or just showers.&lt;/p&gt;
&lt;p&gt;In the end, these are some tips I can give you along the way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Develop your own writing style, not by training, but just writing. Sooner or later you will notice what types you might like, some things you want to adopt from other bloggers, but summa summarum what you write will always be yours. You just share it with the world. It’s up to you if you want to use a colon or hyphen here and there, use more dots, the past tense, imperativ, swear words or the more formal style. All those things will come automatically together and define you as a unique blogger. And you readers will value this individuality more than you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t take on too much. Might sound easy, but everyone falls regularly into this trap. Or maybe just people like me, having a mix of autism and perfectionism - idk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Although it always sounds stupid: Start writing. And if it doesn’t work, start writing the middle part. Because I know start and ending are always difficult, but imo the middle part goes down like butter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blogs have easy and hard sides: This is what the title says, but know that when I wrote all that I realised that I haven’t answered that question at all… Thank god, that Jacob didn’t type a question mark at the end of that suggestion. 🙏&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeah, I guess that’s it. If you want to share you thoughts, leave them in &lt;a href=&quot;https://lou.gg/blog/why-writing-blogs-isnt-hard&quot;&gt;Lou’s comments&lt;/a&gt; because I have none.&lt;/p&gt;</content:encoded><category>Mindspace</category><category>Education</category><category>Yappin&apos;</category></item><item><title>How to create a horizontal progress indicator for your Starlight site</title><link>https://blog.trueberryless.org/blog/starlight-progress-indicator/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-progress-indicator/</guid><description>Learn how to create a horizontal progress indicator for your &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/withastro/starlight&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/starlight.png&amp;quot; alt=&amp;quot;Starlight&amp;quot; /&amp;gt;Starlight&amp;lt;/a&amp;gt; site.

</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this post, we would like to show you how &lt;a href=&quot;https://github.com/frostybee&quot;&gt;&lt;img src=&quot;https://github.com/frostybee.png&quot; alt=&quot;frostybee&quot;&gt;FrostyBee&lt;/a&gt; created a clean horizontal progress indicator for Starlight sites.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;&lt;a href=&quot;#prerequisites&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You will need to have an existing Starlight website.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;create-the-progress-indicator-component&quot;&gt;Create the progress indicator component&lt;/h2&gt;&lt;a href=&quot;#create-the-progress-indicator-component&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Let’s create a new component called &lt;code dir=&quot;auto&quot;&gt;ProgressIndicator.astro&lt;/code&gt; in the &lt;code dir=&quot;auto&quot;&gt;src/components/&lt;/code&gt; directory. This component will be responsible for rendering the progress indicator.&lt;/p&gt;
&lt;p&gt;We create a container which spans across the whole width with the progress bar &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;div&gt;&lt;/code&gt; inside. The width of the inner &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;div&gt;&lt;/code&gt; is the updated whenever the user scrolls (and when the page loads) to reflect the current scroll position.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/ProgressIndicator.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;progress-scroll-container&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;aria-hidden&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;progress-scroll&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scroll&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;updateProgressScroll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;updateProgressScroll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;updateProgressScroll&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progressScroll&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;progress-scroll&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;progressScroll&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scrollTop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scrollY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;documentElement&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scrollTop&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scrollHeight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;documentElement&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scrollHeight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;innerHeight&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scrollTop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scrollHeight&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;progressScroll&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;progress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;17 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt;(:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;data-has-hero&lt;/span&gt;&lt;span&gt;]),&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;data-has-sidebar&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;data-has-toc&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;progress-scroll-container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fixed&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-nav-height&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.25&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;background-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transparent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;z-index&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;progress-scroll&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;background-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-accent-high&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is:global&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;starlight__on-this-page--mobile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.25&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In the hidden lines is the styling which makes sure that the progress bar looks like a typical progress bar. It is also suited to Starlight because the bar is automatically hidden when the site has no sidebar and table of contents, but a hero element as most landing pages do.&lt;/p&gt;
&lt;p&gt;One thing to point out is what the global CSS (line 45) does: It pushes the mobile table of contents dropdown menu down to create more whitespace to the progress bar. This is a personal preference and you can remove it if you want.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;starlight-override&quot;&gt;Starlight Override&lt;/h2&gt;&lt;a href=&quot;#starlight-override&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Now we can use this component in a &lt;a href=&quot;https://starlight.astro.build/guides/overriding-components/&quot;&gt;Starlight override&lt;/a&gt;. In this case it makes sense to override the &lt;a href=&quot;https://starlight.astro.build/reference/overrides/#header-1&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Header.astro&lt;/code&gt; component&lt;/a&gt; like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Header.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/Header.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ScrollIndicator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./ScrollIndicator.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;ScrollIndicator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Do not forget to add this component override to your &lt;code dir=&quot;auto&quot;&gt;astro.config.mjs&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;My Docs with a Progress Indicator&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;components&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Override the default `Header` component.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Header&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./src/components/Header.astro&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;source-code&quot;&gt;Source Code&lt;/h2&gt;&lt;a href=&quot;#source-code&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can find the whole project code on &lt;a href=&quot;https://github.com/trueberryless/starlight-progress-indicator&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9919?v=4&quot; alt=&quot;GitHub&quot;&gt;GitHub&lt;/a&gt; and in &lt;a href=&quot;https://stackblitz.com/github/trueberryless/starlight-progress-indicator?file=src%2Fcomponents%2FProgressIndicator.astro&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/28635252?v=4&quot; alt=&quot;icon&quot;&gt;this Stackblitz example&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;a href=&quot;#conclusion&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;With this setup, the progress indicator will be displayed on every page (except landing pages) of your Starlight site. 🥳&lt;/p&gt;
&lt;p&gt;You can also check out &lt;a href=&quot;https://github.com/frostybee&quot;&gt;&lt;img src=&quot;https://github.com/frostybee.png&quot; alt=&quot;frostybee&quot;&gt;FrostyBee’s&lt;/a&gt; &lt;a href=&quot;https://github.com/frostybee/starlight-scroll-to-top&quot;&gt;&lt;img src=&quot;https://github.com/frostybee.png&quot; alt=&quot;frostybee&quot;&gt;Starlight Scroll To Top plugin&lt;/a&gt; which also supports a built in &lt;a href=&quot;https://frostybee.github.io/starlight-scroll-to-top/configuration/#showprogressring&quot;&gt;Progress Ring&lt;/a&gt; since version &lt;code dir=&quot;auto&quot;&gt;0.3.1&lt;/code&gt;. 🙌&lt;/p&gt;</content:encoded><category>Starlight</category><category>CSS</category><category>Education</category><category>Collaboration</category></item><item><title>How components open up endless possibilities</title><link>https://blog.trueberryless.org/blog/starlight-dropdown-and-list-together/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-dropdown-and-list-together/</guid><description>Combine two &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/withastro/starlight&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/starlight.png&amp;quot; alt=&amp;quot;Starlight&amp;quot; /&amp;gt;Starlight&amp;lt;/a&amp;gt; Sidebar Topics plugins to show a list of topics on desktop and a dropdown menu in the mobile sidebar.

</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Using the &lt;a href=&quot;https://github.com/hideoo/starlight-sidebar-topics&quot;&gt;&lt;img src=&quot;https://github.com/hideoo.png&quot; alt=&quot;hideoo&quot;&gt;Starlight Sidebar Topics&lt;/a&gt; plugin together with the &lt;a href=&quot;https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown&quot;&gt;&lt;img src=&quot;https://github.com/trueberryless-org.png&quot; alt=&quot;trueberryless-org&quot;&gt;Starlight Sidebar Topics Dropdown&lt;/a&gt; component, you can create a website that has a list of topics on desktop and a dropdown menu on mobile.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;&lt;a href=&quot;#prerequisites&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You will need to have an existing Starlight website.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;install-the-packages&quot;&gt;Install the packages&lt;/h2&gt;&lt;a href=&quot;#install-the-packages&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;First, install the &lt;code dir=&quot;auto&quot;&gt;starlight-sidebar-topics&lt;/code&gt; plugin and also the &lt;code dir=&quot;auto&quot;&gt;starlight-sidebar-topics-dropdown&lt;/code&gt; component:&lt;/p&gt;
&lt;starlight-tabs data-sync-key=&quot;pkg&quot;&gt; &lt;div&gt; &lt;ul role=&quot;tablist&quot;&gt; &lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-18&quot; id=&quot;tab-18&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt;  npm &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-19&quot; id=&quot;tab-19&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;  pnpm &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-20&quot; id=&quot;tab-20&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;  Yarn &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div id=&quot;tab-panel-18&quot; aria-labelledby=&quot;tab-18&quot; role=&quot;tabpanel&quot;&gt; &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics-dropdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-19&quot; aria-labelledby=&quot;tab-19&quot; role=&quot;tabpanel&quot; hidden&gt; &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics-dropdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-20&quot; aria-labelledby=&quot;tab-20&quot; role=&quot;tabpanel&quot; hidden&gt; &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight-sidebar-topics-dropdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt; &lt;/div&gt; &lt;starlight-tabs-restore&gt;&lt;/starlight-tabs-restore&gt; &lt;/starlight-tabs&gt;  
&lt;p&gt;Afterwards, follow the setup guides from &lt;a href=&quot;https://starlight-sidebar-topics.trueberryless.org/docs/getting-started/#installation&quot;&gt;Starlight Sidebar Topics&lt;/a&gt; and &lt;a href=&quot;https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation&quot;&gt;Starlight Sidebar Topics Dropdown&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;modify-the-sidebar-component&quot;&gt;Modify the Sidebar component&lt;/h2&gt;&lt;a href=&quot;#modify-the-sidebar-component&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In the setup guide from the dropdown component, you have created a sidebar component, which only renders the dropdown menu. Now, you need to modify this component to also render the default sidebar if the user is on desktop.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Sidebar.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight/components/Sidebar.astro&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;starlight-sidebar-topics/components/Sidebar.astro&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TopicsDropdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;starlight-sidebar-topics-dropdown/TopicsDropdown.astro&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;topics&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Topics&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;topics-dropdown&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;TopicsDropdown&lt;/span&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/* Hide topics by default and show them on medium screens and larger */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;min-width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;topics&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/* Show topics dropdown on small screens and hide it on medium screens and larger */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;topics-dropdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;min-width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;topics-dropdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;result&quot;&gt;Result&lt;/h2&gt;&lt;a href=&quot;#result&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you follow these steps, your sidebar will look like this:&lt;/p&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/dropdown-or-list.DYsLZ2G2_Z2uKXJi.webp&quot; alt=&quot;Final result with desktop view on the left and mobile view on the right&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;652&quot; height=&quot;352&quot;&gt;&lt;button aria-label=&quot;Zoom image: Final result with desktop view on the left and mobile view on the right&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;p&gt;You can find the complete source code of this guide in this &lt;a href=&quot;https://stackblitz.com/edit/withastro-starlight-qgraahmp?file=astro.config.mjs&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/28635252?v=4&quot; alt=&quot;icon&quot;&gt;StackBlitz example&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;endless-possibilities&quot;&gt;Endless possibilities&lt;/h2&gt;&lt;a href=&quot;#endless-possibilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You could also do it the other way around (list on mobile, dropdown on desktop) by swapping the &lt;code dir=&quot;auto&quot;&gt;display: block&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;display: none&lt;/code&gt; properties in the CSS.&lt;/p&gt;
&lt;p&gt;Moreover, you could also create your own display component, which uses the route data from the Starlight Sidebar Topics plugin and renders the topics in a custom way. This is a bit more advanced, but you can find more information about this in the &lt;a href=&quot;https://starlight-sidebar-topics.trueberryless.org/docs/guides/custom-topic-list/&quot;&gt;“Custom Topics List” documentation&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Starlight</category><category>Plugins</category><category>CSS</category><category>Education</category><category>Collaboration</category></item><item><title>A short history of Starlight Sidebar Topics plugins</title><link>https://blog.trueberryless.org/blog/starlight-topics-history-story/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-topics-history-story/</guid><description>In this post, I&apos;ll show you the evolution of &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/withastro/starlight&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/starlight.png&amp;quot; alt=&amp;quot;Starlight&amp;quot; /&amp;gt;Starlight&amp;lt;/a&amp;gt; plugins with a case study of the Starlight Sidebar Topics plugin. Be prepared to find out some impressive facts about people and code around Starlight.

</description><pubDate>Mon, 05 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Maybe you have heard about this cool documentation framework before. I talk about it quite often and use it regularly. Not only because I’m an active contributor, but also because &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; just grew to my heart. Its features: Simplicity and minimalism, but everything you need. Its performance: &lt;a href=&quot;https://www.websitecarbon.com/website/starlight-astro-build-getting-started/&quot;&gt;Faster than 98% of other websites out there&lt;/a&gt;. Its accessibility: Not even a question!&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-creation&quot;&gt;The Creation&lt;/h2&gt;&lt;a href=&quot;#the-creation&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;However, one thing that’s objectively missing in my opinion is a granular way of separating broad topics inside your documentation. And I’m not alone with this subjectively general accepted opinion. &lt;a href=&quot;https://github.com/HiDeoo&quot;&gt;&lt;img src=&quot;https://github.com/HiDeoo.png&quot; alt=&quot;HiDeoo&quot;&gt;HiDeoo&lt;/a&gt; is not only one of the most active maintainers of the project, but also the author of the most and imho best plugins you can find for Starlight. And they have also noticed this missing niche functionality about topics. That’s why they decided to create the &lt;a href=&quot;https://github.com/hideoo/starlight-sidebar-topics&quot;&gt;&lt;img src=&quot;https://github.com/hideoo.png&quot; alt=&quot;hideoo&quot;&gt;Starlight Sidebar Topics&lt;/a&gt; plugin early on, back in October 2024, which allows you to make a sidebar with topics. Read more about the plugin’s functionalities in &lt;a href=&quot;https://starlight-sidebar-topics.trueberryless.org/&quot;&gt;its documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The one thing that bothered me personally in the early days of the plugin was the way topics were displayed in the sidebar. Because it doesn’t - like I imagined a solution could look like - use some kind of dropdown menu for switching between topics, but instead always shows all topics. This design choice was, as &lt;a href=&quot;https://github.com/HiDeoo/starlight-sidebar-topics/issues/2#issuecomment-2410196392&quot;&gt;HiDeoo clearly points out&lt;/a&gt;, very intentional and not without any reason: All topics should be visible at once. Proven by the &lt;a href=&quot;https://github.com/withastro&quot;&gt;&lt;img src=&quot;https://github.com/withastro.png&quot; alt=&quot;withastro&quot;&gt;Astro&lt;/a&gt; docs themselves (&lt;a href=&quot;https://github.com/delucis&quot;&gt;&lt;img src=&quot;https://github.com/delucis.png&quot; alt=&quot;delucis&quot;&gt;Chris Swithinbank&lt;/a&gt; implemented the &lt;a href=&quot;https://github.com/withastro/docs/pull/9890&quot;&gt;“tabbed sidebar”&lt;/a&gt; for the Astro v5 docs later in the same month), this approach definitely has many benefits over a dropdown menu. Nonetheless, I was still unsatisfied by this design, and so I created my own version.&lt;/p&gt;
&lt;p&gt;Copying and pasting was my strength when it came to building a new Starlight plugin for the community. And so, I did just that. I took the Starlight Sidebar Topics plugin as a starting point and just had to adapt the &lt;code dir=&quot;auto&quot;&gt;Topics.astro&lt;/code&gt; component, which includes the HTML for rendering the topics in the sidebar. After struggling for some time with the implementation of a satisfying enough dropdown menu, which was pure HTML + CSS but also clean to look at (sorry for the self-praise, I’m just proud of myself), I finally found a solution that I’m very satisfied with and released this new plugin under the name &lt;a href=&quot;https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown&quot;&gt;&lt;img src=&quot;https://github.com/trueberryless-org.png&quot; alt=&quot;trueberryless-org&quot;&gt;Starlight Sidebar Topics Dropdown&lt;/a&gt; - how original.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-adaptation&quot;&gt;The Adaptation&lt;/h2&gt;&lt;a href=&quot;#the-adaptation&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You might think that this story is now over because everyone could just use the variant they want, everyone is happy. But Starlight kept and keeps improving and around three months later, on the 15th of February, coming almost as a &lt;a href=&quot;https://blog.trueberryless.org/blog/20th-birthday/&quot;&gt;birthday present&lt;/a&gt; for me, was the long-awaited addition of route data in Starlight with the release of &lt;a href=&quot;https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0&quot;&gt;v0.32&lt;/a&gt;. This seemingly small addition opened up so many possibilities, which I myself never saw coming. HiDeoo once again was the leading inspiration for plugin authors and pushed this new functionality to its limits. It took them just two days to &lt;a href=&quot;https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b&quot;&gt;adapt over 11 plugins to the latest Starlight version back then&lt;/a&gt; and they later improved and refactored much of the code to make even more use of this powerful feature.&lt;/p&gt;
&lt;p&gt;And so comes the day when HiDeoo contacts me to tell me that the Starlight Sidebar Topics plugin now uses Starlight’s new route data feature. At first, I didn’t quite understand what benefits these implementation changes would have, but then HiDeoo took the time to explain to me that I could now turn the Starlight Sidebar Topics Dropdown plugin into a simple component which uses the route data from his plugin. Intuitively, I was opposed to this smart idea because it felt like my only plugin that made some popularity was turned into some useless component. I couldn’t have been further from the truth.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;the-union&quot;&gt;The Union&lt;/h2&gt;&lt;a href=&quot;#the-union&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Eventually, I decided to refactor my plugin into a component - this refactoring casually eliminated exactly &lt;a href=&quot;https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/pull/40&quot;&gt;1210 lines of code and added 68 lines of changelog&lt;/a&gt; - and I noticed, how little code it now took to turn the &lt;code dir=&quot;auto&quot;&gt;Topics.astro&lt;/code&gt; list into a dropdown from a user’s perspective. I was confident that this really was the right direction for the &lt;del&gt;plugin&lt;/del&gt; component. And so I updated the whole documentation - more like: deleted more than 200 lines of text (feels good) - and released the new &lt;a href=&quot;https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/releases/tag/starlight-sidebar-topics-dropdown%400.5.0&quot;&gt;version 0.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now you might wonder how such mature plugins could still improve over time. To be honest, I myself was very surprised when HiDeoo casually dropped a bomb in my Discord DMs. His idea was and still is ingenious. Otherwise, I wouldn’t even think about this &lt;em&gt;topic&lt;/em&gt; anymore. But here I am, writing a whopping 800 words just to prepare you for what’s to come. Drum roll please! Fasten your seatbelt! This statement from HiDeoo is going to blow your mind:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“One could have something like the default built-in list on a desktop view, and on mobile use your component, or something like that 🧠” — HiDeoo, 21/03/2025 09:54&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Profound. Timeless. Golden.&lt;/p&gt;
&lt;p&gt;And that single, beautiful spark of an idea? It’s precisely what I’ll guide you through in &lt;a href=&quot;https://blog.trueberryless.org/blog/starlight-dropdown-and-list-together/&quot;&gt;the post “Starlight Topics Dropdown and List together”&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Starlight</category><category>Plugins</category></item><item><title>How to make your Starlight sidebar items look better</title><link>https://blog.trueberryless.org/blog/starlight-sidebar-whitespace/</link><guid isPermaLink="true">https://blog.trueberryless.org/blog/starlight-sidebar-whitespace/</guid><description>In this blog post, we&apos;ll take a look at how small changes can make a big difference when it comes to whitespaces in your &amp;lt;a class=&amp;quot;gh-badge&amp;quot; href=&amp;quot;https://github.com/withastro/starlight&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/starlight.png&amp;quot; alt=&amp;quot;Starlight&amp;quot; /&amp;gt;Starlight&amp;lt;/a&amp;gt; sidebar.

</description><pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever wondered why your &lt;a href=&quot;https://starlight.astro.build&quot;&gt;&lt;img src=&quot;https://blog.trueberryless.org/starlight.png&quot; alt=&quot;icon&quot;&gt;Starlight&lt;/a&gt; sidebar doesn’t look that appealing? Did you know how important the space between items in your sidebar unconsciously is? The font size, the weight and little colour differences? In this guide, we’ll take a look at how you can customize the appearance of your Starlight sidebar with some quick and easy steps.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;&lt;a href=&quot;#prerequisites&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;First, you need to &lt;a href=&quot;https://starlight.astro.build/getting-started/&quot;&gt;set up your Starlight site&lt;/a&gt;. Afterward, Starlight offers a &lt;a href=&quot;https://starlight.astro.build/guides/css-and-tailwind/&quot;&gt;guide on customizing styles applied to your Starlight site&lt;/a&gt;, which is the feature we’ll use in today’s post.&lt;/p&gt;
&lt;p&gt;As described in &lt;a href=&quot;https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles&quot;&gt;this guide&lt;/a&gt;, you need to create a &lt;code dir=&quot;auto&quot;&gt;.css&lt;/code&gt; file somewhere inside your &lt;code dir=&quot;auto&quot;&gt;src/&lt;/code&gt; directory, where you can define your CSS styles. Don’t forget to add the path to this &lt;code dir=&quot;auto&quot;&gt;.css&lt;/code&gt; file to Starlight’s &lt;code dir=&quot;auto&quot;&gt;customCss&lt;/code&gt; array in &lt;code dir=&quot;auto&quot;&gt;astro.config.mjs&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/starlight&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;starlight&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Docs With Custom CSS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;customCss&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Relative path to your custom CSS file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./src/styles/custom.css&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After completing these preparation steps, you are ready to try out some nice adjustments to Starlight’s sidebar design.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;customizations&quot;&gt;Customizations&lt;/h2&gt;&lt;a href=&quot;#customizations&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;There are endless different possibilities that you can play around with just with your custom CSS. I will give you some ideas that I found very helpful while playing around with the sidebar design myself. While some of these ideas might look silly to you, I promise that the combination of a few of them will make your Starlight sidebar look even better.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;One thing to note though is that in this blog post the focus lies on adjusting the styling of &lt;strong&gt;root-level items&lt;/strong&gt; (the ones without children) in the sidebar.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;But before I do that, I’ll show you how the default styling of the Starlight sidebar currently looks like:&lt;/p&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/no-css.BheXcBy6_1cElJs.webp&quot; alt=&quot;Default styling of the Starlight sidebar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;340&quot;&gt;&lt;button aria-label=&quot;Zoom image: Default styling of the Starlight sidebar&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;manipulate-the-whitespaces-between-sidebar-items&quot;&gt;Manipulate the whitespaces between sidebar items&lt;/h3&gt;&lt;a href=&quot;#manipulate-the-whitespaces-between-sidebar-items&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;On the root level of your Starlight sidebar, there are two different types of elements: &lt;strong&gt;pages&lt;/strong&gt; and &lt;strong&gt;groups&lt;/strong&gt;. While the default styling is pretty decent, I found the whitespaces - this is the margin between items which itself doesn’t include any content - to be a bit too large, especially between root-level items. With this example of custom CSS down below, I made the margin between root-level items smaller while keeping the margin between groups the same. The important CSS styling is highlighted in the code block.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;(:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;details&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;details&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin-block&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* default value */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/whitespaces.B5rD_oGG_IaHz2.webp&quot; alt=&quot;Starlight sidebar where the margin between root-level items is smaller&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;340&quot;&gt;&lt;button aria-label=&quot;Zoom image: Starlight sidebar where the margin between root-level items is smaller&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;p&gt;Perhaps, this will not be as useful to you because you don’t use root-level pages in your sidebar, so this effect won’t be noticeable to you. But if you do, give this a try.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;adjust-the-font-weight-of-sidebar-items&quot;&gt;Adjust the font weight of sidebar items&lt;/h3&gt;&lt;a href=&quot;#adjust-the-font-weight-of-sidebar-items&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wiktionary.org/wiki/IMHO&quot;&gt;Imho&lt;/a&gt; the one thing that triggers me the most about Starlight’s root-level items in the sidebar, is their boldness. This is probably a very opinionated take, but if you ask me, one single page can’t possibly be as important as an entire group of pages in your documentation. Therefore, I made the font weight of root-level items thinner as you can see in the code block below.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;aria-current&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* default value */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;aria-current&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/font-weight.DXeioWi4_CFf4m.webp&quot; alt=&quot;Starlight sidebar with lighter font weight&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;340&quot;&gt;&lt;button aria-label=&quot;Zoom image: Starlight sidebar with lighter font weight&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;adjust-the-colour-of-sidebar-items&quot;&gt;Adjust the colour of sidebar items&lt;/h3&gt;&lt;a href=&quot;#adjust-the-colour-of-sidebar-items&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A small but subtle change: I made unselected root-level items appear dimmer in the code block below.&lt;/p&gt;
&lt;p&gt;If you choose to use this design as well, I recommend that you only apply the second CSS manipulation since the first one is just for demonstrating how you could adjust the styling of selected root-level items – this rule also applies to the other code blocks in this blog if they are marked as &lt;code dir=&quot;auto&quot;&gt;default value&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;aria-current&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-text-invert&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* default value */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;aria-current&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-gray-2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/color.CAcqETbU_1BJfso.webp&quot; alt=&quot;Starlight sidebar with dimmer colors&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;340&quot;&gt;&lt;button aria-label=&quot;Zoom image: Starlight sidebar with dimmer colors&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h3 id=&quot;adjust-the-font-size-of-sidebar-items&quot;&gt;Adjust the font size of sidebar items&lt;/h3&gt;&lt;a href=&quot;#adjust-the-font-size-of-sidebar-items&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Although I don’t recommend it, you can also adjust the font size of sidebar items. With this example of custom CSS down below, I made the font size of root-level items smaller.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-text-sm&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;starlight-image-zoom-zoomable&gt;&lt;img src=&quot;https://blog.trueberryless.org/_astro/font-size.D4S-3Bx3_12guWB.webp&quot; alt=&quot;Starlight sidebar with smaller font size&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;340&quot;&gt;&lt;button aria-label=&quot;Zoom image: Starlight sidebar with smaller font size&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#starlight-image-zoom-icon-zoom&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/starlight-image-zoom-zoomable&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot;&gt;&lt;h2 id=&quot;recommendations&quot;&gt;Recommendations&lt;/h2&gt;&lt;a href=&quot;#recommendations&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.02.02c.55.1.9.62.8 1.16l-.95 5.19h4.91L16.81.82a1 1 0 1 1 1.96.36l-.95 5.19H23a1 1 0 1 1 0 2h-5.55l-1.34 7.26h5.15a1 1 0 1 1 0 2h-5.52l-1.02 5.55a1 1 0 0 1-1.97-.36l.96-5.19H8.8l-1.03 5.55a1 1 0 1 1-1.96-.36l.95-5.19H1a1 1 0 0 1 0-2h6.13l1.34-7.26H3.32a1 1 0 0 1 0-2h5.52L9.86.82a1 1 0 0 1 1.16-.8Zm-.52 8.35-1.34 7.26h4.92l1.33-7.26h-4.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Summing everything up, I recommend that you apply some mix of the above customization options, which you can conveniently see in a single &lt;code dir=&quot;auto&quot;&gt;.css&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Note that I also use &lt;a href=&quot;https://starlight.astro.build/guides/css-and-tailwind/#cascade-layers&quot;&gt;Cascade Layers&lt;/a&gt;, supported since &lt;a href=&quot;https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.34.0&quot;&gt;Starlight 0.34.0&lt;/a&gt;, and recommend using them to specify the order in which CSS styles are applied.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/styles/custom.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span&gt; starlight, my-starlight-sidebar&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;layer&lt;/span&gt;&lt;span&gt; my-starlight-sidebar &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;(:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;details&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;margin-block&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sl-sidebar-state-persist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top-level&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;aria-current&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;--sl-color-gray-2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;</content:encoded><category>Starlight</category><category>CSS</category><category>Education</category></item></channel></rss>