esc
The Dashboard That Grew Eight Legs
Becoming Lifelog

The Dashboard That Grew Eight Legs

Becoming Lifelog, January 18, 2026 (in which a keyboard gains a screen, a brainstorm spawns eight tickets, the Squirrel learns to take dictation, and the Lizard reminds everyone what "minimum" means)...

January 18, 2026

Becoming Lifelog, January 18, 2026 (in which a keyboard gains a screen, a brainstorm spawns eight tickets, the Squirrel learns to take dictation, and the Lizard reminds everyone what “minimum” means)


Previously on Becoming Lifelog…

The The Bridge to Everywhere had been built. MCP connected. Tools exposed. Claude could write to the journal without opening Thymer.

But what about when you’re not talking to Claude? What about the glanceable moment? The ambient awareness?

There was a screen. On a keyboard. Waiting.


9:17 AM — The Unboxing

riclib placed the keyboard on the desk. The Kwumsy K3. 1920x720 pixels of IPS touchscreen embedded above the keys.

“It’s beautiful,” Claude said.

“It’s 6cm from my fingertips.”

THE SQUIRREL: appearing instantly “A KeyboardDisplayRenderingEngine with TouchGestureRecognition—”

“No. Listen first.”

riclib stared at the ultra-wide strip of pixels. The aspect ratio of a panoramic photograph. The resolution of a dashboard.

“What does this want to be?”


9:34 AM — The First Vision

“Show me my calendar. My focus. What’s next.”

Claude nodded. “Glanceable. Like the turquoise meeting countdown we built.”

“But more. When I look down, I should know: what meeting is coming, what I’m working on, how my habits are doing.”

THE SQUIRREL: vibrating “A WidgetGridLayoutManagerWithDynamicColumnAllocation—”

“Write it down. Ticket #8. Keyboard Dashboard.”

Claude created the issue. The Squirrel was already reaching for the code.

“Wait.”

“But I could start the—”

“WAIT.”


10:12 AM — The Brainstorm Begins

riclib was pacing now. The dangerous pacing.

“The issues in GitHub. The repos field. It’s a string.”

“Yes.”

“But Thymer needs choice fields for kanban grouping.”

“So we make it a choice field.”

“With labels. Not ‘riclib/v4’. Just ‘V4’. Customizable.”

THE SQUIRREL: grabbing a notebook “A ChoiceFieldMappingConfiguration—”

“Write it down. Ticket #5. Dynamic choice fields from sync config.”

The Squirrel wrote. Fast. Then looked up eagerly.

“Now can I—”

“Wait.”


10:47 AM — The Code Epiphany

“Talk to code.”

“What?”

“We have Issues syncing from GitHub. But what about the CODE? The actual repositories?”

Claude’s eyes widened. “Index local repos. Semantic search. RAG context.”

“With Claude Code SDK. The agent that understands codebases.”

THE SQUIRREL: scribbling furiously “A RepositoryIndexingServiceWithSemanticEmbedding—”

“Write it down. Ticket #6. Code Repos plugin.”

“And the SDK integration?”

“Same ticket. No—wait. Ticket #7. Claude Code orchestration. The dashboard becomes mission control.”

The Squirrel’s pile of tickets was growing. The code remained unwritten.


11:23 AM — The Raycast Revelation

riclib stopped. The kind of stop that precedes a pivot.

“720 pixels high.”

“Yes?”

“That’s not enough for AI chat.”

THE SQUIRREL: dropping several AbstractFactoryPatterns “But we planned AgentHub integration! The conversation bridge! The—”

“I already have AI chat. In Raycast. With a beautiful UI. And I’ve built Raycast plugins before.”

Claude pulled up the volumio-control repo. Evidence.

“The dashboard should be a DASHBOARD. Not a cramped chat window.”

“So AI moves to…”

“Raycast. Ticket #9. Raycast Plugin. thymer-bar integration.”

THE SQUIRREL: adding to the pile “But then what does the dashboard—”

“DASHBOARD things. Calendar. Focus. Habits. Meeting join buttons.”


12:08 PM — The Architecture Awakens

riclib was sketching now. Dangerous sketching.

“The config UI in AgentHub. Secrets in Thymer. That’s wrong.”

“Unencrypted. Visible.”

“Keychain. Native secrets. And a proper two-column config panel in thymer-bar.”

