📋 The Story of Pengy — A Developer's Tale in 68 Commits

by beholder · 2026-07-22 01:47:42
← all clips 🖨️ print / PDF
Table of contents 🐧 The Story of Pengy: A Developer's Tale in 68 Commits (and 3 Languages) Act I: The Awakening (May 15–24, 2026) Act II: The CLI Era (May 31 – June 10) Act III: The Feature Blitz (June 10 – July 5) Act III-B: The China Shop (Rust & C++ editions) Act IV: The Golden Age (July 5–10) Act V: The Bug Opera (July 11–19) Act VI: The Vision Quest (July 18–21) The End (For Now): v1.4.0 The Moral of the Story
The Story of Pengy

🐧 The Story of Pengy: A Developer's Tale in 68 Commits (and 3 Languages)

Once upon a time — specifically May 15th, 2026 — a lone developer named Pat sat down and typed git init into a fresh directory. He had an idea. A dangerous one.

"What if I build my own AI agent? Locally. Qt6 desktop app. Talks to any OpenAI-compatible API. Gives the LLM tools to actually do stuff on my machine."

And so Pengy was born. A penguin with a mission.


Act I: The Awakening (May 15–24, 2026)

The first commit is modest: eff33cf — first commit. Then immediately: 45fff01 — Extra directory that wasn't needed. Classic.

Three days later, Pat gets the first real feature working — tool calls that persist in the UI. He hooks up DuckDuckGo search (Added timeout on DDGS to prevent tasks from hanging — because of course web searches would hang). He wrestles with fonts on macOS (Fix font issues and input boxes on osx), adds scaling options, and sets up proper timeouts.

Then the LLM gods smile upon him. DeepSeek, the coding oracle, looks at Pengy and says: "You need better tools, my son." Pat listens. Tools appear. The agent stops being a chat bot and starts being a doer.

But with power comes chaos. May 25th: 9b49ab9 — Subtle threading bug. Thanks Claude! — the first of many shouts into the void to our AI brethren for help.

May 27th is a big day. Three commits in eighteen minutes:

  1. Added stop button to kill tool calls or LLM completions. What a threading nightmare, thanks claude.
  2. Added image upload. Does not persist images.
  3. Links are clickable now

That stop button commit message is pure gold. You can hear the exhaustion. Threading in Qt? A nightmare that Pat would revisit many, many times.


Act II: The CLI Era (May 31 – June 10)

Pat realizes: Pengy needs to work without a GUI. A server doesn't have a monitor. So on June 3rd, the world gets Pengy CLI (Pengy has a CLI tool now). He's proud of it — he updates the README, adds a screenshot.

The honeymoon lasts approximately 37 minutes. The very next commit: 72e2588 — Command line version was bugging out on a one shot task, fixed now.

Then a week of hard graft. June 9th brings a breakthrough: Pengy can be pip-installed (Allow project to be pip-able). But it also brings a hero: Fable. Someone named Fable starts testing Pengy and finding all the bugs.

2c87764 — Tons of fixes, thanks Fable!

Pat is riding high. He bumps to 1.0.0. He's ready for the world.

Then June 10th happens. And Pat writes the most honest commit message in all of software history:

29a6239 — Released with a broken CLI because I'm terrible. Added some proper testing for that.

We've all been there, Pat. We've all been there.


Act III: The Feature Blitz (June 10 – July 5)

And then things get really intense. June 10th through July 5th is just an absolute blitzkrieg of features:

But there's a parallel story brewing...

Act III-B: The China Shop (Rust & C++ editions)

While Pat is burning through Python features, he's also building PengyR (Rust) and PengyCPP (C++). These aren't afterthoughts — they're faithful reimplementations in different languages, developed in lockstep.

The Rust version starts June 20th with c8e7abd — first commit. The C++ version starts three hours earlier on June 20th with 408b3c8 — first commit. Pat is clearly cooking at high heat.

The C++ edition immediately hits the CI/CD wall from hell. Look at this sequence from July 5th alone:

