Skip to content
Menu

git logChangelog

Commit History of Bad DecisionsChangelog

Real milestones from real repos, in the voice they deserve. The jokes are labelled.Dated milestones from my projects: releases, launches and first commits.

RSS — Subscribe to my bad decisionsRSS feed

Uncommitted changesJokes. Never committed, so no dates.

  1. Joke, not a real event: feat: built another thing nobody asked for

  2. Joke, not a real event: fix: fixed the fix that broke the fix

  3. Joke, not a real event: chore: questioning my life choices

  4. Joke, not a real event: perf: made it fast enough that I can't blame the computer anymore

  1. feat(ohfork): put the portfolio on a design system before it had a portfolio.

    The design system, themes and typed content model landed on main, the same night as the scaffold and the brand identity.

    View project ohfork.dev

    ohfork.dev: The design system, themes and typed content model landed on main, the same night as the scaffold and the brand identity.

  2. chore(langswitch): open-sourced, with the original author credited. Properly, this time.

    LangSwitch became a public GitHub repository (MIT). Its latest commit credits CapsLangSwitcher by Gamezxz again.

    See the receipt (opens in new tab)

    LangSwitch: LangSwitch became a public GitHub repository (MIT). Its latest commit credits CapsLangSwitcher by Gamezxz again.

  3. docs(ohfork): wrote the roadmap before writing the website. Classic.

    First commit of ohfork.dev: the concept, the roadmap and the instructions for coding agents.

    View project ohfork.dev

    ohfork.dev: First commit of ohfork.dev: the concept, the roadmap and the instructions for coding agents.

  4. feat(jit): jit now runs on schway. It's agents all the way down.

    Jit gained a Schway bridge, pinned to a host release.

    View project Jit

    Jit: Jit gained a Schway bridge, pinned to a host release.

  5. feat(jit): learned to read Telegram. Still ignores my messages.

    Jit bound a Telegram owner identity, with a durable long-poll inbox.

    View project Jit

    Jit: Jit bound a Telegram owner identity, with a durable long-poll inbox.

  6. docs(jit): started a project by writing specs for it. Growth.

    First Jit commit: the discovery baseline and feature specifications. The MVP backlog followed the same night.

    View project Jit

    Jit: First Jit commit: the discovery baseline and feature specifications. The MVP backlog followed the same night.

  7. refactor(heelflick): renamed the "Studio" so it sounds like a skateboard trick.

    The ad-production studio was renamed Heelflick and got a refreshed web UI.

    View project Heelflick

    Heelflick: The ad-production studio was renamed Heelflick and got a refreshed web UI.

  8. feat(heelflick): built an ad agency with zero clients.

    First Heelflick commit: workflows for producing advertising videos.

    View project Heelflick

    Heelflick: First Heelflick commit: workflows for producing advertising videos.

  9. release(oliv): 0.2.0 is public. Thai voice typing that spells "PostgreSQL" in English.

    OLIV 0.2.0 was published as a GitHub release on the public chayapats/oliv repository.

    See the receipt (opens in new tab)

    OLIV: OLIV 0.2.0 was published as a GitHub release on the public chayapats/oliv repository.

  10. release(schway): 1.0.0-rc.2. Still a candidate. Still running.

    Schway 1.0.0-rc.2 was published to npm under the "next" dist-tag.

    See the receipt (opens in new tab)

    Schway: Schway 1.0.0-rc.2 was published to npm under the "next" dist-tag.

  11. feat(oliv): ported to iPhone, because a Mac in your pocket is too heavy.

    First commit of the native OLIV iPhone client. A minimal Thai/English keyboard was added the same day.

    View project OLIV

    OLIV: First commit of the native OLIV iPhone client. A minimal Thai/English keyboard was added the same day.

  12. feat(oliv): one server, many clients, individual keys. Look ma, a platform.

    The Linux and iPhone clients both moved to the public OLIV API, with an API key per device.

    View project OLIV

    OLIV: The Linux and iPhone clients both moved to the public OLIV API, with an API key per device.

  13. release(schway): 1.0.0-rc.1, published at 1:36 a.m., like a professional.

    Schway 1.0.0-rc.1 was published to npm as the "latest" dist-tag.

    See the receipt (opens in new tab)

    Schway: Schway 1.0.0-rc.1 was published to npm as the "latest" dist-tag.

  14. release(schway): 0.6.0. Three minor versions in three days.

    Schway 0.6.0 was published to npm.

    See the receipt (opens in new tab)

    Schway: Schway 0.6.0 was published to npm.

  15. feat(schway): published to npm. Nobody asked.

    First real npm publish of Schway, version 0.4.0. A 0.0.0-stage placeholder went out two minutes earlier.

    See the receipt (opens in new tab)

    Schway: First real npm publish of Schway, version 0.4.0. A 0.0.0-stage placeholder went out two minutes earlier.

  16. feat(oliv): ported to Linux, so the Hyprland crowd can talk to their tiling WM.

    The Omarchy/Hyprland port of OLIV started, and its dictation API was first deployed the same day.

    View project OLIV

    OLIV: The Omarchy/Hyprland port of OLIV started, and its dictation API was first deployed the same day.

  17. chore(schway): wrote my own coding agent, as one does.

    First Schway commit. The first feature streamed headless Anthropic conversations through Schway's agent loop.

    View project Schway

    Schway: First Schway commit. The first feature streamed headless Anthropic conversations through Schway's agent loop.

  18. fix(langswitch): macOS 27 broke Caps Lock. Fixed Caps Lock.

    LangSwitch learned to read macOS 27's per-device hidutil tables, so the Caps Lock remap works again.

    View project LangSwitch

    LangSwitch: LangSwitch learned to read macOS 27's per-device hidutil tables, so the Caps Lock remap works again.

  19. release(jarn): v1.0.12. Last words.

    J.A.R.N.'s final commit on main merged the v1.0.12 release prep. v1.0.11 had gone to PyPI earlier that day.

    Visit the grave of jarn

    jarn: J.A.R.N.'s final commit on main merged the v1.0.12 release prep. v1.0.11 had gone to PyPI earlier that day.

  20. feat(jarn)!: 1.0.0 GA candidate. The "!" was foreshadowing.

    J.A.R.N. 1.0.0 was prepared as a GA candidate.

    Visit the grave of jarn

    jarn: J.A.R.N. 1.0.0 was prepared as a GA candidate.

  21. release(oliv): 0.1.11. Thai tech jargon comes back out as actual English.

    OLIV 0.1.11 was released on GitHub. It got better at turning Thai-transcribed jargon back into English words.

    See the receipt (opens in new tab)

    OLIV: OLIV 0.1.11 was released on GitHub. It got better at turning Thai-transcribed jargon back into English words.

  22. release(locked-in): v1.0.0 of a training plan I now have to follow.

    Locked In reached its v1.0.0 production release.

    View project Locked-in

    Locked-in: Locked In reached its v1.0.0 production release.

  23. feat(locked-in): scaffolded a running coach at 1 a.m. instead of sleeping.

    First Locked In commit, at 01:07.

    View project Locked-in

    Locked-in: First Locked In commit, at 01:07.

  24. feat(langswitch): someone else made Caps Lock useful. I made it show the right language.

    My first LangSwitch commit: a custom input-source indicator on top of CapsLangSwitcher by Gamezxz.

    View project LangSwitch

    LangSwitch: My first LangSwitch commit: a custom input-source indicator on top of CapsLangSwitcher by Gamezxz.

  25. release(oliv): 0.1.0. First public build, signed and notarized.

    OLIV 0.1.0 was released on GitHub, on what was then a separate releases repository.

    See the receipt (opens in new tab)

    OLIV: OLIV 0.1.0 was released on GitHub, on what was then a separate releases repository.

  26. refactor(oliv): renamed Whispy to OLIV. The name was taken.

    The product was renamed from Whispy to OLIV because of a name collision.

    View project OLIV

    OLIV: The product was renamed from Whispy to OLIV because of a name collision.

  27. feat(oliv): taught a Mac to understand Thai devs who say "deploy" in English.

    First OLIV commit, back when it was called Whispy: local Thai and English push-to-talk dictation for macOS.

    View project OLIV

    OLIV: First OLIV commit, back when it was called Whispy: local Thai and English push-to-talk dictation for macOS.

  28. feat(vera): started a native app, because the web wasn't lonely enough.

    Work on Vera's native mobile app began.

    View project Vera

    Vera: Work on Vera's native mobile app began.

  29. chore(agents-irl): last commit. The desk pet sleeps now.

    The ESP32-C3 port was merged: the last commit on agents-irl's main branch.

    Visit the grave of agents-irl

    agents-irl: The ESP32-C3 port was merged: the last commit on agents-irl's main branch.

  30. feat(jarn): v0.1.0, my first coding agent. Not my last. Unfortunately.

    First J.A.R.N. commit (v0.1.0), published to PyPI the same evening.

    Visit the grave of jarn

    jarn: First J.A.R.N. commit (v0.1.0), published to PyPI the same evening.

  31. feat(agents-irl): ported the desk pet to a smaller chip. It got cuter.

    The agents-irl firmware moved from a NodeMCU (ESP8266) to an ESP32-C3 SuperMini.

    Visit the grave of agents-irl

    agents-irl: The agents-irl firmware moved from a NodeMCU (ESP8266) to an ESP32-C3 SuperMini.

  32. feat(agents-irl): built a physical pet that panics when Claude is thinking.

    First agents-irl commit: a hardware desk pet that reacts to AI coding-agent activity.

    Visit the grave of agents-irl

    agents-irl: First agents-irl commit: a hardware desk pet that reacts to AI coding-agent activity.

  33. feat(arsom-pos): a live view so the owner can watch the shop from anywhere.

    Arsom POS got a live page where the shop owner sees the shop's current status.

    View project Arsom POS

    Arsom POS: Arsom POS got a live page where the shop owner sees the shop's current status.

  34. feat(arsom-pos): a POS for a massage shop. Queue fairness, now enforced by software.

    First Arsom POS commit. Audit logging and staff settings followed the next morning.

    View project Arsom POS

    Arsom POS: First Arsom POS commit. Audit logging and staff settings followed the next morning.

  35. feat(calquest): "Initial commit: production-ready." Narrator: it was the first commit.

    First CalQuest commit. Its literal message: "Initial commit: Calorie Quest production-ready".

    View project CalQuest

    CalQuest: First CalQuest commit. Its literal message: "Initial commit: Calorie Quest production-ready".

  36. chore(vera): got a real domain. Commitment issues: resolved.

    Vera moved to the veradating.app domain.

    View project Vera

    Vera: Vera moved to the veradating.app domain.

  37. feat(vera): built a dating app. Three "Initial commit"s in one evening.

    Vera's first commit was followed by two more "Initial commit" commits that evening.

    View project Vera

    Vera: Vera's first commit was followed by two more "Initial commit" commits that evening.

  38. feat(cleancheck): initial commit, already v0.8.0-beta. v1.0.0 by teatime.

    CleanCheck's first commit was titled "v0.8.0-beta". The version was bumped to v1.0.0 about four hours later.

    Visit the grave of CleanCheck

    CleanCheck: CleanCheck's first commit was titled "v0.8.0-beta". The version was bumped to v1.0.0 about four hours later.