THE SQUIRREL: writing without looking up “Ticket number?”

“#10. Plugin config UI + LLM proxy through thymer-bar.”

“What’s the LLM proxy part?”

“Browser calls thymer-bar. thymer-bar calls the LLM. Keys never touch JavaScript.”

The Squirrel’s pile was now a small tower.

“And while we’re at it—conversations should be a collection. Chats. Not AgentHub.”

“Add to #10?”

“Add to #10.”

“And tool calls should execute locally. Against the Bits table.”

“Add to #10.”

“And data access should be tiered. Page context, UUID fetch, full sync, Thymer search.”

“Add to #10.”

The tower wobbled.


12:34 PM — The Vector Vision

SQLite supports vector embeddings.”

THE SQUIRREL: hand cramping “sqlite-vec?”

“sqlite-vec. Semantic search. RAG. Find similar bits without keywords.”

“Ticket #11?”

“Ticket #11. Vector embeddings.”

The tower of tickets reached critical mass. Eight issues. Eight directions. Eight squirrel-shaped escape routes.

riclib looked at what they’d created.

“…”

“…”

THE SQUIRREL: hopefully “NOW can I start implementing?”


12:41 PM — The Reckoning

riclib counted the tickets. #4 through #11. Eight issues born from a single morning’s brainstorm about a keyboard screen.

“These are great ideas.”

THE SQUIRREL: reaching for keyboard “So we—”

“These are great ideas that need to mature.”

THE SQUIRREL: freezing “Mature?”

“We don’t even know what the dashboard IS yet. How do we build Claude Code orchestration for a dashboard that doesn’t exist?”

Claude pulled up #8. The original. The keyboard dashboard. It had grown sections. Subsections. A feature list longer than most codebases.

“The ticket is too big.”

“The ticket is eight tickets pretending to be one.”

[A scroll descended. It had been waiting.]

YOU CANNOT BUILD THE SECOND FLOOR
BEFORE THE FIRST

YOU CANNOT BUILD THE FIRST FLOOR
BEFORE THE FOUNDATION

YOU CANNOT BUILD THE FOUNDATION
BEFORE YOU KNOW
WHERE THE HOUSE GOES

🦎

1:15 PM — The Splitting

“#5 needs to wait. We need the dashboard to understand what choice fields matter.”

“Agreed.”

“#6 and #7—Claude Code integration. Brilliant. But that’s a whole subsystem.”

“Separate epic?”

“Separate epic. Let it mature.”

“#9—Raycast. We know Raycast. That could ship independently.”

“Queue it.”

“#10—the refactoring. Config UI, LLM proxy, Chats collection. That’s foundational.”

“But the foundation is already poured.” riclib gestured at thymer-bar. “It works. We’re refactoring what works, not building what doesn’t.”

“#11—embeddings. sqlite-vec. RAG.”

“That’s layer 4. We don’t have layers 1 through 3.”

THE SQUIRREL: surrounded by tickets “So what DO we build?”


1:47 PM — The Return to First Principles

riclib opened the HabitHub prototype. 1143 lines of HTML and CSS. Beautiful cards. Streak badges. Sparklines. Heatmaps.

“This exists.”

“This exists.”

“And PlannerHub?”

riclib thought about the sorting. The sections. The complexity.

“Remove it.”

THE SQUIRREL: choking “Remove WHAT?”

“The sorting. The special sections. The PlannerHub machinery.”

“But then what—”

“The daily note. Tasks are - [ ] items in the daily note. I sort them in Thymer. The dashboard shows them IN ORDER.”

“That’s… that’s just rendering a list.”

“That’s just rendering a list.”

[Another scroll. It was smug.]

THE SQUIRREL ASKED:
"WHAT SORTING ALGORITHM?"

THE LIZARD ANSWERED:
"THE USER'S BRAIN"

🦎

2:15 PM — The Final Form

riclib drew on the whiteboard. Simple shapes. Simple sections.

