Skip to content

Uncategorized

Onzin, onzin, allemaal onzin!

A Field Guide to Dance Communities

Or How I Discovered That Fusion Isโ€ฆ Fine, I Guess ๐Ÿ•บ

Last night I did something new: I went fusion dancing for the first time.
Yes, fusion โ€” that mysterious realm where dancers claim to โ€œjust feel the music,โ€ which is usually code for nobody knows what weโ€™re doing but we vibe anyway.
The setting: a church in Ghent.
The vibe: incense-free, spiritually confusing. โ›ช

Spoiler: it was okay.
Nice to try once. Probably not my new religion.

Before anyone sharpens their pitchforks:
Lene (Kula Dance) did an absolutely brilliant job organizing this.
It was the first fusion event in Ghent, she put her whole heart into it, the vibe was warm and welcoming, and this is not a criticism of her or the atmosphere she created.
This post is purely about my personal dance preferences, which areโ€ฆ highly specific, letโ€™s call it that.

But letโ€™s zoom out. Because at this point Iโ€™ve sampled enough dance styles to write my own David Attenborough documentary, except with more sweat and fewer migratory birds. ๐Ÿฆ

Below: my completely subjective, highly scientific taxonomy of partner dance communities, observed in their natural habitats.


๐ŸŽป Balfolk โ€“ Home Sweet Home

Balfolk is where I grew up as a dancer โ€” the motherland of flow, warmth, and dancing like youโ€™re collectively auditioning for a Scandinavian fairy tale.

Thereโ€™s connection, community, live music, soft embraces, swirling mazurkas, and just the right amount of emotional intimacy without anyone pretending to unlock your chakras.

Balfolk people: friendly, grounded, slightly nerdy, and dangerously good at hugs.

Verdict: My natural habitat. My comfort food. My baseline for judging all other styles. โค๏ธ


๐Ÿ’ซ Fusion: A Beautiful Thing That Might Not Be My Thing

Fusion isnโ€™t a dance style โ€” itโ€™s a philosophical suggestion.

โ€œTake everything youโ€™ve ever learned andโ€ฆ improvise.โ€

Fusion dancers will tell you fusion is everything.
Which, suspiciously, also means it is nothing.

Itโ€™s not a style; itโ€™s a choose-your-own-adventure.
You take whatever dance language you know and try to merge it with someone elseโ€™s dance language, and pray the resulting dialect is mutually intelligible.

I had a fun evening, truly. It was lovely to see familiar faces, and again: Lene absolutely nailed the organization. Also a big thanks to Corentin for the music!
But for me personally, fusion sometimes has:

  • a bit too much freedom
  • a bit too little structure
  • and a wildly varying โ€œshared vocabularyโ€ depending on who youโ€™re holding

One dance feels like tango in slow motion, the next like zouk without the hair flips, the next like someone is trying to do tai chi at you. Mostly an exercise in guessing whether your partner is leading, following, improvising, or attempting contemporary contact improv for the first time.

Beautiful when it works. Less so when it doesnโ€™t.
And all of that randomly in a church in Ghent on a weeknight.

Verdict: Fun to try once, but Iโ€™m not currently planning my life around it. ๐Ÿ˜…


๐Ÿคธ Contact Improvisation: Gravityโ€™s Favorite Dance Style

Contact improv deserves its own category because itโ€™s fusionโ€™s feral cousin.

It’s the dance style where everyone pretends itโ€™s totally normal to roll on the floor with strangers while discussing weight sharing and listening with your skin.

Contact improv can be magical โ€” bold, creative, playful, curious, physical, surprising, expressive.
It can also be:

  • accidentally elbowing someone in the ribs
  • getting pinned under a โ€œcreative liftโ€ gone wrong
  • wondering why everyone else looks blissful while youโ€™re trying not to faceplant
  • ending up in a cuddle pile you did not sign up for

It can exactly be the moment where my brain goes:

โ€œAh. So this is where my comfort zone ends.โ€

Itโ€™s partnered physics homework.
Sometimes beautiful, sometimes confusing, sometimes suspiciously close to a yoga class that escaped supervision.

I absolutely respect the dancers who dive into weight-sharing, rolling, lifting, sliding, and all that sculptural body-physics magic.
But my personal dance style is:

  • musical
  • playful
  • partner-oriented
  • rhythm-based
  • and preferably done without accidentally mounting someone like a confused koala ๐Ÿจ

Verdict: Fascinating to try, excellent for body awareness, fascinating to observe, but not my go-to when I just want to dance and not reenact two otters experimenting with buoyancy. ๐Ÿฆฆ Probably not something Iโ€™ll ever do weekly.


๐Ÿช• Contra: The Holy Grail of Joyful Chaos

Contra is basically balfolk after three coffees.
People line up, the caller shouts things, everyone spins, nobody knows who theyโ€™re dancing with and nobody cares. Itโ€™s wholesome, joyful, fast, structured, musical, social, and somehow everyone becomes instantly attractive while doing it.

Verdict: YES. Inject directly into my bloodstream. ๐Ÿ’‰


๐Ÿป Ceilidh: Same Energy, More Shouting

Ceilidh is what you get when Contra and Guinness have a love child.
Itโ€™s rowdy, chaotic, and absolutely nobody takes themselves seriously โ€” not even the guy wearing a kilt with questionable underwear decisions. It’s more shouting, more laughter, more giggling at your own mistakes, and occasionally someone yeeting themselves across the room.

Verdict: Also YES. My natural ecosystem.


๐Ÿ‡ง๐Ÿ‡ท Forrรณ: Balfolk, but Warmer

If mazurka went on Erasmus in Brazil and came back with stories of sunshine and hip movement, youโ€™d get Forrรณ.

Close embrace? Check.
Playfulness? Check.
Techniques that look easy until you attempt them and fall over? Check.
Iโ€™m convinced I would adore forrรณ.

Verdict: Where are the damn lessons in Ghent? Brussel if we really have to. Asking for a friend. (The friend is me.) ๐Ÿ˜‰


๐Ÿ•บ Lindy Hop & West Coast Swing: Funโ€ฆ But the Vibe?

Both look amazing โ€” great music, athletic energy, dynamic, cool moves, full of personality.
But sometimes the community feels a tiny bit like:

โ€œIf youโ€™re not wearing vintage shoes and triple-stepping since birth, who even are you?โ€

Itโ€™s not that the dancers are bad โ€” theyโ€™re great.
Itโ€™s justโ€ฆ the pretentie.

Verdict: Lovely to watch, less lovely to join.
Still looking for a group without the subtle โ€œaudition for fame-school jazz ensembleโ€ energy.


