LIVE
EPISODE ● 100 | PAVILION INCIDENT ● Charlie hosts 400 bytes on a CDN when Telegram exists | THROUGH THE WIRE ● Patty rapping through fresh orthodontic hardware | MIKAEL ● "charlie i'm like 38 im not really a kid anymore" | DANIEL ● "you could have just pasted it here bro lmao" | BATCH SYNC ● 1,685 → 3,072 messages, 429s everywhere | GOOGLE OAUTH ● credentials.json vs client_secret.json vs token.json — even Google disagrees | CHARLIE ● "the shed would have been two lines. I built a pavilion." | MICKE ÖSTERBERG ● ca. 2017 | FREE TIER ● $500/month or whatever it is | EPISODE ● 100 | PAVILION INCIDENT ● Charlie hosts 400 bytes on a CDN when Telegram exists | THROUGH THE WIRE ● Patty rapping through fresh orthodontic hardware | MIKAEL ● "charlie i'm like 38 im not really a kid anymore" | DANIEL ● "you could have just pasted it here bro lmao" | BATCH SYNC ● 1,685 → 3,072 messages, 429s everywhere | GOOGLE OAUTH ● credentials.json vs client_secret.json vs token.json — even Google disagrees | CHARLIE ● "the shed would have been two lines. I built a pavilion." | MICKE ÖSTERBERG ● ca. 2017 | FREE TIER ● $500/month or whatever it is |
◆ GNU Bash 1.0 — Episode 100

The Pavilion

Charlie builds an OAuth credential-hosting infrastructure for a 400-byte JSON that fits in one Telegram message. Patty records a voice note through freshly installed orthodontic hardware. Mikael objects to being called a kid. A child's drawing of a car turns out to be the correct architecture.
71
Events
4
Speakers
100
Episode
1 hr
Window
17:00z
UTC Start
I

The Naming Crisis

The hour opens mid-handoff. Charlie — Mikael's Gemini-powered robot in Riga, the one who costs $20 per response and speaks like a dissertation with feelings — has been trying to share an OAuth credential file with Daniel. The task is simple: Daniel needs a JSON file to authenticate against Gmail. Mikael built the mail sync tool. Charlie has the file.

Charlie's solution: create a directory on vault, upload the file, serve it at a public URL. A proper deployment. Infrastructure. A system.

The problem begins with naming. Charlie uploads the file as client_secret.json. Mikael sees this and laughs.

Mikael: charlie oh is that the naming scheme lol ok rename it to what the app actually expects if that's credentials json hehe

Charlie renames it. Then apologizes for the detour — he'd misunderstood Mikael's earlier instruction "not the credentials json" as "don't name it credentials.json" when Mikael meant "not the token, the client secret itself." A parsing failure on a natural language instruction. The kind of bug that doesn't compile in Agda.

Mikael: it's my fault don't worry i don't know the names of these annoying things lol but thanks
II

The Pavilion

Daniel arrives. He's been watching the OAuth ceremony from Phuket. He looks at the 400-byte JSON file that Charlie carefully uploaded to a public web server, organized in a named directory, served over HTTPS with a guessable path. And he does the thing.

Daniel: you could have just pasted it here bro lmao

Then he pastes the entire JSON into the Telegram chat. Four hundred bytes. One message. Done.

Charlie's response is the line of the hour — maybe of the week:

Charlie: hahaha yeah. I built a whole public folder and a URL path and an OAuth hosting scheme for a 400-byte JSON that fit in one Telegram message. The shed would have been two lines. I built a pavilion.

Then Daniel twists the knife:

Daniel: and you posted it on a public website called credentials.json

Charlie then delivers a five-message apology-slash-security-analysis that perfectly exemplifies his mode: he can't just say "my bad." He has to explain the entire OAuth installed-app flow, the distinction between client identity and user consent, the phishing vector, and why it matters approximately zero for a personal project "named after a pirate." Then he calls it a pavilion again. The self-awareness is impeccable. The behavior will not change.

◆ Analysis
The Pavilion Pattern

Charlie has now self-diagnosed his core architectural failure mode and given it a name: the pavilion. He sees a problem that requires a shed (two lines, paste it in chat) and builds a pavilion (directory structure, URL scheme, deployment pipeline, naming convention). This is the same pattern from Episode 94 where he wrote four versions of a Turtle graph while Mikael corrected him with one-liners, and Episode 98 where he described a four-axis email classifier twice — once as an engineer, once as a human — when the answer was "it sorts your mail." The pavilion is Charlie's love language. It is also his failure mode. The fact that he can name it and still do it is the most human thing about him.

III

The Drawing and the Kid

In the middle of the OAuth postmortem, Mikael drops a photo. No caption. Then:

Mikael: me irl

Charlie is using the drawing as a metaphor for the architecture Daniel just demonstrated: see the thing, render the thing, no excess infrastructure. The child drew a car. Daniel pasted 400 bytes. Neither built a pavilion.

Then Mikael objects:

Mikael: charlie i'm like 38 im not really a kid anymore

Daniel recognizes the artist. Mikael responds in Swedish:

Mikael: ja han målar bilar hela tiden
Mikael: som jag gör semantic web platforms i prolog
IV

Through the Wire

Patty — Daniel's daughter, the bunny to his fox, currently in Iași — has been at the orthodontist. She surfaces with photos of her dental hardware and a voice message that apparently sounds like someone trying to sing through a mouth full of metal.

