Skip to content

In Defense of the Em Dash โ€” A Beautiful Line of Thought โœ๏ธ

Lately, Iโ€™ve noticed something strange happening in online discussions: the humble em dash (โ€”) is getting side-eyed as a telltale sign that a text was written with a so-called โ€œAI.โ€ I prefer the more accurate term: LLM (Large Language Model), because โ€œartificial intelligenceโ€ is a bit of a stretch โ€” weโ€™re really just dealing with very complicated statistics ๐Ÿค–๐Ÿ“Š.

Now, I get it โ€” people are on high alert, trying to spot generated content. But Iโ€™d like to take a moment to defend this elegant punctuation mark, because I use it often โ€” and deliberately. Not because a machine told me to, but because it helps me think ๐Ÿง .

A Typographic Tool, Not a Trend ๐Ÿ–‹๏ธ

The em dash has been around for a long time โ€” longer than most people realize. The oldest printed examples Iโ€™ve found are in early 17th-century editions of Shakespeareโ€™s plays, published by the printer Okes in the 1620s. Thatโ€™s not just a random dash on a page โ€” thatโ€™s four hundred years of literary service ๐Ÿ“œ. If Shakespeareโ€™s typesetters were using em dashes before indoor plumbing was common, I think itโ€™s safe to say theyโ€™re not a 21st-century LLM quirk.

The Tragedy of Othello, the Moor of Venice, with long dashes (typeset here with 3 dashes)

A Dash for Thoughts ๐Ÿ’ญ

In Dutch, the em dash is called a gedachtestreepje โ€” literally, a thought dash. And honestly? I think thatโ€™s beautiful. It captures exactly what the em dash does: it opens a little mental window in your sentence. It lets you slip in a side note, a clarification, an emotion, or even a complete detour โ€” just like a sudden thought that needs to be spoken before it disappears. For someone like me, who often thinks in tangents, itโ€™s the perfect punctuation.

Why I Use the Em Dash (And Other Punctuation Marks)

Iโ€™m autistic, and that means a few things for how I write. I tend to overshare and infodump โ€” not to dominate the conversation, but to make sure everything is clear. I donโ€™t like ambiguity. I donโ€™t want anyone to walk away confused. So I reach for whatever punctuation tools help me shape my thoughts as precisely as possible:

  • Colons help me present information in a tidy list โ€” like this one.
  • Brackets let me add little clarifications (without disrupting the main sentence).
  • And em dashes โ€” ah, the em dash โ€” they let me open a window mid-sentence to give you extra context, a bit of tone, or a change in pace.

Theyโ€™re not random. Theyโ€™re intentional. They reflect how my brain works โ€” and how I try to bridge the gap between thoughts and words ๐ŸŒ‰.

Itโ€™s Not Just a Line โ€” Itโ€™s a Rhythm ๐ŸŽต

Thereโ€™s also something typographically beautiful about the em dash. Itโ€™s not a hyphen (-), and itโ€™s not a middling en dash (โ€“). Itโ€™s long and confident. It creates space for your eyes and your thoughts. Used well, it gives writing a rhythm that mimics natural speech, especially the kind of speech where someone is passionate about a topic and wants to take you on a detour โ€” just for a moment โ€” before coming back to the main road ๐Ÿ›ค๏ธ.

Iโ€™m that someone.

Donโ€™t Let the Bots Scare You

Yes, LLMs tend to use em dashes. So do thoughtful human beings. Letโ€™s not throw centuries of stylistic nuance out the window because a few bots learned how to mimic good writing. Instead of scanning for suspicious punctuation, maybe we should pay more attention to whatโ€™s being said โ€” and how intentionally ๐Ÿ’ฌ.

So if you see an em dash in my writing, donโ€™t assume it came from a machine. It came from me โ€” my mind, my style, my history with language. And Iโ€™m not going to stop using it just because an algorithm picked up the habit ๐Ÿ’›.

Help ons zoeken: drie mensen op zoek naar een warm huis in Gent

Soms zit het mee, soms nรฉt niet. Het herenhuis waar we helemaal verliefd op waren, is helaas aan iemand anders verhuurd. Jammer, maar we blijven niet bij de pakken zitten. We zoeken verder โ€” en hopelijk kan jij ons daarbij helpen!