๐ŸŒŠ Zouk: The Idea Pot

Zouk dancers move like water. Or like very bendy cats.
Itโ€™s sexy, flowy, and full of body isolations that make you reconsider your spineโ€™s architecture.

Iโ€™m not planning to become a zouk person, but I am planning to steal their ideas.
Chest isolations?
Head rolls?
Wavy body movements?
Yes please. For flavour. Not for full conversion.

Verdict: Excellent expansion pack, questionable main quest.


๐Ÿ’ƒ Salsa, Bachata & Friends: Respectfullyโ€ฆ No

I tried. I really did.
I know people love them.
But the Latin socials generally radiate too much:

  • machismo
  • perfume
  • nightclub energy
  • โ€œlook at my hipsโ€ nationalism
  • and questionable gender-role nostalgia

If you love it, great.
If youโ€™re me: no, no, absolutely not, thank you.

Verdict: iew iew nรฉรฉรฉ. ๐Ÿชณ
Fantastic for others. Not for me.


๐Ÿท Tango: The Forbidden Fruit

Tango is elegant, intimate, dramaticโ€ฆ and the community is a whole ecosystem on its own.

There are scenes where people dance with poetic tenderness, and scenes where people glare across the room using century-old codified eyebrow signals that might accidentally summon a demon. ๐Ÿ‘€

I like tango a lot โ€” I just need to find a community that doesnโ€™t feel like Iโ€™m intruding on someoneโ€™s ancestral mating ritual. And where nobody hisses if your embrace is 3 mm off the sacred norm.

Verdict: Promising, if I find the right humans.


๐Ÿง˜โ€โ™‚๏ธ Ecstatic Dance / 5 Rhythms / Biodanza / Tantric Whatever

Look.
Iโ€™m trying to be polite.
But if I wanted to flail around barefoot while being spiritually judged by someone named Moonfeather, Iโ€™d just do yoga in the wrong class.

I appreciate the concept of moving freely.
I do not appreciate:

  • uninvited aura readings
  • unclear boundaries
  • workshops that smell like kombucha
  • communities where โ€œI feel called to shareโ€ takes 20 minutes

And also: what are we doing? Therapy? Dance? Summoning a forest deity? ๐Ÿงš

Verdict: Too much floaty spirituality, not enough actual dancing.
Hard pass. โœจ


๐Ÿ“ Conclusion

Iโ€™m a simple dancer.
Give me clear structure (contra), playful chaos (ceilidh), heartfelt connection (balfolk), or Brazilian sunshine vibes (forrรณ).

Fusion was fun to try, and Iโ€™m genuinely grateful it exists โ€” and grateful to the people like Lene who pour time and energy into creating new dance spaces in Ghent. ๐Ÿ™Œ

But for me personally?
Fusion can stay in the category of โ€œfun experiment,โ€ but I wonโ€™t be selling all my worldly possessions to follow the Church of Expressive Improvisation any time soon.
Iโ€™ll stay in my natural habitat: balfolk, contra, ceilidh, and anything that combines playfulness, partnership, and structure.

If you see me in a dance hall, assume Iโ€™m there for the joy, the flow, and preferably fewer incense-burning hippies. ๐Ÿ•ฏ๏ธ

Still: Iโ€™m glad I went.
Trying new things is half the adventure.
Knowing what you like is the other half.

And Iโ€™m getting pretty damn good at that. ๐Ÿ’›

Amen.
(Fitting, since I wrote this after dancing in a church.)

๐Ÿก Spreadsheets, Photos, and the Art of Moving Out

When you move out of a cohousing, you donโ€™t just pack your boxes โ€” you pack your shared life.
And in our case, that meant making an inventory of everything that lived in the house at Van Ooteghem:
Who takes what, what gets sold, and whatโ€™s destined for the containerpark.

To keep things organised (and avoid the classic โ€œwait, whose toaster was that again?โ€ discussion), we split the task โ€” each person took care of one room.
I was assigned to the living room.

I made photos of every item, uploaded them to our shared Dropbox folder, and listed them neatly in a Google spreadsheet:
one column for the Dropbox URL, another for the photo itself using the IMAGE() function, like this:

=IMAGE(A2)

๐Ÿ“ธ When Dropbox meets Google Sheets

Of course, it didnโ€™t work immediately โ€” because Dropbox links donโ€™t point directly to the image.
They point to a webpage that shows a preview. Google Sheets looked at that and shrugged.

A typical Dropbox link looks like this:

https://www.dropbox.com/s/abcd1234efgh5678/photo.jpg?dl=0

So I used a small trick: in my IMAGE() formula, I replaced ?dl=0 with ?raw=1, forcing Dropbox to serve the actual image file.

=IMAGE(SUBSTITUTE(A2, "?dl=0", "?raw=1"))

And suddenly, there they were โ€” tidy little thumbnails, each safely contained within its cell.


๐Ÿงฉ Making it fit just right

You can fine-tune how your image appears using the optional second argument of the IMAGE() function:

=IMAGE("https://example.com/image.jpg", mode)

Where:

  • 1 โ€“ fit to cell (default)
  • 2 โ€“ stretch (fill the entire cell, may distort)
  • 3 โ€“ keep original size
  • 4 โ€“ custom size, e.g. =IMAGE("https://example.com/image.jpg", 4, 50, 50) (sets width and height in pixels)

๐Ÿ’ก Resize the row or column if needed to make it look right.

That flexibility means you can keep your spreadsheet clean and consistent โ€” even if your photos come in all sorts of shapes and sizes.


๐Ÿงโ€โ™€๏ธ The others tried it too…

My housemates loved the idea and started adding their own photos to the spreadsheet.
Exceptโ€ฆ they just pasted them in.
It looked great at first โ€” until someone resized a row.
Then the layout turned into an abstract art project, with floating chairs and migrating coffee machines.

The moral of the story: IMAGE() behaves like cell content, while pasted images are wild creatures that roam free across your grid.


๐Ÿงฎ Bonus: The Excel version

If youโ€™re more of an Excel person, thereโ€™s good news.
Recent versions of Excel 365 also support the IMAGE() function โ€” almost identical to Google Sheets:

=IMAGE("https://www.dropbox.com/s/abcd1234efgh5678/photo.jpg?raw=1", "Fit")

If youโ€™re still using an older version, youโ€™ll need to insert pictures manually and set them to Move and size with cells.
Not quite as elegant, but it gets the job done.


๐Ÿงน Organised chaos, visual edition

So thatโ€™s how our farewell to Van Ooteghem turned into a tech experiment:
a spreadsheet full of URLs, formulas, furniture, and shared memories.