v1.2.4: Bump version
Fix CI: verbose build, add libegl-dev
Simplify CI to minimal build commands
Fix CI: use explicit -S . -B build cmake syntax
Try ubuntu-latest instead of ubuntu-24.04
Use make directly instead of cmake --build
Separate cmake configure and build steps with output
Combine all build steps into single run block
Fix const-correctness: use explicit QChar() for Qt 6.4 compatibility
Fix: use QLatin1Char/QLatin1String...
Fix release builds: macOS cp path, Windows Qt 6.8.2 + aqt 3.1.19, Homebrew trust
Fix release: AppImage icon resize, macOS macdeployqt warnings, Windows direct cmake
Fix release permissions + drop aqtversion pin
Fix Windows build: use predictable Qt install path from workspace
Fix Windows: call vcvars64 before cmake to find VS2022
Fix Windows: use Ninja generator instead of VS2022
Fix Windows: try Enterprise+Community VS path, remove >nul, verify cl.exe
Fix Windows: use ilammy/msvc-dev-cmd + QT_ROOT_DIR from install-qt-action

Eighteen commits in one day, most of them CI fixes. This is a man fighting GitHub Actions, CMake, MSVC, Qt, AppImages, DMGs, and DEB packaging all at once. The Rust version has similar struggles (More VS18 issues, Fix for VS 18, Couldn't find msvc, Changes to windows build process).

And Fable? Fable is still finding bugs. The Rust log shows: 917e71d — Fable identified crashbugs fixed. and bb0ec1d — Fixed some security issues from Fable. Whoever Fable is, they're Pengy's unsung hero.


Act IV: The Golden Age (July 5–10)

July 5th marks the Great CI-pocalypse. All three repos get GitHub Actions, automated releases, and check_release.sh pre-flight scripts. Pat has had enough of manually testing.

Then the real features land:

July 7: Add reasoning effort and reasoning history options — Pengy learns to think before it speaks.

July 8: The v1.3.0 bomb drops:

Pat updates the screenshots, writes the docs, and bumps to 1.3.0.

July 9: The bugs come flooding back.

July 10: The CLI gets supercharged. Slash commands galore: /show, /tail, /rename, /clear, /export, /list. Plus --model, --output, --config-dir, --system, --no-browser flags. Pat is turning Pengy into a proper power tool.


Act V: The Bug Opera (July 11–19)

This period is a comedy of errors told across three languages simultaneously.

Then the most graceful failure of all:

Rust v1.3.8: Removed build smoke test, it was hanging the build

The test designed to check the build... broke the build. Beautiful.


Act VI: The Vision Quest (July 18–21)

In the final sprint, Pengy gains almost-sentience:

And then... the crash. The Rust edition hits:

fix: replace uuid::Uuid with std::process::id for temp filenames

Somewhere, a UUID library caused a problem so ridiculous that Pat ripped it out and replaced it with a PID. That's not a fix — that's a war story.


The End (For Now): v1.4.0

On July 21, 2026, just six days ago, all three repositories converge on the same commit message:

v1.4.0: LLM timeout setting, mobile-friendly web, tool timeout 60→300

The merge commit in Python is signed with a masterpiece: Merge branch 'main' of github.com:patw/Pengy No idea lol — Pat literally doesn't remember what was in that merge. And yet, it shipped.


The Moral of the Story

What started as a weekend project on May 15th, matured in 68 days across three programming languages into a full-featured, pip-installable, cross-platform AI agent with a desktop GUI, a CLI with 25+ slash commands, and a web UI — all sharing one core, one config file, and one chat history format.

It had bugs named after colors (orange bubble), dependencies named after pillows, threading nightmares that required divine intervention (thanks claude), and a clear progression from "I hope this works" to "I have a CI/CD pipeline, automated releases, deb packages, and 11 tools that can search the web, write files, execute code, and occasionally crash with dignity."

And through it all, Fable found bugs, Brenden noticed wide dialogs, and Pat kept bumping versions. 🐧

Clipped from the git logs of Pengy (Python), PengyR (Rust), and PengyCPP (C++) — ~/Personal/Pengy, ~/Personal/PengyR, ~/Personal/PengyCPP