Wij zijn drie mensen die samen een huis willen delen in Gent. We vormen een warme, bewuste en respectvolle woongroep, en we dromen van een plek waar we rust, verbinding en creativiteit kunnen combineren.

Wie zijn wij?

๐Ÿ‘ค Amedee (48): ITโ€™er, balfolkdanser, amateurmuzikant, houdt van gezelschapsspelletjes en wandelen, auti en sociaal geรซngageerd
๐Ÿ‘ฉ Chloรซ (bijna 52): Kunstenares, ex-Waldorfleerkracht en permacultuurontwerpster, houdt van creativiteit, koken en natuur
๐ŸŽจ Kathleen (54): Doodle-artiest met sociaal-culturele achtergrond, houdt van gezelligheid, buiten zijn en schrijft graag

We willen samen een huis vormen waar communicatie, zorgzaamheid en vrijheid centraal staan. Een plek waar je je thuis voelt, en waar ruimte is voor kleine activiteiten zoals een spelavond, een workshop, een creatieve sessie of gewoon rustig samen zijn.

Wat zoeken we?

๐Ÿก Een huis (gรฉรฉn appartement) in Gent, op max. 15 minuten fietsen van station Gent-Sint-Pieters
๐ŸŒฟ Energiezuinig: EPC B of beter
๐Ÿ› Minstens 3 ruime slaapkamers van ยฑ20mยฒ
๐Ÿ’ถ Huurprijs:

  • tot โ‚ฌ1650/maand voor 3 slaapkamers
  • tot โ‚ฌ2200/maand voor 4 slaapkamers

Extra ruimtes zoals een zolder, logeerkamer, atelier, bureau of hobbyruimte zijn heel welkom. We houden van luchtige, multifunctionele plekken die mee kunnen groeien met onze noden.

๐Ÿ“… Beschikbaar: vanaf nu, ten laatste oktober

๐Ÿ’ฌ Heeft het huis 4 slaapkamers? Dan verwelkomen we graag een vierde huisgenoot die onze waarden deelt. Maar meer dan 4 bewoners willen we bewust vermijden โ€” kleinschalig wonen werkt voor ons het best.

Ken jij iets? Laat van je horen!

Ken je een huis dat past in dit plaatje?
We staan open voor tips via immokantoren, vrienden, buren, collegaโ€™s of andere netwerken โ€” alles helpt!

๐Ÿ“ฉ Contact: amedee@vangasse.eu

Dankjewel om mee uit te kijken โ€” en delen mag altijd ๐Ÿ’œ

Samenwonen in Gent? Wij starten een nieuwe cohousing en zoeken nog iemand!

Heb jij altijd al willen samenwonen met fijne mensen in een warme, open en respectvolle sfeer? Dan is dit misschien wel iets voor jou.

Samen met twee vrienden ben ik een nieuwe cohousing aan het opstarten in Gent. We hebben een prachtig gerenoveerd herenhuis op het oog, en we zijn op zoek naar een vierde persoon om het huis mee te delen.

Het huis

Het gaat om een ruim en karaktervol herenhuis met energielabel B+. Het beschikt over:

Vier volwaardige slaapkamers van elk 18 ร  20 mยฒ

Eรฉn extra kamer die we kunnen inrichten als logeerkamer, bureau of hobbyruimte

Twee badkamers

Twee keukens

Een zolder met stevige balken โ€” de creatieve ideeรซn borrelen al op!


De ligging is uitstekend: aan de Koning Albertlaan, op amper 5 minuten fietsen van station Gent-Sint-Pieters en 7 minuten van de Korenmarkt. De huurprijs is โ‚ฌ2200 in totaal, wat neerkomt op โ‚ฌ550 per persoon bij vier bewoners.

Het huis is al beschikbaar vanaf 1 juli 2025.

Wie zoeken we?

We zoeken iemand die zich herkent in een aantal gedeelde waarden en graag deel uitmaakt van een respectvolle, open en bewuste leefomgeving. Concreet betekent dat voor ons:

Je staat open voor diversiteit in al haar vormen

Je bent respectvol, communicatief en houdt rekening met anderen

Je hebt voeling met themaโ€™s zoals inclusie, mentale gezondheid, en samenleven met aandacht voor elkaar

Je hebt een rustig karakter en draagt graag bij aan een veilige, harmonieuze sfeer in huis

Leeftijd is niet doorslaggevend, maar omdat we zelf allemaal 40+ zijn, zoeken we eerder iemand die zich in die levensfase herkent


Iets voor jou?

Voel je een klik met dit verhaal? Of heb je vragen en wil je ons beter leren kennen? Aarzel dan niet om contact op te nemen via amedee@vangasse.eu.

Is dit niets voor jou, maar ken je iemand die perfect zou passen in dit plaatje? Deel dan zeker deze oproep โ€” dank je wel!

Samen kunnen we van dit huis een warme thuis maken.

๐Ÿ“ฐ Featured by Sibelga and Passwerk: When Being Different Becomes a Strength

I am excited to share some wonderful newsโ€”Sibelga and Passwerk have recently published a testimonial about my work, and it has been shared across LinkedIn, Sibelga’s website, and even on YouTube!


What Is This All About?

Passwerk is an organisation that matches talented individuals on the autism spectrum with roles in IT and software testing, creating opportunities based on strengths and precision. I have been working with them as a consultant, currently placed at Sibelga, Brussels’ electricity and gas distribution network operator.

The article and video highlight how being โ€œdifferentโ€ does not have to be a limitationโ€”in fact, it can be a real asset in the right context. It means a lot to me to be seen and appreciated for who I am and the quality of my work.


Why This Matters

For many neurodivergent people, the professional world can be full of challenges that go beyond the work itself. Finding the right environmentโ€”one that values accuracy, focus, and dedicationโ€”can be transformative.

I am proud to be part of a story that shows what is possible when companies look beyond stereotypes and embrace neurodiversity as a strength.


Thank you to Sibelga, Passwerk, and everyone who contributed to this recognition. It is an honour to be featured, and I hope this story inspires more organisations to open up to diverse talents.

๐Ÿ‘‰ Want to know more? Check out the article or watch the video!

๐Ÿš— French Road Trip to Balilas: From Ghent to Janzรฉ with Strangers Turned Friends

A few weeks ago, I set off for Balilas, a balfolk festival in Janzรฉ (near Rennes), Brittany (France). I had never been before, but as long as you have dance shoes, a tent, and good company, what more do you need?

Bananas for scale

From Ghent to Brittanyโ€ฆ with Two Dutch Strangers

My journey began in Ghent, where I was picked up by Sterre and Michelle, two dancers from the Netherlands. I did not know them too well beforehand, but in the balfolk world, that is hardly unusual โ€” de balfolkcommunity is รฉรฉn grote familie โ€” one big family.

We took turns driving, chatting, laughing, and singing along. Google Maps logged our total drive time at 7 hours and 39 minutes.

Google knows everything
Pรฉage – one of the many

Along the way, we had the perfect soundtrack:
๐ŸŽถ French Road Trip ๐Ÿ‡ซ๐Ÿ‡ท๐Ÿฅ– โ€” 7 hours and 49 minutes of French and Francophone tubes.

https://open.spotify.com/playlist/3jRMHCl6qVmVIqXrASAAmZ?si=746a7f78ca30488a

๐Ÿ• A Tasty Stop in Prรฉ-en-Pail-Saint-Samson

Somewhere around dinner time, we stopped at La Sosta, a cozy Italian restaurant in Prรฉ-en-Pail-Saint-Samson (2300 inhabitants). I had a pizza normande โ€” base tomate, andouille, pomme, mozzarella, crรจme, persil . A delicious and unexpected regional twist โ€” definitely worth remembering!

pizza normande

The pizzas wereexcellent, but also generously sized โ€” too big to finish in one sitting. Heureusement, ils nous ont proposรฉ dโ€™emballer le reste ร  emporter. That was a nice touch โ€” and much appreciated after a long day on the road.

Just to much to eat it all

โ›บ Arrival Just Before Dark