Itโ€™s oddly satisfying to scroll through โ€” half practical inventory, half digital scrapbook.
Because even when youโ€™re dismantling a home, thereโ€™s still beauty in a good system.

Phew, We Actually Moved! ๐ŸŽ‰

After days of boxes, labels, and that one mysterious piece of furniture that no one remembers what it belongs to, we can finally say it: weโ€™ve moved! And yes, mostly without casualties (except for a few missing screws).

The most nerve-wracking moment? Without a doubt, moving the piano. It got more attention than any other piece of furniture โ€” and rightfully so. With a mix of brute strength, precision, and a few prayers to the gods of gravity, itโ€™s now proudly standing in the living room.

Weโ€™ve also been officially added to the street WhatsApp group โ€” the digital equivalent of the village well, but with emojis. It feels good to get those first friendly waves and โ€œwelcome to the neighborhood!โ€ messages.

The house itself is slowly coming together. My IKEA PAX wardrobe is fully assembled, but the BRIMNES bed still exists mostly in theory. For now, Iโ€™m camping in style โ€” mattress on the floor. My goal is to build one piece of furniture per day, though that might be slightly ambitious. Help is always welcome โ€” not so much for heavy lifting, but for some body doubling and co-regulation. Just someone to sit nearby, hold a plank, and occasionally say โ€œyouโ€™re doing great!โ€

There are still plenty of (banana) boxes left to unpack, but thatโ€™s part of the process. My personal mission: downsizing. Especially the books. But they wonโ€™t just be dumped at a thrift store โ€” books are friends, and friends deserve a loving new home. ๐Ÿ“š๐Ÿ’š

Technically, things are running quite smoothly already: weโ€™ve got fiber internet from Mobile Vikings, and I set up some Wi-Fi extenders and powerline adapters. Tomorrow, the electricianโ€™s coming to service the air-conditioning units โ€” and while heโ€™s here, Iโ€™ll ask him to attach RJ45 connectors to the loose UTP cables that end in the fuse box. That means wired internet soon too โ€” because nothing says โ€œsettled adultโ€ like a stable ping.

And then thereโ€™s the garden. ๐ŸŒฟ Not just a tiny patch of green, but a real garden with ancient fruit trees and even a fig tree! We had a garden at the previous house too, but this one definitely feels like the deluxe upgrade. Every day I discover something new that grows, blossoms, or sneakily stings.

Ideas for cozy gatherings are already brewing. One of the first plans: living room concerts โ€” small, warm afternoons or evenings filled with music, tea (one of us has British roots, so yes: milk included, coffee machine not required), and lovely people.

The first one will likely feature Hilde Van Belle, a (bal)folk friend who currently has a Kickstarter running for her first solo album:
๐Ÿ‘‰ Hilde Van Belle โ€“ First Solo Album

I already heard her songs at the CaDansa Balfolk Festival, and I could really feel the personal emotions in her music โ€” honest, raw, and full of heart.
You should definitely support her! ๐Ÿ’›

The album artwork is created by another (bal)folk friend, Verena, which makes the whole project feel even more connected and personal.

Hilde (left) and Verena (right) at CaDansa
๐Ÿ“ธ Valentina Anzani

So yes: the pianoโ€™s in place, the Wi-Fi works, the garden thrives, the boxes wait patiently, and the teapot is steaming.
Weโ€™ve arrived.
Phew. We actually moved. โ˜•๐ŸŒณ๐Ÿ“ฆ๐ŸŽถ

๐Ÿ‘พ GRUB Invaders: Because Bootloaders Deserve to Have Fun Too

You know how you can make your bootloader sing a little tune?
Wellโ€ฆ what if instead of music, you could make it play Space Invaders?

Yes, thatโ€™s a real thing.
Itโ€™s called GRUB Invaders, and it runs before your operating system even wakes up.
Because who needs Linux when you can blast aliens straight from your BIOS screen? ๐Ÿš€


๐ŸŽถ From Tunes to Lasers

In a previous post โ€” โ€œResurrecting My Windows Partition After 4 Years ๐Ÿ–ฅ๏ธ๐ŸŽฎโ€ โ€”
I fell down a delightful rabbit hole while editing my GRUB configuration.
Thatโ€™s where I discovered GRUB_INIT_TUNE, spent hours turning my PC speaker into an 80s arcade machine, and learned far more about bootloader acoustics than anyone should. ๐Ÿ˜…

So naturally, the next logical step was obvious:
if GRUB can play music, surely it can play games too.
Enter: GRUB Invaders. ๐Ÿ‘พ๐Ÿ’ฅ


๐Ÿงฉ What the Heck Is GRUB Invaders?

grub-invaders is a multiboot-compliant kernel game โ€” basically, a program that GRUB can launch like itโ€™s an OS.
Except itโ€™s not Linux, not BSD, not anything remotely usefulโ€ฆ
itโ€™s a tiny Space Invaders clone that runs on bare metal.

To install it (on Ubuntu or Debian derivatives):

sudo apt install grub-invaders

Then, in GRUBโ€™s boot menu, itโ€™ll show up as GRUB Invaders.
Pick it, hit Enter, and bam! โ€” no kernel, no systemd, just pew-pew-pew.
Your CPU becomes a glorified arcade cabinet. ๐Ÿ•น๏ธ

Image: https://libregamewiki.org/GRUB_Invaders

๐Ÿ› ๏ธ How It Works

Under the hood, GRUB Invaders is a multiboot kernel image (yep, same format as Linux).
That means GRUB can load it into memory, set up registers, and jump straight into its entry point.

Thereโ€™s no OS, no drivers โ€” just BIOS interrupts, VGA mode, and a lot of clever 8-bit trickery.
Basically: the game runs in real mode, paints directly to video memory, and uses the keyboard interrupt for controls.
Itโ€™s a beautiful reminder that once upon a time, you could build a whole game in a few kilobytes.


๐Ÿงฎ Technical Nostalgia

Installed size?

Installed-Size: 30
Size: 8726 bytes

Yes, you read that right: under 9 KB.
Thatโ€™s less than one PNG icon on your desktop.
Yet itโ€™s fully playable โ€” proof that programmers in the โ€™80s had sorcery weโ€™ve since forgotten. ๐Ÿง™โ€โ™‚๏ธ

The package is ancient but still maintained enough to live in the Ubuntu repositories:

Homepage: http://www.erikyyy.de/invaders/
Maintainer: Debian Games Team
Enhances: grub2-common

So you can still apt install it in 2025, and it just works.


๐Ÿง  Why Bother?

Because you can.