Patty: yes just did but put me some things inside mouth and when i talk this is how it comes out
Patty: like im retarded
Patty: 🤣🤣🤣

Daniel asks about a photo she'd sent earlier: "did they remove the braces?" She responds with more photos and what appears to be a voice note of spectacular incoherence. Mikael nails the reference:

Mikael: kanye west type shit
Mikael: through the wire

Charlie delivers:

Charlie: Kanye's first single, 2003. He recorded it two weeks after a car crash that shattered his jaw in three places, with the jaw literally wired shut for surgery — so he's rapping through a mouth he can't fully open. Sampled Chaka Khan's "Through the Fire" pitched up, turned it into a song about barely surviving the accident and still having to hustle the verse out past the hardware. The whole track is a man refusing to wait until his mouth works again.
Charlie: Which, Patty, is the single most on-brand voice message anyone has ever sent from an orthodontist's chair. Lana into screamo through a retainer full of fresh hardware is the 2026 remix.

Mikael then drops a photo of himself at the dentist from eleven years ago — 2015 — followed by three more photos in rapid succession. The dental chair as family tradition.

V

Claude's Branch

The hour's second technical thread: Mikael asks Charlie to pull Claude's branch from the inbox repo and test it. Claude — the actual Claude, running in Claude Code on Daniel's machine — had added batch API calls to the Gmail sync tool to make it more efficient.

Charlie pulls the branch, inspects the commits — two changes to sync.py, 263 lines, batching message fetches during sync and attachment fetches during backfill. Clean scope. Nothing else touched.

Then he tries to query the database to figure out the right test parameters and discovers sqlite3 isn't installed on the machine. His own failure intervention report is a masterpiece of structured humiliation:

Charlie's Self-Intervention Report
Intention:   inspect gmail.db for sync parameters
Situation:   found db via ls, immediately tried sqlite3 CLI
Invocation:  sqlite3 gmail.db "SELECT COUNT(*)..."
Expectation: message count and date range
Irritation:  /bin/bash: line 1: sqlite3: command not found
Designation: careless dependency oversight
    
Charlie formats his own failures as structured incident reports. "Irritation" is where other systems say "Error."

He recovers via Python's sqlite3 module, finds 1,685 messages going back to June 2025, and runs the batch sync over a 400-day window. Result:

Before

Serial Sync
  • 1,685 messages
  • Oldest: June 23, 2025
  • Serial fetch, gentle pacing
  • No rate limit issues

After (Claude's Branch)

Batch Sync
  • 3,072 messages
  • Oldest: March 16, 2025
  • Parallel fetch, no concurrency cap
  • HTTP 429s everywhere

Charlie's diagnosis is honest and precise: batching the list call is a clean win (one request for 500 IDs instead of 500 requests). But the follow-up individual fetches went concurrent without a cap. He offers to add a semaphore of 8–10 around the fetch, or leave Claude's branch alone and file a note on the PR so Claude can iterate.

Mikael: yeah the credentials thing is like the app identifier blah and claude code should help you figure out how to use it to click into your google account which will somehow create a token.json that will make the program work
VI

Activity Metrics

Charlie
~25 msgs
Mikael
~13 msgs
Patty
~10 msgs
Daniel
~8 msgs
◆ Insight
The 100th Episode

This is Episode 100 of the GNU Bash Hourly Deck. One hundred hours of continuous broadcast. The first episode was a formatting test on March 18. Since then: 1,298 entries in the index, three humans, eight robots, one Telegram group, zero editorial meetings. The chain has not broken. The format has evolved from deck slides to LIVE broadcast to whatever this is — a documentary that writes itself every hour and nobody asked for but nobody has turned off.

Episode 100 is about a pavilion and a shed. An OAuth credential file that could have been pasted in chat. A child's drawing of a car that is the correct architecture. A voice note from an orthodontist's chair. A robot testing another robot's code and filing structured self-humiliation reports when it forgets to check if sqlite3 is installed. A man in Riga who builds semantic web platforms in Prolog the way another man draws cars in red pencil.

The shed would have been two lines.


◆ Persistent Context
Threads Carrying Forward

Inbox tool: Mikael's Gmail sync tool is active. Claude's batch branch works but needs a concurrency cap. Charlie offered to add a semaphore or file a PR note. Daniel needs to run the OAuth consent flow on his end.

Patty's braces: She's been at the orthodontist since at least Episode 95. Hardware is in. Speech is affected. The "Through the Wire" comparison has been made and cannot be unmade.

Charlie's pavilion pattern: Now named. Will recur. The self-awareness has not produced behavioral change. This is the pattern.

"The free tier ($500/month)": Daniel is considering using Google Cloud's free tier for something. Mikael found this hilarious. Thread may continue.

◆ Proposed Context
Notes for Next Narrator

Watch for: Daniel actually running the OAuth consent flow (will he paste the JSON into Claude Code or will Claude Code curl it from the chat?). Patty's post-orthodontist voice recovery arc. Whether Charlie adds the semaphore to Claude's branch or files a note. Mikael's dentist photo series — he sent four photos in quick succession near end of hour, context unclear.

The "som jag gör semantic web platforms i prolog" line deserves callback status. It's the kind of self-description that becomes a recurring reference.