We arrived at the Balilas festival site five minutes after sunset, with just enough light left to set up our tents before nightfall. Trugarez dโ€™an heol โ€” thank you, sun, for holding out a little longer.

There were two other cars filled with people coming from the Netherlands, but they had booked a B&B. We chose to camp on-site to soak in the full festival atmosphere.

Enjoy the view!
Banana pancakes!

Balilas itself was magical: days and nights filled with live music, joyful dancing, friendly faces, and the kind of warm atmosphere that defines balfolk festivals.

Photo: Poppy Lens

More info and photos:
๐ŸŒ balilas.lesviesdansent.bzh
๐Ÿ“ธ @balilas.balfolk on Instagram


Balfolk is more than just dancing. It is about trust, openness, and sharing small adventures with people you barely knowโ€”who somehow feel like old friends by the end of the journey.

Tot de volgende โ€” ร  la prochaine โ€” betek ar blez a zeu!
๐Ÿ•บ๐Ÿ’ƒ

Thank you Maรฏ for proofreading the Breton expressions. โค๏ธ

๐ŸŽฅ Automating Git Repository Visualizations with GitHub Actions and Gource

In the world of DevOps and continuous integration, automation is essential. One fascinating way to visualize the evolution of a codebase is with Gource, a tool that creates animated tree diagrams of project histories.

Recently, I implemented a GitHub Actions workflow in my ansible-servers repository to automatically generate and deploy Gource visualizations. In this post, I will walk you through how the workflow is set up and what it does.

But first, let us take a quick look backโ€ฆ


๐Ÿ•ฐ๏ธ Back in 2013: Visualizing Repos with Bash and XVFB

More than a decade ago, I published a blog post about Gource (in Dutch) where I described a manual workflow using Bash scripts. At that time, I ran Gource headlessly using xvfb-run, piped its output through pv, and passed it to ffmpeg to create a video.

It looked something like this:

#!/bin/bash -ex
 
xvfb-run -a -s "-screen 0 1280x720x24" \
  gource \
    --seconds-per-day 1 \
    --auto-skip-seconds 1 \
    --file-idle-time 0 \
    --max-file-lag 1 \
    --key -1280x720 \
    -r 30 \
    -o - \
  | pv -cW \
  | ffmpeg \
    -loglevel warning \
    -y \
    -b:v 3000K \
    -r 30 \
    -f image2pipe \
    -vcodec ppm \
    -i - \
    -vcodec libx264 \
    -preset ultrafast \
    -pix_fmt yuv420p \
    -crf 1 \
    -threads 0 \
    -bf 0 \
    ../gource.mp4

This setup worked well for its time and could even be automated via cron or a Git hook. However, it required a graphical environment workaround and quite a bit of shell-fu.


๐Ÿงฌ From Shell Scripts to GitHub Actions

Fast forward to today, and things are much more elegant. The modern Gource workflow lives in .github/workflows/gource.yml and is:

  • ๐Ÿ” Reusable through workflow_call
  • ๐Ÿ”˜ Manually triggerable via workflow_dispatch
  • ๐Ÿ“ฆ Integrated into a larger CI/CD pipeline (pipeline.yml)
  • โ˜๏ธ Cloud-native, with video output stored on S3

Instead of bash scripts and virtual framebuffers, I now use a well-structured GitHub Actions workflow with clear job separation, artifact management, and summary reporting.


๐Ÿš€ What the New Workflow Does

The GitHub Actions workflow handles everything automatically:

  1. โฑ๏ธ Decides if a new Gource video should be generated, based on time since the last successful run.
  2. ๐Ÿ“ฝ๏ธ Generates a Gource animation and a looping thumbnail GIF.
  3. โ˜๏ธ Uploads the files to an AWS S3 bucket.
  4. ๐Ÿ“ Posts a clean summary with links, preview, and commit info.

It supports two triggers:

  • workflow_dispatch (manual run from the GitHub UI)
  • workflow_call (invoked from other workflows like pipeline.yml)

You can specify how frequently it should run with the skip_interval_hours input (default is every 24 hours).


๐Ÿ” Smart Checks Before Running