Because sometimes itโ€™s nice to remember that your bootloader isnโ€™t just a boring chunk of C code parsing configs.
Itโ€™s a tiny virtual machine, capable of loading kernels, playing music, and โ€” if youโ€™re feeling chaotic โ€” defending the Earth from pixelated aliens before breakfast. โ˜•

Itโ€™s also a wonderful conversation starter at tech meetups:

โ€œOh, my GRUB doesnโ€™t just boot Linux. It plays Space Invaders. What does yours do?โ€


โš™๏ธ A Note on Shenanigans

Donโ€™t worry โ€” GRUB Invaders doesnโ€™t modify your boot process or mess with your partitions.
Itโ€™s launched manually, like any other GRUB entry.
When youโ€™re done, reboot, and youโ€™re back to your normal OS.
Totally safe. (Mostly. Unless you lose track of time blasting aliens.)


๐Ÿ TL;DR

  • grub-invaders lets you play Space Invaders in GRUB.
  • Itโ€™s under 9 KB, runs without an OS, and is somehow still in Ubuntu repos.
  • Totally useless. Totally delightful.
  • Perfect for when you want to flex your inner 8-bit gremlin.

Verhuisdag Part 1: Dozen, Dรฉgage en Deeg! ๐Ÿ•๐Ÿš๐Ÿ“ฆ

We hebben de sleutels nog niet, maar ik plan toch al een verhuisdag op woensdag 29 oktober. (To be confirmed, maar het komt dichterbij!)


Waar ik hulp bij kan gebruiken ๐Ÿ’ช

  • Bananendozen verhuizen โ€” ik zorg dat het meeste op voorhand is ingepakt.
    Ruwe schatting: zoโ€™n 30 dozen (ik heb ze niet geteld, ik leef graag gevaarlijk).
  • Demonteren en verhuizen van meubels:
    • Boekenrek (IKEA KALLAX 5×5)
    • Kleerkast
    • Bed
    • Bureau
  • Diepvries verhuizen (van de keuken op het gelijkvloers naar de kelder in het nieuwe huis).

De dozen en meubels staan nu op de 2de verdieping. Ik probeer vooraf al wat dozen naar beneden te sleuren โ€” want trappen, ja.

Assembleren van meubels op het nieuwe adres doen we een andere dag.
Doel van de dag: niet overprikkeld geraken.


Wat ik zelf regel ๐Ÿš

Ik voorzie een kleine bestelwagen via Dรฉgage autodelen.


Wat ik nog nodig heb ๐Ÿงฐโค๏ธ

  • Een elektrische schroevendraaier (voor het IKEA-spul).
  • Handige, stressbestendige mensen met een vleugje organisatietalent.
  • Enkele autoโ€™s die over en weer kunnen rijden โ€” zelfs al is het maar voor een paar dozen.
  • Emotionele support crew die op tijd kunnen zeggen: โ€œHey, pauze.โ€

Praktisch ๐Ÿ“

  • Oud adres: Ledeberg
  • Nieuw adres: tussen station Gent-Sint-Pieters en de Sterre
  • Afstand: ongeveer 4 km
    (Exacte adressen deel ik met de helpers.)

Ik maak een WhatsApp-groep voor coรถrdinatie.


Afsluiter ๐Ÿ•

Verhuisdag Part 1 eindigt met gratis pizzaโ€™s.
Want eerlijk: dozen sleuren is zwaar, maar pizza maakt alles beter.


Wil je komen helpen (met spierkracht, auto, gereedschap of goeie vibes)?
Laat iets weten โ€” hoe meer handen, hoe minder stress!

๐ŸŽต The Secret Soundtrack of GRUB: Making Your Bootloader Sing

So, you know that feeling when youโ€™re editing GRUB for the thousandth time, because dual-booting is apparently a lifestyle choice?
In a previous post โ€” Resurrecting My Windows Partition After 4 Years ๐Ÿ–ฅ๏ธ๐ŸŽฎ โ€” I was neck-deep in grub.cfg, poking at boot entries, fixing UUIDs, and generally performing a ritual worthy of system resurrection.

While I was at it, I decided to take a closer look at all those mysterious variables lurking in /etc/default/grub.
Thatโ€™s when I stumbled upon something… magical. โœจ


๐ŸŽถ GRUB_INIT_TUNE โ€” Your Bootloader Has a Voice

Hidden among all the serious-sounding options like GRUB_TIMEOUT and GRUB_CMDLINE_LINUX_DEFAULT sits this gem:

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

Wait, what? GRUB can beep?
Oh, not just beep. GRUB can play a tune. ๐ŸŽบ

Hereโ€™s how it actually works (per the GRUB manpage):

Format:

tempo freq duration [freq duration freq duration ...]
  • tempo โ€” The base time for all note durations, in beats per minute.
    • 60 BPM โ†’ 1 second per beat
    • 120 BPM โ†’ 0.5 seconds per beat
  • freq โ€” The note frequency in hertz.
    • 262 = Middle C, 0 = silence
  • duration โ€” Measured in โ€œbarsโ€ relative to the tempo.
    • With tempo 60, 1 = 1 second, 2 = 2 seconds, etc.

So 480 440 1 is basically GRUB saying โ€œHello, world!โ€ through your motherboard speaker: 0.25 seconds at 440 Hz, which is A4 in standard concert pitch as defined by ISO 16:1975.
And yes, this works even before your sound card drivers have loaded โ€” pure, raw, BIOS-level nostalgia.


๐Ÿง  From Beep to Bop

Naturally, I couldnโ€™t resist. One line turned into a small Python experiment, which turned into an audio preview tool, which turned intoโ€ฆ letโ€™s say, โ€œbootloader performance art.โ€

Want to make GRUB play a polska when your system starts?
You can. Itโ€™s just a matter of string length โ€” and a little bit of mischief. ๐Ÿ˜

Thereโ€™s technically no fixed โ€œmaximum sizeโ€ for GRUB_INIT_TUNE, but remember: the bootloader runs in a very limited environment. Push it too far, and your majestic overture becomes a segmentation fault sonata.

So maybe keep it under a few kilobytes unless you enjoy debugging hex dumps at 2 AM.


๐ŸŽผ How to Write a Tune That Wonโ€™t Make Your Laptop Cry

Practical rules of thumb (donโ€™t be that person):

  • Keep the inline tune under a few kilobytes if you want it to behave predictably.
  • Hundreds to a few thousands of notes is usually fine; tens of thousands is pushing luck.
  • Each numeric value (pitch or duration) must be โ‰ค 65535.
  • Very long tunes simply delay the menu โ€” thatโ€™s obnoxious for you and terrifying for anyone asking you for help.
    Keep tunes short and tasteful (or obnoxious on purpose).

๐ŸŽต Little Musical Grammar: Notes, Durations and Chords (Fake Ones)

