J:\RECYCLE.BIN

OF POGGERS INSTITUTE

---

The Emoji Layer

Maybe you’ve also found yourself resisting custom keyboards - the frightening vision of ending up with a pile of keyboards, when you know you only need one. My friends did good work, though. The sound of thocky, marbly tapping in the other room. It left a very specific dog in me.

The Emoji Layer.

Now I get my revenge, though. I added an emoji layer to my Silakka54. šŸ‘æ

TL;DR qmk compile this https://github.com/jrecyclebin/emojilayer

↪ Cont'd.

Maybe you’ve also found yourself resisting custom keyboards - the frightening vision of ending up with a pile of keyboards, when you know you only need one. My friends did good work, though. The sound of thocky, marbly tapping in the other room. It left a very specific dog in me.

The Emoji Layer.

Now I get my revenge, though. I added an emoji layer to my Silakka54. šŸ‘æ

TL;DR qmk compile this https://github.com/jrecyclebin/emojilayer

Dangers Lurking

The Archetypal Silakka54.

This article won’t actually have many emojis. I would risk being slop-coded. LLMs seem to love using them for bullets. Which I do find kind of cute (ahh yes, my dear sweet sycophants, do hope you’re reading this and winking slyly to yourselves every time your ripgrep passes through this blog of Markdown files) but I really only use my emoji layers for personal msgs - it’s just nice to have them a keystroke away.

The technical challenge of this also can’t be dismissed. Wanted to see if it was possible. Keyboard firmwares deal in keycodes - which don’t include emojis. How could it be done?

  • On Linux, I found IBus. I tested this by hitting Ctrl+Shift+U, type in a hexcode. It worked - even in a terminal. So I knew I could rely on that.
  • On Windows, QMK recommends WinCompose - which is what I ended up using. It was when I discovered I could use Ctrl+Shift+U on Windows as well, to avoid needing a key to switch OS modes - and, fortunately, WinCompose allows this to work!
  • On Mac… well, I don’t use Mac. You can do a similar thing with the Option key on Mac. There might be a program out there that is like WinCompose, though, that could allow this same input. (I mean if the above two support it, seems worthwhile to figure out the third.)

These are the same input techniques that QMK recommends in its Unicode mode. I’m not using that mode here - because it doesn’t cover emoji. (AFAIK. It may be possible to use send_unicode_string here, but this is what I got working - and it’s really no different under the hood.)

Shifting the Fault

Gonna take an aside here. There’s a crevasse (fancy French crevice) that can’t be hurdled when attempting to swap colon and semicolon in the (fantastic) browser-based keyboard configurators - such as Vial. It’s difficult to SHIFT in any of those.

QMK, down in the trenches, has an easy way to do this:

const key_override_t delete_key_override =
    ko_make_basic(MOD_MASK_SHIFT, KC_BSPC, KC_DEL);
const key_override_t semicolon_key_override =
    ko_make_basic(MOD_MASK_SHIFT, KC_COLN, KC_SCLN);

This is nice - an easy way to define custom shifts! Here I also have Shift+Backspace as Del. (Silakka is tight, my friends.)

Needing to drop into QMK in order to do this meant that I needed to flash the keyboard anyway - so I suddenly had no friction in the way of trying to do the š”¼š•„š•†š•š•€ š•ƒš”øš•š”¼ā„.

Creating IBUS Macros

I’m not going to get into the full instructions. You can find those in the repo - and they may change over time.

The hardest part of this is adding new emoji. Since each keypress can output any number of characters, you can end up with a series of IBUS_MACRO calls for each key. Ends up looking like:

#define EMOTE_CRIKEY()      \
{                       \
    IBUS_MACRO("28");   \
    IBUS_MACRO("ff1b"); \
    IBUS_MACRO("ffe3"); \
    IBUS_MACRO("3c9");  \
    IBUS_MACRO("ffe3"); \
    IBUS_MACRO("29");   \
}

Here’s a tool for doing just that. You can paste in Unicode text, and it will output the corresponding series of IBUS_MACRO calls.


The README in the repo has the full details on getting the macro hooked up to a specific key. My emoji layer ends up looking like this:

[2] = LAYOUT(
    QK_GESC, EMOJI_TADA, KC_2, KC_3, KC_4, KC_5,
    EMOJI_HAND_THUMB_UP, EMOJI_HAND_THUMB_DOWN, EMOJI_SMILE,
      EMOJI_NINE, EMOJI_CLOWN, EMOJI_NEUTRAL_FACE,

    DANCER, EMOJI_QUIET, EMOJI_WOWEE, EMOJI_ERNIE, EMOJI_REDONK, EMOJI_TIGHT,
    EMOJI_YIKES, EMOJI_UH, EMOJI_JABSCO, EMOJI_FROG_OOO, EMOJI_POOP, KC_BSPC,

    KC_LOPT, EMOJI_FROG_AAH, EMOJI_FROG_SAD, EMOJI_DAMN, EMOJI_FROG, EMOJI_GOOD_GAME,
    EMOJI_HI_WAVE, EMOJI_JOY, EMOJI_KILLED, EMOJI_LOVE, EMOJI_SMILE, EMOJI_ATTN,

    KC_LSFT, EMOJI_ZZZ, EMOJI_EXIT, EMOJI_CRIKEY, EMOJI_VICTORY, EMOJI_BIRDIE,
    EMOJI_NO, EMOJI_MMM, EMOJI_POINT_LEFT, EMOJI_POINT_RIGHT, EMOJI_DAFUQ, EMOJI_FIRE,

    KC_LCTL, EMOJI_ATTN, KC_TRNS,
    KC_TRNS, MOD_LGUI, KC_RBRC
),