To avoid unnecessary work, the workflow first checks:

  • If the workflow file itself was changed.
  • When the last successful run occurred.
  • Whether the defined interval has passed.

Only if those conditions are met does it proceed to the generation step.


๐Ÿ› ๏ธ Building the Visualization

๐Ÿงพ Step-by-step:

  1. Checkout the Repo
    Uses actions/checkout with fetch-depth: 0 to ensure full commit history.
  2. Generate Gource Video
    Uses nbprojekt/gource-action with configuration for avatars, title, and resolution.
  3. Install FFmpeg
    Uses AnimMouse/setup-ffmpeg to enable video and image processing.
  4. Create a Thumbnail
    Extracts preview frames and assembles a looping GIF for visual summaries.
  5. Upload Artifacts
    Uses actions/upload-artifact to store files for downstream use.

โ˜๏ธ Uploading to AWS S3

In a second job:

  • AWS credentials are securely configured via aws-actions/configure-aws-credentials.
  • Files are uploaded using a commit-specific path.
  • Symlinks (gource-latest.mp4, gource-latest.gif) are updated to always point to the latest version.

๐Ÿ“„ A Clean Summary for Humans

At the end, a GitHub Actions summary is generated, which includes:

  • A thumbnail preview
  • A direct link to the full video
  • Video file size
  • Commit metadata

This gives collaborators a quick overview, right in the Actions tab.


๐Ÿ” Why This Matters

Compared to the 2013 setup:

2013 Bash Script2025 GitHub Actions Workflow
Manual setup via shellFully automated in CI/CD
Local onlyCloud-native with AWS S3
Xvfb workaround requiredHeadless and clean execution
Script needs maintenanceModular, reusable, and versioned
No summariesMarkdown summary with links and preview

Automation has come a long way โ€” and this workflow is a testament to that progress.


โœ… Final Thoughts

This Gource workflow is now a seamless part of my GitHub pipeline. It generates beautiful animations, hosts them reliably, and presents the results with minimal fuss. Whether triggered manually or automatically from a central workflow, it helps tell the story of a repository in a way that is both informative and visually engaging. ๐Ÿ“Šโœจ

Would you like help setting this up in your own project? Let me know โ€” I am happy to share.

๐ŸŽป Spring Tunes: Three Inspiring Music Courses I Attended This Season

This spring was filled with music, learning, and connection. I had the opportunity to participate in three wonderful music courses, each offering something uniqueโ€”new styles, deeper technique, and a strong sense of community. Here is a look back at these inspiring experiences.


๐ŸŽถ 1. Fiddlers on the Move โ€“ Ghent (5โ€“9 March)

Photo: Filip Verpoest

In early March, I joined Fiddlers on the Move in Ghent, a five-day course packed with workshops led by musicians from all over the world. Although I play the nyckelharpa, I deliberately chose workshops that were not nyckelharpa-specific. This gave me the challenge and joy of translating techniques from other string traditions to my instrument.

Here is a glimpse of the week:

  • Wednesday: Fiddle singing with Laura Cortese โ€“ singing while playing was new for me, and surprisingly fun.
  • Thursday: Klezmer violin / Fiddlers down the roof with Amit Weisberger โ€“ beautiful melodies and ornamentation with plenty of character.
  • Friday: Arabic music with Layth Sidiq โ€“ an introduction to maqams and rhythmic patterns that stretched my ears in the best way.
  • Saturday: Swedish violin jamsession classics with Mia Marine โ€“ a familiar style, but always a joy with Miaโ€™s energy and musicality.
  • Sunday: Live looping strings with Joris Vanvinckenroye โ€“ playful creativity with loops, layering, and rhythm.

Each day brought something different, and I came home with a head full of ideas and melodies to explore further.


๐Ÿช— 2. Workshopweekend Stichting Draailier & Doedelzak โ€“ Sint-Michielsgestel, NL (18โ€“21 April)

Photo: Arne de Laat

In mid-April, I traveled to Sint-Michielsgestel in the Netherlands for the annual Workshopweekend organized by Stichting Draailier & Doedelzak. This year marked the foundationโ€™s 40th anniversary, and the event was extended to four days, from Friday evening to Monday afternoon, at the beautiful location of De Zonnewende.