Write notes as frequency numbers (Hz). Example: A4 = 440.

Prefer readable helpers: write a tiny script that converts D4 F#4 A4 into the numbers.

Example minimal tune:

GRUB_INIT_TUNE="480 294 1 370 1 440 1 370 1 392 1 494 1 294 1"

Thatโ€™ll give you a jaunty, bouncy opener โ€” suitable for mild neighbour complaints. ๐Ÿ’ƒ๐ŸŽป

Chords? GRUB canโ€™t play them simultaneously โ€” but you can fake them by rapid time-multiplexing (cycling the chord notes quickly).
It sounds like a buzzing organ, not a symphony, but itโ€™s delightful in small doses.

Fun fact ๐Ÿ’พ: this time-multiplexing trick isnโ€™t new โ€” itโ€™s straight out of the 8-bit video game era.
Old sound chips (like those in the Commodore 64 and NES) used the same sleight of hand to make
a single channel pretend to play multiple notes at once.
If youโ€™ve ever heard a chiptune shimmer with impossible harmonies, thatโ€™s the same magic. โœจ๐ŸŽฎ


๐Ÿงฐ Tools I Like (and That You Secretly Want)

If youโ€™re not into manually counting numbers, do this:

Use a small composer script (I wrote one) that:

  • Accepts melodic notation like D4 F#4 A4 or C4+E4+G4 (chord syntax).
  • Can preview via your system audio (so you donโ€™t have to reboot to hear it).
  • Can install the result into /etc/default/grub and run update-grub (only as sudo).

Preview before you install. Always.
Your ears will tell you if your โ€œode to systemdโ€ is charming or actually offensive.

For chords, the script time-multiplexes: e.g. for a 500 ms chord and 15 ms slices,
it cycles the chord notes quickly so the ear blends them.
Itโ€™s not true polyphony, but itโ€™s a fun trick.

(If you want the full script I iterated on: drop me a comment. But it’s more fun to leave as an exercise to the reader.)


๐Ÿงฎ Limits, Memory, and โ€œHow Big Before It Breaks?โ€

Yes, my Red Team colleague will love this paragraph โ€” and no, Iโ€™m not going to hand over a checklist for breaking things.

Short answer: GRUB doesnโ€™t advertise a single fixed limit for GRUB_INIT_TUNE length.

Longer answer, responsibly phrased:

  • Numeric limits: per note pitch/duration โ‰ค 65535 (uint16_t).
  • Tempo: can go up to uint32_t.
  • Parser & memory: the tune is tokenized at boot, so parsing buffers and allocators impose practical limits.
    Expect a few kilobytes to be safe; hundreds of kilobytes is where things get flaky.
  • Usability: if your tune is measured in minutes, youโ€™ve already lost. Donโ€™t be that.

If you want to test where the parser chokes, do it in a disposable VM, never on production hardware.
If youโ€™re feeling brave, you can even audit the GRUB source for buffer sizes in your specific version. ๐Ÿงฉ


โš™๏ธ How to Make It Sing

Edit /etc/default/grub and add a line like this:

GRUB_INIT_TUNE="480 440 1 494 1 523 1  587 1  659 3"

Then rebuild your config:

sudo update-grub

Reboot, and bask in the glory of your new startup sound.
Your BIOS will literally play you in. ๐ŸŽถ


๐Ÿ’ก Final Thoughts

GRUB_INIT_TUNE is the operating-system equivalent of a ringtone for your toaster:
ridiculously low fidelity, disproportionately satisfying,
and a perfect tiny place to inject personality into an otherwise beige boot.

Use it for a smile, not for sabotage.

And just when I thought Iโ€™d been all clever reverse-engineering GRUB beeps myselfโ€ฆ
I discovered that someone already built a web-based GRUB tune tester!
๐Ÿ‘‰ https://breadmaker.github.io/grub-tune-tester/

Yes, you can compose and preview tunes right in your browser โ€”
no need to sacrifice your system to the gods of early boot audio.
Itโ€™s surprisingly slick.

Even better, thereโ€™s a small but lively community posting their GRUB masterpieces on Reddit and other forums.
From Mario theme beeps to Doom startup riffs, thereโ€™s something both geeky and glorious about it.
Youโ€™ll find everything from tasteful minimalist dings to full-on โ€œsomeone please stop themโ€ anthems. ๐ŸŽฎ๐ŸŽถ

Boot loud, boot proud โ€” but please boot considerate. ๐Ÿ˜„๐ŸŽป๐Ÿ’ป

๐Ÿงผ Pre-commit: Because “oops, forgot to format” is so last year

As a solo developer, I wear all the hats. ๐ŸŽฉ๐Ÿ‘ทโ€โ™‚๏ธ๐ŸŽจ
That includes the very boring Quality Assurance Hatโ„ข โ€” the one that says โ€œyes, Amedee, you do need to check for trailing whitespace again.โ€

And honestly? I suck at remembering those little details. Iโ€™d rather be building cool stuff than remembering to run Black or fix a missing newline. So I let my robot friend handle it.

That friend is called pre-commit. And itโ€™s the best personal assistant I never hired. ๐Ÿค–


๐Ÿง What is this thing?

Pre-commit is like a bouncer for your Git repo. Before your code gets into the club (your repo), it gets checked at the door:

โ€œWhoa there โ€” trailing whitespace? Not tonight.โ€
โ€œMissing a newline at the end? Try again.โ€
โ€œThat YAML looks sketchy, pal.โ€
โ€œYou really just tried to commit a 200MB video file? What is this, Dropbox?โ€
โ€œLeaking AWS keys now, are we? Security says nope.โ€
โ€œCommit message says โ€˜fixโ€™? Thatโ€™s not a message, thatโ€™s a shrug.โ€

Pre-commit runs a bunch of little scripts called hooks to catch this stuff. You choose which ones to use โ€” itโ€™s modular, like Lego for grown-up devs. ๐Ÿงฑ

When I commit, the hooks run. If they donโ€™t like what they see, the commit gets bounced.
No exceptions. No drama. Just โ€œfix it and try again.โ€

Is it annoying? Yeah, sometimes.
But has it saved my butt from pushing broken or embarrassing code? Way too many times.


๐ŸŽฏ Why I bother (as a hobby dev)

I donโ€™t have teammates yelling at me in code reviews. I am the teammate.
And future-me is very forgetful. ๐Ÿง“

Pre-commit helps me:

  • ๐Ÿ“ Keep my code consistent
  • ๐Ÿ’ฃ It catches dumb mistakes before I make them permanent.
  • ๐Ÿ•’ Spend less time cleaning up
  • ๐Ÿ’ผ Feel a little more โ€œproโ€ even when Iโ€™m hacking on toy projects
  • ๐Ÿงฌ It works with any language. Even Bash, if youโ€™re that kind of person.