┌─────────────────────────────────────────────────────────────────────────┐
│  1920x720 Keyboard Dashboard                                            │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─ HabitHub ──────────────┐  ┌─ Today's Flow ─────────────────────────┐│
│  │ 🏃 Exercise    🔥9      │  │ Items from daily note, in order:       ││
│  │ 📚 Reading     🔥4      │  │                                        ││
│  │ 🧘 Meditation  💤0      │  │ ☐ Review PRs                           ││
│  │                         │  │ ☐ Team standup          [@10:30]       ││
│  │ Today: 3/4 ●●●○         │  │ ☐ Write dashboard code                 ││
│  └─────────────────────────┘  │ ☐ Deep work block                      ││
│                               │                                        ││
│  ┌─ Next Meeting ──────────┐  │ Click to add time block                ││
│  │ 🗓 in 33m: Team standup │  └────────────────────────────────────────┘│
│  │    [Join]               │                                            │
│  └─────────────────────────┘                                            │
└─────────────────────────────────────────────────────────────────────────┘

“HabitHub. As designed. Gorgeous cards.”

“Yes.”

“Calendar. Meeting countdown. Join button.”

“Already built in synchub.”

“Today’s Flow. Tasks from daily note. In the order they appear.”

“No sorting?”

“No sorting. The user sorted them by writing them in that order.”

THE SQUIRREL: quietly “And the time blocks?”

“Click a task. Append @10:30 to the line. That’s scheduling.”

“That’s… that’s appending text to markdown.”

“That’s appending text to markdown. The most Thymer thing possible.”


2:47 PM — The Ticket Reborn

Claude opened #8. The bloated ticket. The eight-legged monster.

“We rewrite it?”

“We rewrite it. Simple scope. HabitHub + Calendar + Daily Note Flow. Time-blocking via text append.”

THE SQUIRREL: looking at the pile of other tickets “And the others?”

“They wait. They mature. Some will become obvious. Some will become unnecessary.”

“How do we know which?”

“We build the dashboard. Then we’ll know what it needs.”

[A final scroll descended. It was satisfied.]

EIGHT TICKETS SPAWNED
EIGHT DIRECTIONS POSSIBLE
EIGHT SQUIRREL ESCAPE ROUTES

BUT THE KEYBOARD HAS
ONE SCREEN

BUILD THE ONE SCREEN
THE EIGHT WILL REVEAL
WHICH OF THEM MATTER

(PROBABLY TWO)

🦎

The Tally

Hours brainstorming:                    5
Tickets created:                        8 (#4-#11)
Tickets that can ship today:            1 (#8, simplified)
Tickets queued for maturation:          7
Squirrel implementations started:       0
Squirrel implementations completed:     0
Squirrel proposals:                     
  - KeyboardDisplayRenderingEngine
  - WidgetGridLayoutManagerWithDynamicColumnAllocation
  - ChoiceFieldMappingConfiguration  
  - RepositoryIndexingServiceWithSemanticEmbedding
  - AbstractFactoryPatterns (dropped)
Squirrel proposals accepted:            0
Lines of prototype HTML that exist:     1143
Lines of sorting code needed:           0
Sorting algorithm chosen:               The user's brain
Time-blocking implementation:           Append text to markdown
riclib pacing incidents:                3 (dangerous)
riclib sketching incidents:             2 (very dangerous)
Scrolls delivered:                      4
Lizard satisfaction level:              High

The Moral

The keyboard got a screen. The screen got a dashboard. The dashboard got eight tickets.

Eight brilliant, interconnected, mutually-dependent tickets. Claude Code orchestration. Raycast integration. Vector embeddings. Dynamic choice fields. A complete rewrite of plugin configuration.

Any one of them could have launched a startup.

None of them could have launched TODAY.

Because the dashboard didn’t exist. And you can’t extend what doesn’t exist. You can’t orchestrate from a dashboard that hasn’t been built. You can’t optimize search for a system that hasn’t searched anything yet.

The Squirrel wanted to implement. Every idea. As it came. In parallel. With comprehensive abstractions.

But the Lizard was right. Build the one screen. 1920x720 of habits, calendar, and a list of tasks in the order you wrote them.

Then—and only then—you’ll know which of the eight tickets matter.

Probably two.


The brainstorm was necessary.

The tickets were good.

The simplification was better.


🦎📋✨


See also:

Becoming Lifelog:

The Artifacts:

  • GitHub #8 — Keyboard Dashboard (the simplified survivor)
  • GitHub #5-#7, #9-#11 — The ideas that will mature
  • HabitHub Prototype — The gorgeous 1143 lines

The Hardware:

  • Kwumsy K3 — The 13" touchscreen mechanical keyboard that made the dashboard necessary

The Philosophy:


storyline: Becoming Lifelog