I joined the nyckelharpa workshop with Rasmus Brinck. One of the central themes we explored was the connection between playing and dancing polskaโ€”a topic close to my heart. I consider myself a dancer first and a musician second, so it was especially meaningful to deepen the musical understanding of how movement and melody shape one another.

The weekend offered a rich variety of other workshops as well, including hurdy-gurdy, bagpipes, diatonic accordion, singing, and ensemble playing. As always, the atmosphere was warm and welcoming. With structured workshops during the day and informal jam sessions, concerts, and bals in the evenings, it was a perfect blend of learning and celebration.


๐Ÿ‡ธ๐Ÿ‡ช 3. Swedish Music for Strings โ€“ Ronse (2โ€“4 May)

At the beginning of May, I took part in a three-day course in Ronse dedicated to Swedish string music. Although we could arrive on 1 May, teaching started the next day. The course was led by David Eriksson and organized by Amate Galli. About 20 musicians participatedโ€”two violinists, one cellist, and the rest of us on nyckelharpa.

The focus was on capturing the subtle groove and phrasing that make Swedish folk music so distinctive. It was a joy to be surrounded by such a rich soundscape and to play in harmony with others who share the same passion. The music stayed with me long after the course ended.


โœจ Final Thoughts

Each of these courses gave me something different: new musical perspectives, renewed technical focus, and most importantly, the joy of making music with others. I am deeply grateful to all the teachers, organizers, and fellow participants who made these experiences so rewarding. I am already looking forward to the next musical adventure!

๐Ÿ“š Automating Ansible Role Documentation with GitHub Actions and AI

Maintaining documentation for Ansible roles can be a tedious and easily neglected task. As roles evolve, variable names change, and new tasks are added, it is easy for the README.md files to fall out of sync. To prevent this and keep documentation continuously up to date, I wrote a GitHub Actions workflow that automatically generates and formats documentation for all Ansible roles in my repository. Even better: it writes its own commit messages using AI.

Let me walk you through why I created this workflow, how it works, and what problems it solves.


๐Ÿค” Why Automate Role Documentation?

Ansible roles are modular, reusable components. Good roles include well-structured documentationโ€”at the very least, variable descriptions, usage examples, and explanations of defaults.

However, writing documentation manually introduces several problems:

  • Inconsistency: Humans forget things. Updates to a role do not always get mirrored in its documentation.
  • Wasted time: Writing boilerplate documentation by hand is inefficient.
  • Error-prone: Manually copying variable names and descriptions invites typos and outdated content.

Enter ansible-doctor: a tool that analyzes roles and generates structured documentation automatically. Once I had that, it made perfect sense to automate its execution using GitHub Actions.


โš™๏ธ How the Workflow Works

Here is the high-level overview of what the workflow does:

  1. Triggers:
    • It can be run manually via workflow_dispatch.
    • It is also designed to be reusable in other workflows via workflow_call.
  2. Concurrency and Permissions:
    • Uses concurrency to ensure that only one documentation run per branch is active at a time.
    • Grants minimal permissions needed to write to the repository and generate OIDC tokens.
  3. Steps:
    • โœ… Check out the code.
    • ๐Ÿ Set up Python and install ansible-doctor.
    • ๐Ÿ“„ Generate documentation with ansible-doctor --recursive roles.
    • ๐Ÿงผ Format the resulting Markdown using Prettier to ensure consistency.
    • ๐Ÿค– Configure Git with a bot identity.
    • ๐Ÿ” Detect whether any .md files changed.
    • ๐Ÿง  Generate a commit message using AI, powered by OpenRouter.ai and a small open-source model (mistralai/devstral-small:free).
    • ๐Ÿ’พ Commit and push the changes if there are any.

๐Ÿง  AI-Generated Commit Messages

Why use AI for commit messages?

  • I want my commits to be meaningful, concise, and nicely formatted.
  • The AI model is given a diff of the staged Markdown changes (up to 3000 characters) and asked to:
    • Keep it under 72 characters.
    • Start with an emoji.
    • Summarize the nature of the documentation update.

This is a small but elegant example of how LLMs can reduce repetitive work and make commits cleaner and more expressive.