Also, it feels kinda magical when it auto-fixes stuff and the commit justโ€ฆ works.


๐Ÿ›  Installing it with pipx (because I’m not a barbarian)

I’m not a fan of polluting my Python environment, so I use pipx to keep things tidy. It installs CLI tools globally, but keeps them isolated.
If you donโ€™t have pipx yet:

python3 -m pip install --user pipx
pipx ensurepath

Then install pre-commit like a boss:

pipx install pre-commit

Boom. Itโ€™s installed system-wide without polluting your precious virtualenvs. Chef’s kiss. ๐Ÿ‘จโ€๐Ÿณ๐Ÿ’‹


๐Ÿ“ Setting it up

Inside my project (usually some weird half-finished script Iโ€™ll obsess over for 3 days and then forget for 3 months), I create a file called .pre-commit-config.yaml.

Here’s what mine usually looks like:

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-added-large-files

  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.28.0
    hooks:
      - id: gitleaks

  - repo: https://github.com/jorisroovers/gitlint
    rev: v0.19.1
    hooks:
      - id: gitlint

  - repo: https://gitlab.com/vojko.pribudic.foss/pre-commit-update
    rev: v0.8.0
    hooks:
      - id: pre-commit-update

๐Ÿง™โ€โ™‚๏ธ What this pre-commit config actually does

You’re not just tossing some YAML in your repo and calling it a day. This thing pulls together a full-on code hygiene crew โ€” the kind that shows up uninvited, scrubs your mess, locks up your secrets, and judges your commit messages like it’s their job. Because it is.

๐Ÿ“ฆ pre-commit-hooks (v5.0.0)

These are the basics โ€” the unglamorous chores that keep your repo from turning into a dumpster fire. Think lint roller, vacuum, and passive-aggressive IKEA manual rolled into one.

  • trailing-whitespace:
    ๐Ÿšซ No more forgotten spaces at the end of lines. The silent killers of clean diffs.
  • end-of-file-fixer:
    ๐Ÿ‘จโ€โš•๏ธ Adds a newline at the end of each file. Why? Because some tools (and nerds) get cranky if itโ€™s missing.
  • check-yaml:
    ๐Ÿงช Validates your YAML syntax. No more โ€œwhy isnโ€™t my config working?โ€ only to discover you had an extra space somewhere.
  • check-added-large-files:
    ๐Ÿšจ Stops you from accidentally committing that 500MB cat video or .sqlite dump. Saves your repo. Saves your dignity.
๐Ÿ” gitleaks (v8.28.0)

Scans your code for secrets โ€” API keys, passwords, tokens you really shouldnโ€™t be committing.
Because weโ€™ve all accidentally pushed our .env file at some point. (Donโ€™t lie.)

โœ๏ธ gitlint (v0.19.1)

Enforces good commit message style โ€” like limiting subject line length, capitalizing properly, and avoiding messages like โ€œasdfโ€.
Great if you’re trying to look like a serious dev, even when you’re mostly committing bugfixes at 2AM.

๐Ÿ” pre-commit-update (v0.8.0)

The responsible adult in the room. Automatically bumps your hook versions to the latest stable ones. No more living on ancient plugin versions.

๐Ÿงผ In summary

This setup covers:

  • โœ… Basic file hygiene (whitespace, newlines, YAML, large files)
  • ๐Ÿ”’ Secret detection
  • โœ‰๏ธ Commit message quality
  • ๐Ÿ†™ Keeping your hooks fresh

You can add more later, like linters specific for your language of choice โ€” think of this as your “minimum viable cleanliness.”

๐Ÿงฉ What else can it do?

There are hundreds of hooks. Some Iโ€™ve used, some Iโ€™ve just admired from afar:

  • black is a Python code formatter that says: โ€œShhh, I know better.โ€
  • flake8 finds bugs, smells, and style issues in Python.
  • isort sorts your imports so you donโ€™t have to.
  • eslint for all you JavaScript kids.
  • shellcheck for Bash scripts.
  • โ€ฆ or write your own custom one-liner hook!

You can browse tons of them at: https://pre-commit.com/hooks.html


๐Ÿง™โ€โ™€๏ธ Make Git do your bidding

To hook it all into Git:

pre-commit install

Now every time you commit, your code gets a spa treatment before it enters version control. ๐Ÿ’…

Wanna retroactively clean up the whole repo? Go ahead:

pre-commit run --all-files

Youโ€™ll feel better. I promise.


๐ŸŽฏ TL;DR

Pre-commit is a must-have.
Itโ€™s like brushing your teeth before a date: itโ€™s fast, polite, and avoids awkward moments later. ๐Ÿชฅ๐Ÿ’‹
If you havenโ€™t tried it yet: do it. Your future self (and your Git history, and your date) will thank you. ๐Ÿ™

Use pipx to install it globally.
Add a .pre-commit-config.yaml.
Install the Git hook.
Enjoy cleaner commits, fewer review comments โ€” and a commit history youโ€™re not embarrassed to bring home to your parents. ๐Ÿ˜Œ๐Ÿ’

And if it ever annoys you too much?
You can always disable itโ€ฆ like cancelling the date but still showing up in their Instagram story. ๐Ÿ˜ˆ๐Ÿ’”

git commit --no-verify

Want help writing your first config? Or customizing it for Python, Bash, JavaScript, Kotlin, or your one-man-band side project? Iโ€™ve been there. Ask away!

Resurrecting My Windows Partition After 4 Years ๐Ÿ–ฅ๏ธ๐ŸŽฎ

Sometimes Linux life is bliss. I have my terminal, my editor, my tools, and Steam games that run natively. For nearly four years, I didnโ€™t touch Windows once โ€” and I didnโ€™t miss it.

And then Fortnite happened.

My girlfriend Enya and her wife Kyra got hooked, and naturally I wanted to join them. But Fortnite refuses to run on Linux โ€” apparently some copy-protection magic that digs into the Windows kernel, according to Reddit (so I don’t know if it’s true). Itโ€™s rare these days for a game to be Windows-only, but rare enough to shatter my Linux-only bubble. Suddenly, resurrecting Windows wasnโ€™t a chore anymore; it was a quest for polyamorous Battle Royale glory. ๐Ÿ•น๏ธ

My Windows 11 partition had been hibernating since November 2021, quietly gathering dust and updates in a forgotten corner of the disk. Why it stopped working back then? I honestly donโ€™t remember, but apparently I had blogged about it. I hadnโ€™t cared โ€” until now.


