¬ just serendipity 🍀
¬ just serendipity 🍀
Thiago Perrotta
Welcome to my digital garden – a space dedicated to exploring technology and sharing what I’ve been learning. This site reflects my passion for continuous learning and open-source software, wherein I document my journey, offer insights, and dive into miscellaneous topics that reflect my interest. My goal is to maintain a corner of the Web for self-expression focused on valuable, distraction-free content. I believe in the power of the Open Web as a platform for sharing knowledge.
Latest Posts
♠ Today I learned: Atuin ships hooks that capture commands executed by AI LLM coding agents into the same shell history as mine. As of today there are hooks for Claude Code, OpenAI Codex and Pi. % atuin hook --help Manage AI-agent shell...
♠ Previously. My dual-review skill runs two independent LLM reviewers over a commit / diff / PR, validates every finding against the code, and hands back one action plan — Blockers, Important, Suggestions. Recently I added a flag...
♠ Previously. I’ve finally removed the GitHub MCP server from my Pi configuration, after piloting it for a while with pi-mcp-adapter. GitHub already has a mature CLI (gh) installed and authenticated: % gh --version gh version 2.97.0...
♠ Problem statement: a newly created Route 53 record resolved through public DNS, but Chrome Brave and macOS still returned DNS_PROBE_POSSIBLE. It smells like a DNS caching issue. Flushing mDNSResponder did nothing though. The system...
OpenRouter # Today I signed up for OpenRouter. The Unified Interface For LLMs Better prices, better uptime, no subscriptions. Its main selling point is a single LLM API endpoint to rule them all, without lock-in to a specific provider or...
♠ Problem statement: git fsck failed in a linked worktree, even though every branch and reflog remained intact. The initial diagnosis was noisy: missing blobs, hundreds of dangling objects, and an invalid commit graph: missing blob...
♠ Previously. Problem statement: preserve Logseq’s task syntax while opening the same markdown files in Obsidian. My migration script originally converted every task into Obsidian’s checkbox syntax: - TODO buy milk -> - [ ] buy milk -...
♠ Today I learned: pi 0.82.1 cannot change its working directory mid-session. The interactive shell syntax looks tempting, but ! and !! run commands in a child process. cd ends with that process; Pi keeps the session’s original cwd....
♠ I found drskill through Drew Breunig’s post about managing an agent’s loadout. Problem statement: lint skills bundled in a Claude Code plugin with drskill. Running it through uvx is easy enough: % uvx drskill scan --detailed drskill...
♠ Problem statement: block destructive shell commands issued by pi without resorting to grepping shell source with regular expressions. My first guard was a direct port of an older hook in Claude Code: const BLOCKED_COMMANDS:...
♠ Problem statement: ctrl+d in pi took several seconds to quit. The culprit was pi-memory’s session_shutdown handler. It sent one last LLM request to summarize the session, wrote its answer to the daily log, then ran qmd update. Pi...
♠ Problem statement: pin pi npm packages without giving up convenient updates. My settings.json used to leave some package versions unpinned, until now: "npm:@heyhuynhgiabuu/pi-diff@0.7.6", - "npm:@tifan/pi-recap", -...
♠ Previously. The Anki official docs do not provide explicit instructions about the archival of decks that are no longer needed. Archiving is better than deleting because you never know when you may need a deck again. One way to archive...
♠ Problem statement: using pi, install an extension (package) as an one-off, without persisting it, for the sake of test-driving it, akin to pre-commit try-repo. Solution: % pi --help [...] --extension, -e <path> Load an extension file...
♠ Problem statement: in Obsidian, out-of-the-box, typing * at the start of a new line emits *|* (an empty bold pair, cursor in the middle) instead of starting a bullet point. The culprit is Settings → Editor → Auto pair Markdown syntax....