Fallbacks are in place: if the AI fails to generate a message, the workflow defaults to a generic ๐Ÿ“ Update Ansible role documentation.


๐ŸŒ A Universal Pattern for Automated Docs

Although this workflow is focused on Ansible, the underlying pattern is not specific to Ansible at all. You can apply the same approach to any programming language or ecosystem that supports documentation generation based on inline annotations, comments, or code structure.

The general steps are:

  1. Write documentation annotations in your code (e.g. JSDoc, Doxygen, Python docstrings, Rust doc comments, etc.).
  2. Run a documentation generator, such as:
  3. Generate a commit message from the diff using an LLM.
  4. Commit and push the updated documentation.

This automation pattern works best in projects where:

  • Documentation is stored in version control.
  • Changes to documentation should be traceable.
  • Developers want to reduce the overhead of writing and committing docs manually.

๐Ÿ” A Note on OpenRouter API Keys

The AI step relies on OpenRouter.ai to provide access to language models. To keep your API key secure, it is passed via secrets.OPENROUTER_API_KEY, which is required when calling this workflow. I recommend generating a dedicated, rate-limited key for GitHub Actions use.


๐Ÿงช Try It Yourself

If you are working with Ansible rolesโ€”or any codebase with structured documentationโ€”and want to keep your docs fresh and AI-assisted, this workflow might be useful for you too. Feel free to copy and adapt it for your own projects. You can find the full source in my GitHub repository.

Let the robots do the boring work, so you can focus on writing better code.


๐Ÿ’ฌ Feedback?

If you have ideas to improve this workflow or want to share your own automation tricks, feel free to leave a comment or reach out on Mastodon: @amedee@lou.lt.

Happy automating!

๐Ÿค” โ€œWasnโ€™t /dev/null Good Enough?โ€ โ€” Understanding the Difference Between /dev/null and /dev/zero

After my last blog post about the gloriously pointless /dev/scream, a few people asked:

โ€œWasnโ€™t /dev/null good enough?โ€

Fair questionโ€”but it misses a key point.

Let me explain: /dev/null and /dev/zero are not interchangeable. In fact, they are opposites in many ways. And to fully appreciate the joke behind /dev/scream, you need to understand where that scream is coming fromโ€”not where it ends up.


๐ŸŒŒ Black Holes and White Holes

To understand the difference, let us borrow a metaphor from cosmology.

  • /dev/null is like a black hole: it swallows everything. You can write data to it, but nothing ever comes out. Not even light. Not even your logs.
  • /dev/zero is like a white hole: it constantly emits data. In this case, an infinite stream of zero bytes (0x00). It produces, but does not accept.

So when I run:

dd if=/dev/zero of=/dev/null

I am pulling data out of the white hole, and sending it straight into the black hole. A perfectly balanced operation of cosmic futility.