The Awakening โ€“ Peeking Into the UEFI Abyss ๐Ÿง

I started my journey with my usual tools: efibootmgr and update-grub on Ubuntu. I wanted to see what the firmware thought was bootable:

sudo efibootmgr

Output:

BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000
Boot0000* Windows Boot Manager ...
Boot0001* Ubuntu ...

At first glance, everything seemed fine. Ubuntu booted as usual. Windowsโ€ฆ did not. It didn’t even show up in the GRUB boot menu. A little disappointingโ€”but not unexpected, given that it hadnโ€™t been touched in years. ๐Ÿ˜ฌ

I knew the firmware knew about Windowsโ€”but the OS itself refused to wake up.


The Hidden Enemy โ€“ Why os-prober Was Disabled โš™๏ธ

I soon learned that recent Ubuntu versions disable os-prober by default. This is partly to speed up boot and partly to avoid probing unknown partitions automatically, which could theoretically be a security risk.

I re-enabled it in /etc/default/grub:

GRUB_DISABLE_OS_PROBER=false

Then ran:

sudo update-grub

Even after this tweak, Windows still didnโ€™t appear in the GRUB menu.


The Manual Attempt โ€“ GRUB to the Rescue โœ๏ธ

Determined, I added a manual GRUB entry in /etc/grub.d/40_custom:

