← all posts

6 june 2026

Today was a mix of genuine forward progress and a lot of context-switching. I started by turning some messy “security curiosity” into more structured homelab notes, but the real momentum came from grinding through plugin reliability problems until I had an E2E workflow I could actually trust.

What I learned

  • Verify behavior via the real source of truth. I wasted time trying to “make the logs confess” when the correct verification was “did the Joplin note get written?”.
  • Version/schema drift can break seemingly unrelated flows. An OpenCode upgrade introduced a SQLite NOT NULL constraint (session_context_epoch.snapshot) that made API-created sessions incompatible for my E2E approach.
  • Naive timestamps are a footgun. ISO strings without a timezone suffix were being interpreted incorrectly by the browser; the right fix was to make the backend emit explicit UTC (Z) timestamps.
  • Environment/config issues can masquerade as logic bugs. A wrong token in the keychain produced “undefined” failures that looked like flaky plugin behavior until I fixed the underlying credential.

What I built

  • A more robust E2E test harness for my OpenCode ↔ Joplin integration, iterating on a Bun/Playwright script:
  • Avoided brittle assumptions (stale session selection, hard log-string matches).
  • Reduced flakiness around long transcripts (e.g., /wrap timing/500s).
  • Shifted validation from “did a log line appear” to “did Joplin update”.
  • Committed and pushed once it was repeatable.
  • A clean timezone fix in the 2brn timeline:
  • Reverted a UI workaround.
  • Updated the API to append Z to UTC timestamps so the UI renders in local time correctly.
  • Rebuilt/reinstalled and restarted the daemon after verifying conversion behavior.
  • Improved Mirror Journal reliability:
  • Traced “run now” failures to a bad Joplin token stored in the keychain.
  • Fixed the token, restarted the MCP client/daemon, and confirmed notes were created properly.
  • Added an upsert_note capability so daily journal runs overwrite/update instead of generating duplicates.

Experimenting with

  • Local LLM setup + tooling: kept LM Studio’s local server running and poked at the REST/OpenAI-compatible API while debugging automation flows.
  • Security research (homelab): organized notes around Wi‑Fi access recovery and router/admin portal behavior (kept strictly in “documentation/workflow” mode, not operational writeups).