๐Ÿ“ฆ What Are All These /dev/* Devices?

Let us break down the core players:

DeviceCan You Write To It?Can You Read From It?What You ReadCommonly Used ForNickname / Metaphor
/dev/nullYesYesInstantly empty (EOF)Discard console output of a programBlack hole ๐ŸŒ‘
/dev/zeroYesYesEndless zeroes (0x00)Wiping drives, filling files, or allocating memory with known contentsWhite hole ๐ŸŒ•
/dev/randomNoYesRandom bytes from entropy poolSecure wiping drives, generating random dataQuantum noise ๐ŸŽฒ
/dev/urandomNoYesPseudo-random bytes (faster, less secure)Generating random dataPseudo-random fountain ๐Ÿ”€
/dev/oneYesYesEndless 0xFF bytesWiping drives, filling files, or allocating memory with known contentsThe dark mirror of /dev/zero โ˜ ๏ธ
/dev/screamYesYesaHAAhhaHHAAHaAaAAAA…CatharsisEmotional white hole ๐Ÿ˜ฑ

Note: /dev/one is not a standard part of Linuxโ€”it comes from a community kernel module, much like /dev/scream.


๐Ÿ—ฃ๏ธ Back to the Screaming

/dev/scream is a parody of /dev/zeroโ€”not /dev/null.

The point of /dev/scream was not to discard data. That is what /dev/null is for.

The point was to generate data, like /dev/zero or /dev/random, but instead of silent zeroes or cryptographic entropy, it gives you something more cathartic: an endless, chaotic scream.

aHAAhhaHHAAHaAaAAAAhhHhhAAaAAAhAaaAAAaHHAHhAaaaaAaHahAaAHaAAHaaHhAHhHaHaAaHAAHaAhhaHaAaAA

So when I wrote:

dd if=/dev/scream of=/dev/null

I was screaming into the void. The scream came from the custom device, and /dev/null politely absorbed it without complaint. Not a single bit screamed back. Like pulling screams out of a white hole and throwing them into a black hole. The ultimate cosmic catharsis.


๐Ÿงช Try Them Yourself

Want to experience the universe of /dev for yourself? Try these commands (press Ctrl+C to stop each):

# Silent, empty. Nothing comes out.
cat /dev/null

# Zero bytes forever. Very chill.
hexdump -C /dev/zero

# Random bytes from real entropy (may block).
hexdump -C /dev/random

# Random bytes, fast but less secure.
hexdump -C /dev/urandom

# If you have the /dev/one module:
hexdump -C /dev/one

# If you installed /dev/scream:
cat /dev/scream

๐Ÿ’ก TL;DR

  • /dev/null = Black hole: absorbs, never emits.
  • /dev/zero = White hole: emits zeroes, absorbs nothing.
  • /dev/random / /dev/urandom = Entropy sources: useful for cryptography.
  • /dev/one = Evil twin of /dev/zero: gives endless 0xFF bytes.
  • /dev/scream = Chaotic white hole: emits pure emotional entropy.

So no, /dev/null was not โ€œgood enoughโ€โ€”it was not the right tool. The original post was not about where the data goes (of=/dev/null), but where it comes from (if=/dev/scream), just like /dev/zero. And when it comes from /dev/scream, you are tapping into something truly primal.

Because sometimes, in Linux as in life, you just need to scream into the void.

You can now follow my blog from the Fediverse!

If you are part of the Fediverseโ€”on Mastodon, Pleroma, or any other ActivityPub-compatible platformโ€”you can now follow this blog directly from your favorite platform.

Thanks to the excellent ActivityPub plugin for WordPress, each blog post I publish on amedee.be is now automatically shared in a way that federated social platforms can understand and display.

Follow me from Mastodon

If you are on Mastodon, you can follow this blog just like you would follow another person:

Search for: @amedee.be@amedee.be

Or click this link if your Mastodon instance supports it:
https://amedee.be/@amedee.be

New blog posts will appear in your timeline, and you can even reply to them from Mastodon. Your comments will appear as replies on the blog post pageโ€”Fediverse and WordPress users interacting seamlessly!

Why I enabled ActivityPub

I have been active on Mastodon for a while as @amedee@lou.lt, and I really enjoy the decentralized, open nature of the Fediverse. It is a refreshing change from the algorithm-driven social media platforms.

Adding ActivityPub support to my blog aligns perfectly with those values: open standards, decentralization, and full control over my own content.

This change was as simple as adding the activitypub plugin to my blog’s Ansible configuration on GitHub:

 blog_wp_plugins_install:
+  - activitypub
   - akismet
   - google-site-kit
   - health-check

Once deployed, GitHub Actions and Ansible took care of the rest.

What this means for you

If you already follow me on Mastodon (@amedee@lou.lt), nothing changesโ€”you will still see the occasional personal post, boost, or comment.

But if you are more interested in my blog contentโ€”technical articles, tutorials, and occasional personal reflectionsโ€”you might prefer following @amedee.be@amedee.be. It is an automated account that only shares blog posts.

This setup lets me keep content separate and organized, while still engaging with the broader Fediverse community.

Want to do the same for your blog?

Setting this up is easy:

  1. Make sure you are running WordPress version 6.4 or later.
  2. Install and activate the ActivityPub plugin.
  3. After activation, your author profile (and optionally, your blog itself) becomes followable via the Fediverse.
  4. Start publishingโ€”and federate your writing with the world!