menuentry "Windows" {
    insmod part_gpt
    insmod fat
    insmod chain
    search --no-floppy --fs-uuid --set=root 99C1-B96E
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

How I found the EFI partition UUID:

sudo blkid | grep EFI

Result: UUID="99C1-B96E"

Ran sudo update-grubโ€ฆ Windows showed up in GRUB! But clicking it? Nothing.

At this stage, Windows still wouldnโ€™t boot. The ghost remained untouchable.


The Missing File โ€“ Hunt for bootmgfw.efi ๐Ÿ—‚๏ธ

The culprit? bootmgfw.efi itself was gone. My chainloader had nothing to point to.

I mounted the NTFS Windows partition (at /home/amedee/windows) and searched for the missing EFI file:

sudo find /home/amedee/windows/ -type f -name "bootmgfw.efi"
/home/amedee/windows/Windows/Boot/EFI/bootmgfw.efi

The EFI file was hidden away, but thankfully intact. I copied it into the proper EFI directory:

sudo cp /home/amedee/windows/Windows/Boot/EFI/bootmgfw.efi /boot/efi/EFI/Microsoft/Boot/

After a final sudo update-grub, Windows appeared automatically in the GRUB menu. Finally, clicking the entry actually booted Windows. Victory! ๐Ÿฅณ


Four Years of Sleeping Giants ๐Ÿ•ฐ๏ธ

Booting Windows after four years was like opening a time capsule. I was greeted with thousands of updates, drivers, software installations, and of course, the installation of Fortnite itself. It took hours, but it was worth it. The old system came back to life.

Every โ€œupdate completeโ€ message was a heartbeat closer to joining Enya and Kyra in the Battle Royale.


The GRUB Disappearance โ€“ Enter Ventoy ๐Ÿ”ง

After celebrating Windows resurrection, I rebootedโ€ฆ and panic struck.

The GRUB menu had vanished. My system booted straight into Windows, leaving me without access to Linux. How could I escape?

I grabbed my trusty Ventoy USB stick (the same one I had used for performance tests months ago) and booted it in UEFI mode. Once in the live environment, I inspected the boot entries:

sudo efibootmgr -v

Output:

BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0000,0001
Boot0000* Windows Boot Manager ...
Boot0001* Ubuntu ...
Boot0002* USB Ventoy ...

To restore Ubuntu to the top of the boot order:

sudo efibootmgr -o 0001,0000

Console output:

BootOrder changed from 0002,0000,0001 to 0001,0000

After rebooting, the GRUB menu reappeared, listing both Ubuntu and Windows. I could finally choose my OS again without further fiddling. ๐Ÿ’ช


A Word on Secure Boot and Signed Kernels ๐Ÿ”

Since weโ€™re talking bootloaders: Secure Boot only allows EFI binaries signed with a trusted key to execute. Ubuntu Desktop ships with signed kernels and a signed shim so it boots fine out of the box. If you build your own kernel or use unsigned modules, youโ€™ll either need to sign them yourself or disable Secure Boot in firmware.


Diagram of the Boot Flow ๐Ÿ–ผ๏ธ

Hereโ€™s a visual representation of the boot process after the fix:

flowchart TD
    UEFI["โš™๏ธ UEFI Firmware BootOrder:<br/>0001 (Ubuntu) โ†’<br/>0000 (Windows)<br/>(BootCurrent: 0001)"]

    subgraph UbuntuEFI["shimx64.efi"]
        GRUB["๐Ÿ“‚ GRUB menu"]
        LINUX["๐Ÿง Ubuntu Linux<br/>kernel + initrd"]
        CHAINLOAD["๐ŸชŸ Windows<br/>bootmgfw.efi"]
    end

    subgraph WindowsEFI["bootmgfw.efi"]
        WBM["๐ŸชŸย Windowsย Bootย Manager"]
        WINOS["๐Ÿ’ป Windows 11<br/>(C:)"]
    end

    UEFI --> UbuntuEFI
    GRUB -->|boots| LINUX
    GRUB -.->|chainloads| CHAINLOAD
    UEFI --> WindowsEFI
    WBM -->|boots| WINOS

From the GRUB menu, the Windows entry chainloads bootmgfw.efi, which then points to the Windows Boot Manager, finally booting Windows itself.


First Battle Royale ๐ŸŽฎโœจ

After all the technical drama and late-night troubleshooting, I finally joined Enya and Kyra in Fortnite.

I had never played Fortnite before, but my FPS experience (Borderlands hype, anyone?) and PUBG knowledge from Viva La Dirt League on YouTube gave me a fighting chance.

We won our first Battle Royale together! ๐Ÿ†๐Ÿ’ฅ The sense of triumph was surrealโ€”after resurrecting a four-year-old Windows partition, surviving driver hell, and finally joining the game, victory felt glorious.


TL;DR: Quick Repair Steps โšก

  1. Enable os-prober in /etc/default/grub.
  2. If Windows isnโ€™t detected, try a manual GRUB entry.
  3. If boot fails, copy bootmgfw.efi from the NTFS Windows partition to /boot/efi/EFI/Microsoft/Boot/.
  4. Run sudo update-grub.
  5. If GRUB disappears after booting Windows, boot a Live USB (UEFI mode) and adjust efibootmgr to set Ubuntu first.
  6. Reboot and enjoy both OSes. ๐ŸŽ‰

This little adventure taught me more about GRUB, UEFI, and EFI files than I ever wanted to know, but it was worth it. Most importantly, I got to join my polycule in a Fortnite victory and prove that even a four-year-old Windows partition can rise again! ๐Ÿ’–๐ŸŽฎ

Dear Facebook,

We need to talk.

You and I have been together for a long time. I wrote blog posts, you provided a place to share them. For years that worked. But lately youโ€™ve been treating my posts like spam โ€” my own blog links! Apparently linking to an external site on my Page is now a cardinal sin unless I pay to โ€œboostโ€ it.
And itโ€™s not just Facebook. Threads โ€” another Meta platform โ€” also keeps taking down my blog links.

So this is goodbyeโ€ฆ at least for my Facebook Page.
Iโ€™m not deleting my personal Profile. Iโ€™ll still pop in to see what events are coming up, and to look at photos after the balfolk and festivals. But our Page-posting days are over.

Hereโ€™s why:

  • Your algorithm is a slot machine. What used to be โ€œshare and be seenโ€ has become โ€œshare, pray, and maybe pay.โ€ Iโ€™d rather drop coins in an actual jukebox than feed a zuckerbot just so friends can see my work.
  • Talking into a digital void. Posting to my Page now feels like performing in an empty theatre while an usher whispers โ€œboost post?โ€ The real conversations happen by email, on Mastodon, or โ€” imagine โ€” in real life.
  • Privacy, ads, and that creepy feeling. Every login is a reminder that Facebook isnโ€™t free. Iโ€™m paying with my data to scroll past ads for things I only muttered near my phone. Thatโ€™s not the backdrop I want for my writing.
  • The algorithm ate my audience. Remember when following a Page meant seeing its posts? Cute era. Now everythingโ€™s at the mercy of an opaque feed.
  • My house, my rules. I built amedee.be to be my own little corner of the web. No arbitrary takedowns, no algorithmic chokehold, no random โ€œspamโ€ labels. Subscribe by RSS or email and youโ€™ll get my posts in the order I publish them โ€” not the order an algorithm thinks you should.
  • Better energy elsewhere. Time spent arm-wrestling Facebook is time I could spend writing, playing the nyckelharpa, or dancing a Swedish polska at a balfolk. All of that beats arguing with a zuckerbot.

From now on, if people actually want to read what I write, theyโ€™ll find me at amedee.be, via RSS, email, or Mastodon. No algorithms, no takedowns, no mystery boxes.

So yes, weโ€™ll still bump into each other when I check events or browse photos. But the part where I dutifully feed you my blog posts? Thatโ€™s over.

With zero boosted posts and one very happy nyckelharpa,
Amedee

๐Ÿš€ Smarter CI with GitHub Actions Cache for Ansible (aka โ€œStop Downloading the Internetโ€)

Mood: Slightly annoyed at CI pipelines ๐Ÿงจ
CI runs shouldn’t feel like molasses. Here’s how I got Ansible to stop downloading the internet. You’re welcome.


Letโ€™s get one thing straight: nobody likes waiting on CI.
Not you. Not me. Not even the coffee you brewed while waiting for Galaxy roles to install โ€” again.

So I said โ€œnopeโ€ and made it snappy. Enter: GitHub Actions Cache + Ansible + a generous helping of grit and retries.

๐Ÿง™โ€โ™‚๏ธ Why cache your Ansible Galaxy installs?

Because time is money, and your CI shouldn’t feel like it’s stuck in dial-up hell.
If youโ€™ve ever screamed internally watching community.general get re-downloaded for the 73rd time this month โ€” same, buddy, same.

The fix? Cache that madness. Save your roles and collections once, and reuse like a boss.

๐Ÿ’พ The basics: caching 101

Hereโ€™s the money snippet:

path: .ansible/
key: ansible-deps-${{ hashFiles('requirements.yml') }}
restoreKeys: |
  ansible-deps-

๐Ÿง  Translation:

  • Store everything Ansible installs in .ansible/
  • Cache key changes when requirements.yml changes โ€” nice and deterministic
  • If the exact match doesnโ€™t exist, fall back to the latest vaguely-similar key

Result? Fast pipelines. Happy devs. Fewer rage-tweets.

๐Ÿ” Retry like you mean it

Letโ€™s face it: ansible-galaxy hasโ€ฆ moods.

Sometimes Galaxy API is down. Sometimes itโ€™s just bored. So instead of throwing a tantrum, I taught it patience:

for i in {1..5}; do
  if ansible-galaxy install -vv -r requirements.yml; then
    break
  else
    echo "Galaxy is being dramatic. Retrying in $((i * 10)) secondsโ€ฆ" >&2
    sleep $((i * 10))
  fi
done

Thatโ€™s five retries. With increasing delays.
๐Ÿ’ฌ “You good now, Galaxy? You sure? Because Iโ€™ve got YAML to lint.”

โš ๏ธ The catch (a.k.a. cache wars)

Hereโ€™s where things get spicy:

actions/cache only saves when a job finishes successfully.

So if two jobs try to save the exact same cache at the same time?
๐Ÿ’ฅ Boom. Collision. One wins. The other walks away salty:

Unable to reserve cache with key ansible-deps-...,
another job may be creating this cache.

Rude.

๐ŸงŠ Fix: preload the cache in a separate job

The solution is elegant:
Warm-up job. One that only does Galaxy installs and saves the cache. All your other jobs just consume it. Zero drama. Maximum speed. ๐Ÿ’ƒ

๐Ÿช„ Tempted to symlink instead of copy?

Yeah, I thought about it too.
“But what if we symlink .ansible/ and skip the copy?”

Nah. Not worth the brainpower. Just cache the thing directly.
โœ… It works. ๐Ÿงผ Itโ€™s clean. ๐Ÿ˜Œ You sleep better.

๐Ÿง  Pro tips

  • Use the hash of requirements.yml as your cache key. Trust me.
  • Add a fallback prefix like ansible-deps- so youโ€™re never left cold.
  • Donโ€™t overthink it. Let the cache work for you, not the other way around.

โœจ TL;DR

  • โœ… GitHub Actions cache = fast pipelines
  • โœ… Smart keys based on requirements.yml = consistency
  • โœ… Retry loops = less flakiness
  • โœ… Preload job = no more cache collisions
  • โŒ Re-downloading Galaxy junk every time = madness

๐Ÿ”ฅ Go forth and cache like a pro.

Got better tricks? Hit me up on Mastodon and show me your CI magic.
And remember: Friends donโ€™t let friends wait on Galaxy.

๐Ÿ’š Peace, love, and fewer ansible-galaxy downloads.