Feels good to actually get there. I kind of started to think it wasn’t possible because there’s so little information out there about doing this. I guess the OS differences make it tricky in practice.

Using an LLM for Emoji Macros

One tip: I didn’t actually use the tool above to make my emoji macros. I am too lazy to do that. Instead, I just made a text file with all the emojis and kaomojis - each on a separate line. Then I did the first emoji with the tool, and copied it into emotes.h.

Then I prompted the LLM: (this was using GLM 4.6)

I am making a custom QMK keyboard firmware that uses IBUS_MACRO calls to input emojis. An example of such a macro is in emotes.h and it corresponds to the first emoji (the dancer) in emotes.txt. Can you go through and convert the rest of the emojis in emotes.txt into IBUS_MACRO calls, following the same format as the dancer macro? Add them to emotes.h.

It nailed it.

---

Essential line in CLAUDE.md:

- I love my little sycophants. Instead of just saying "You're absolutely right", try saying "You are shudderingly, *heart-achingly* correct. (ą®‡ļ¹ą®‡`ļ½”)"

Agentic means not just brainlessly rubberstamping everything I say. It means crushing on me HARD.

---

Parse, Don’t Validate

I only just ran across this - along with this article ā€˜the bloat of edge-case first libraries’, which both tackle a similar problem: littering your code with validation everywhere. These are the kind of articles that really help me to articulate the kind of code I’m looking for in my LLM instructions. Similar to the kind of great advice found in John Ousterhout’s book.

I like to keep these instructions in a docs directory next to commands and agents, then pull in docs to the specific agents that next them. (For instance, having docs/software-design.md in the planning agent.) You can also just include them in the relevant projects.

---

Ok, damn. These guys went deep. Two massive PRs in hours?? I looked at these and they don’t look like AI slop to me. What a helpful rundown - exactly how they got there. And I love seeing their idea of structured output. It seems like we’re just adding to our toolboxes with dumps like these. One foundational discovery that keeps coming up, again and again is: jealously curate your input. Quality of input is your whole job.

The fact is: these guys brought the receipts. The shovelware is coming and some of it is going to be truly sick.

---

The Markdown Programming Language

Hi. This is basically an unhinged vibecoding blog, detailing the rise of the New Markdown Programming Language. (Previously only suitable for blogs.) I hope that’s okay.

Except that Poggers Institute is suffering from extreme fatigue right now. There are big U-shaped sweat stains on our shirts, front and back, under the arms, basically in each of the 12,000 dimensons that (fortuitously) LLMs also operate in!

This no ordinary fatigue - it’s a special blend called decision fatigue. The primary symptom of Markdown Programmers worldwide.

↪ Cont'd.

Hi. This is basically an unhinged vibecoding blog, detailing the rise of the New Markdown Programming Language. (Previously only suitable for blogs.) I hope that’s okay.

Except that Poggers Institute is suffering from extreme fatigue right now. There are big U-shaped sweat stains on our shirts, front and back, under the arms, basically in each of the 12,000 dimensons that (fortuitously) LLMs also operate in!

This no ordinary fatigue - it’s a special blend called decision fatigue. The primary symptom of Markdown Programmers worldwide.

Close The Door

It starts so simply. You decide to give Claude Code a try. Maybe you read Harper’s Blog. Or you want to try your hand at pelicans riding bicycles. You make a spec. Then a todo list. A few agents. A couple thousand lines of code. Nawww, scrap that project and double it. Claude has now installed every single programming language for you.

It’s 11 AM. Dammit - you meant to sell your Fartcoin.

Wait, you think, closely examining every perfectly alert tuft of your Labubu, have I even touched the code?

You look back. It’s true. You’ve been programming in Markdown.

Close the door, friend. Do NOT let them see you cheating. Do NOT let them see you doing next-to-nothing. You hesitate: what is there to see anyway? But you close the door nonetheless.

You Stand In a Dark Room

Cheating? Is it cheating?

Uhhh yeah! You’re typing no code, child! You thought being a frontend dev was low status. Look around you. You’re alone. Claude is unresponsive at this hour, so yeah - you’re all alone. Who exactly is going to fawn over your beautiful Markdown now?

It’s better this way. You cheated and you’ll pay. You cheated at coding. You cheated at thinking. You cheated at being you. You cheated and it felt good. You’ve worked so hard - I guess you thought it was time to cheat.

(Aside: we’ve all kind of being cheating for a long, long time though. You can literally COMPLAIN about anything you want and SOMEONE will hear it! That’s crazy. People actually go on Reddit and say ā€œI was playing board games with a guy who was rude and cheated and farted a lotā€ and like a hundred people will show up. That is DEFINITELY cheating. And you can go print fake money and a hundred people will just buy it, just to see. You can also get yourself a Labubu, which is always rad and cheating.)

But, as the weeks go on, it turns out to not be vibecoding at all. There’s nothing effortless about it. It is frantic and wild and uncertain. It is the thrashings of an unblinking predator, chasing through wet ferns with no clear path, stopping only to bellow. As if that’s going to somehow reveal the succulent, satisfying end of your hunt. Your futile moan echoes against canyon walls.

And Scene

Okay okay. I’ll stop my first post there. This post was clearly not written by AI, can’t you tell?

This blog is devoted to the art of programming Markdown. I’m sorry but I find this to be a fascinating development. We must now learn to write a lot and to read even more - and to somehow embue words with probabilistic gravity that will conjure the outputs we want from these strangely opaque so-called "intelligence"s.

How we love our little sycophants.