<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vlad Temian - Centrist Tech Optimist</title><link>https://blog.vtemian.com/</link><description>Recent content on Vlad Temian - Centrist Tech Optimist</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 09 Mar 2026 00:00:00 +0300</lastBuildDate><atom:link href="https://blog.vtemian.com/index.xml" rel="self" type="application/rss+xml"/><item><title>agentprobe: real-time observability for Cursor, Claude Code and other AI agents</title><link>https://blog.vtemian.com/project/agentprobe/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0300</pubDate><guid>https://blog.vtemian.com/project/agentprobe/</guid><description>&lt;p>You want to build a dashboard that shows what your coding agents are doing. Or a TUI. Or a Cursor plugin. Or an OpenCode extension. The biggest challenge with AI agents today is &lt;strong>trust&lt;/strong>. How do you know what your agent is doing when it&amp;rsquo;s deep in a 50-file refactoring? You need a clean, real-time stream of agent state: who&amp;rsquo;s running, who&amp;rsquo;s idle, who just finished, who just failed.&lt;/p>
&lt;p>Every AI coding tool stores transcripts differently. &lt;strong>Cursor&lt;/strong> dumps JSONL files with mixed formats. &lt;strong>Claude Code&lt;/strong> has its own structure. &lt;strong>OpenCode&lt;/strong> another. Parsing each one, tracking state changes, and handling edge cases is plumbing you shouldn&amp;rsquo;t repeat in every tool you build.&lt;/p></description></item><item><title>MCP Is Great for Tools. Terrible for Agents.</title><link>https://blog.vtemian.com/post/mcp-is-great-for-tools-terrible-for-agents/</link><pubDate>Fri, 27 Feb 2026 10:00:00 +0200</pubDate><guid>https://blog.vtemian.com/post/mcp-is-great-for-tools-terrible-for-agents/</guid><description>&lt;p>We (Balaj Marius and I) built &lt;a href="https://claudebin.com">Claudebin&lt;/a> because we were tired of losing the &amp;ldquo;messy middle&amp;rdquo; of our Claude Code sessions. You debug a race condition, the agent rewrites three files, and the transcript is gone the moment you close the terminal. Claudebin turns those ephemeral sessions into shareable URLs. Run &lt;code>/claudebin:share&lt;/code>, and you get a permanent link to the exact moment things clicked.&lt;/p>
&lt;p>But this post isn&amp;rsquo;t just about the tool. It&amp;rsquo;s about what we learned while building an MCP server from scratch, the hidden frustrations of the JSON-RPC stream, and a fundamental realization: the Model Context Protocol (MCP) is the right model for tools, but it might be the wrong one for agents.&lt;/p></description></item><item><title>vibe-infer: Learning GPU Programming with Claude Code</title><link>https://blog.vtemian.com/post/vibe-infer/</link><pubDate>Wed, 18 Feb 2026 12:00:00 +0200</pubDate><guid>https://blog.vtemian.com/post/vibe-infer/</guid><description>&lt;p>Everyone has a story about how AI helped them learn something. &amp;ldquo;I asked ChatGPT to explain monads and it finally clicked.&amp;rdquo; But these stories are almost always sanitized after the fact. You get the polished takeaway, but you lose the &amp;ldquo;messy middle&amp;rdquo;—the confusion, the corrections, and the specific failure modes that actually lead to understanding.&lt;/p>
&lt;p>This post is the opposite of the &amp;ldquo;vibe coding&amp;rdquo; trend where the AI writes the code and you just ship it. I call this repo &lt;a href="https://github.com/vtemian/vibe-infer">vibe-infer&lt;/a> as a piece of intentional irony. I wrote every single line of GPU code. The AI was my tutor, not my ghostwriter.&lt;/p></description></item><item><title>claudebin: share and embed Claude Code sessions</title><link>https://blog.vtemian.com/project/claudebin/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0300</pubDate><guid>https://blog.vtemian.com/project/claudebin/</guid><description>&lt;video controls playsinline width="100%" style="margin-bottom: 2rem;">
 &lt;source src="demo.mp4" type="video/mp4">
&lt;/video>
&lt;p>Claude Code sessions are high-value artifacts that live and die in the terminal. You spend an hour debugging a race condition with an agent, arrive at a clean solution, and then&amp;hellip; it&amp;rsquo;s gone. The JSONL files in &lt;code>~/.claude/projects/&lt;/code> aren&amp;rsquo;t something you can easily share with a colleague or link in a PR.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://claudebin.com">claudebin&lt;/a>&lt;/strong> is the &amp;ldquo;share button&amp;rdquo; for Claude Code.&lt;/p>
&lt;h2 id="one-command-permanent-link">One Command, Permanent Link&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/claudebin:share
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The plugin authenticates via GitHub OAuth, extracts the current session, and returns a shareable, embeddable web URL. Full fidelity: prompts, responses, tool calls, bash outputs, and file edits are all preserved with syntax highlighting and structured formatting.&lt;/p></description></item><item><title>Riding Existing Waves: My Indie Hacking Journey with Sisif.ai</title><link>https://blog.vtemian.com/talk/indie-hacking-update/</link><pubDate>Thu, 22 Jan 2026 15:00:00 +0200</pubDate><guid>https://blog.vtemian.com/talk/indie-hacking-update/</guid><description>&lt;p>After 15 years of building production infrastructure—including a stint as CTO at QED (acquired by The Sandbox)—I thought I knew how to build a product. I was wrong. I knew how to build &lt;em>systems&lt;/em>, but I had zero idea how to build &lt;em>distribution&lt;/em>.&lt;/p>
&lt;p>This talk is the story of &lt;strong>sisif.ai&lt;/strong>, and how I had to unlearn everything about being a CTO to find my first paying customers.&lt;/p>
&lt;h2 id="the-ctos-unlearning-distribution--technicality">The CTO&amp;rsquo;s Unlearning: Distribution &amp;gt; Technicality&lt;/h2>
&lt;p>Coming from a high-scale engineering background, my instinct was to &amp;ldquo;over-build.&amp;rdquo; I wanted clean code, perfect infrastructure, and a robust CI/CD pipeline. But in the world of indie hacking, &lt;strong>nobody cares about your unit test coverage if you have zero customers.&lt;/strong>&lt;/p></description></item><item><title>opencode-reskin: multi-agent CSS analysis for OpenCode</title><link>https://blog.vtemian.com/project/opencode-reskin/</link><pubDate>Fri, 02 Jan 2026 01:00:00 +0300</pubDate><guid>https://blog.vtemian.com/project/opencode-reskin/</guid><description>&lt;video autoplay loop muted playsinline width="100%" style="margin-bottom: 2rem;">
 &lt;source src="demo.mp4" type="video/mp4">
&lt;/video>
&lt;p>Reskinning a web project manually is &amp;ldquo;death by a thousand paper cuts.&amp;rdquo; You spend hours hunting through Tailwind configs, global CSS files, and component-level styles, trying to figure out what needs to change to match a new design system. It&amp;rsquo;s tedious, error-prone, and exactly the kind of work humans shouldn&amp;rsquo;t be doing.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/vtemian/opencode-reskin">opencode-reskin&lt;/a>&lt;/strong> automates the &amp;ldquo;archaeology&amp;rdquo; and planning.&lt;/p>
&lt;h2 id="one-command-deterministic-plan">One Command, Deterministic Plan&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/skin nof1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The plugin scans your project, compares it against a target design system (skin), and produces a &lt;strong>concrete transformation plan&lt;/strong>. No guesswork. No &amp;ldquo;maybe.&amp;rdquo; You get a markdown checklist of exact changes:&lt;/p></description></item><item><title>octto: browser UI for brainstorming with OpenCode agents</title><link>https://blog.vtemian.com/project/octto/</link><pubDate>Fri, 02 Jan 2026 00:00:00 +0300</pubDate><guid>https://blog.vtemian.com/project/octto/</guid><description>&lt;video autoplay loop muted playsinline width="100%" style="margin-bottom: 2rem;">
 &lt;source src="demo.mp4" type="video/mp4">
&lt;/video>
&lt;p>Brainstorming with AI agents in a terminal is slow and painful. You type a paragraph, the agent asks a question, you type another paragraph&amp;hellip; it&amp;rsquo;s a 10-minute back-and-forth just to agree on an approach. Most of that time is spent in &amp;ldquo;prose-churn&amp;rdquo;—typing things that should have been a single click.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/vtemian/octto">octto&lt;/a>&lt;/strong> turns those 10 minutes of typing into 2 minutes of clicking.&lt;/p>
&lt;h2 id="agentic-ui-why-chat-is-a-bottleneck">Agentic UI: Why Chat is a Bottleneck&lt;/h2>
&lt;p>We&amp;rsquo;ve been conditioned to think &amp;ldquo;AI = Chatbox,&amp;rdquo; but prose is one of the most inefficient interfaces for structured decision-making. Chat is linear, ambiguous, and requires constant re-typing.&lt;/p></description></item><item><title>micode: context harnessing, planning and parallel execution for OpenCode</title><link>https://blog.vtemian.com/project/micode/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0300</pubDate><guid>https://blog.vtemian.com/project/micode/</guid><description>&lt;video autoplay loop muted playsinline width="100%" style="margin-bottom: 2rem;">
 &lt;source src="demo.mp4" type="video/mp4">
&lt;/video>
&lt;p>I built &lt;strong>micode&lt;/strong> because I got tired of &amp;ldquo;magic&amp;rdquo; turning into &amp;ldquo;amnesia.&amp;rdquo; You describe a feature, the agent starts writing code, and for a while it feels like a superpower. Then context drifts. The agent forgets a decision made three tool calls ago, or it re-invents a utility that already exists in the codebase.&lt;/p>
&lt;p>The issue isn&amp;rsquo;t that AI coding tools are bad. The issue is that they have no memory and no discipline. &lt;strong>&lt;a href="https://github.com/vtemian/micode">micode&lt;/a>&lt;/strong> is an &lt;a href="https://opencode.ai">OpenCode&lt;/a> plugin that enforces both.&lt;/p></description></item><item><title>Technical Debt is Cheap</title><link>https://blog.vtemian.com/talk/technical-debt-is-cheap/</link><pubDate>Mon, 27 Oct 2025 10:00:00 +0200</pubDate><guid>https://blog.vtemian.com/talk/technical-debt-is-cheap/</guid><description>&lt;p>March 17th, 2025. My regular work was done for the day. I had three hours before I needed to stop.&lt;/p>
&lt;p>A friend had recommended Claude Code a few days earlier. &amp;ldquo;Think of it like having a really junior developer on your team.&amp;rdquo; I was skeptical. I&amp;rsquo;d used Copilot for autocomplete, played with ChatGPT. Wasn&amp;rsquo;t sold on Cursor.&lt;/p>
&lt;p>But I had this project. The one everyone has. Making money for years, users depend on it, and every time someone opens the codebase they quietly close their laptop and find something else to do.&lt;/p></description></item><item><title>claude-notes: claude code sessions to html</title><link>https://blog.vtemian.com/project/claude-notes/</link><pubDate>Wed, 25 Jun 2025 19:46:00 +0300</pubDate><guid>https://blog.vtemian.com/project/claude-notes/</guid><description>&lt;p>Claude Code is fast, but it&amp;rsquo;s hard to look back. I found myself frequently wanting to show a colleague the exact &amp;ldquo;messy middle&amp;rdquo; of a session—the specific tool call or terminal output that finally led to a solution.&lt;/p>
&lt;p>But Claude stores everything as raw &lt;code>.jsonl&lt;/code> files in &lt;code>~/.claude/projects/&lt;/code>. Not exactly something you can link in a PR.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/vtemian/claude-notes">claude-notes&lt;/a>&lt;/strong> is a local CLI tool that turns those JSON lines into readable, searchable, and shareable HTML.&lt;/p></description></item><item><title>Parallel Transaction Execution in Blockchains</title><link>https://blog.vtemian.com/post/parallel-transaction-execution-in-blockchains/</link><pubDate>Fri, 18 Oct 2024 15:32:57 +0200</pubDate><guid>https://blog.vtemian.com/post/parallel-transaction-execution-in-blockchains/</guid><description>&lt;p>In the last couple of years, we have seen the rise of &lt;a href="https://www.shoal.gg/p/parallel-execution-the-next-generation">infrastructure&lt;/a> projects in the blockchain space. One exciting development is &lt;a href="https://www.recvc.com/part-i-design-space-for-parallel-blockchains/">parallel blockchains&lt;/a>, specifically those that execute a batch of transactions in parallel.&lt;/p>
&lt;h2 id="concurrency-at-scale">Concurrency at Scale&lt;/h2>
&lt;p>When studying those chains, you can see some parallels to classical &lt;a href="https://en.wikipedia.org/wiki/Concurrency_control">concurrency patterns&lt;/a>, but those are hard to implement at scale.
Why is that? In addition to executing transactions in parallel (happening at the VM layer), we also need to consider replicating their output across the network.&lt;/p></description></item><item><title>Healthy Python Codebase</title><link>https://blog.vtemian.com/post/healthy-python-codebase/</link><pubDate>Mon, 21 Sep 2020 15:04:57 +0200</pubDate><guid>https://blog.vtemian.com/post/healthy-python-codebase/</guid><description>&lt;p>The code is a living entity. For the majority of the time, it stays in silence and it&amp;rsquo;s doing its job, without complaining.
But, there are these creatures, humanoid, that from time to time, will change it. Will try to fix it, adapt, or
completely remove parts of it. Those creatures tend to conserve energy and they are using pattern recognition to do so.
They observe patterns and take fast and easy decisions based on those patterns.
Because of that, this code entity needs to be structured and behave in certain patterns.&lt;/p></description></item><item><title>Building a serverless hosting platform</title><link>https://blog.vtemian.com/post/serverless-hosting-platform/</link><pubDate>Mon, 18 May 2020 13:06:21 +0200</pubDate><guid>https://blog.vtemian.com/post/serverless-hosting-platform/</guid><description>&lt;p>Deploying a 3-tier application (with the presentation layer, business logic, and storage) can get a little tricky these days. Let&amp;rsquo;s say that we have a simple Django application, &lt;a href="https://github.com/vtemian/simple-django-app">poll&amp;rsquo;s app&lt;/a> from the tutorial. It runs perfect on our local machine, we added a requirements.txt to hold our dependencies. As for the database, we can use SQLite, since we&amp;rsquo;re developing only locally. The purpose of this project is to build a system that will allow us to push on a branch and deploy our changes in a separate environment, giving us a unique URL, to check them. Similarly to how &lt;a href="http://now.sh">now.sh&lt;/a> and &lt;a href="http://heorku.com">heroku.com&lt;/a> are doing. We&amp;rsquo;ll need a mechanism that will package our code and dependencies and will deploy it, but also it needs to consider multiple versions, upgrades, load-balacing, scaling and our stateful part (database).&lt;/p></description></item><item><title>Python Multiple Inheritance</title><link>https://blog.vtemian.com/post/multiple-inheritance/</link><pubDate>Fri, 01 May 2020 14:03:00 +0200</pubDate><guid>https://blog.vtemian.com/post/multiple-inheritance/</guid><description>&lt;p>Inheritance, a simple and evil mechanism for re-using code, can get tricky. Traditionally, you may have encountered inheritance when you wanted to extend or override a class&amp;rsquo;s behavior.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Pet&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">walk&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;walk&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">eat&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;talk&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">talk&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;!@#$&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Dog&lt;/span>(Pet):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">talk&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;Ham!&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Cat&lt;/span>(Pet):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">talk&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">&amp;#34;Miau!&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Fairly easy to understand and follow. Dog and Cat share most of Pet&amp;rsquo;s behavior, with some &amp;ldquo;small&amp;rdquo; particularities.
Let&amp;rsquo;s say that we want to isolate particular behavior, for better testing purposes.&lt;/p></description></item><item><title>Interviews</title><link>https://blog.vtemian.com/post/interviews/</link><pubDate>Thu, 03 Jan 2019 22:02:12 +0200</pubDate><guid>https://blog.vtemian.com/post/interviews/</guid><description>&lt;p>I’m really nervous, only thinking of them. I had only one or two real interviews and conducted a few. Usually, I’m pretty lucky when it comes to job finding. The companies I like or want to work with contacted me, and it’s really flattering. No interview, just a small discussion, a beer and I’ll start next Monday.&lt;/p>
&lt;p>&lt;img src="https://images.unsplash.com/photo-1535515384173-d74166f26820?ixlib=rb-1.2.1&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1350&amp;amp;q=80" alt="">&lt;/p>
&lt;p>For the past 2.5 years, I’ve started practicing. Practicing maybe it’s too much. I bought the books (like everybody does: &lt;a href="https://www.amazon.com/0984782850-983056789626-Cracking-Coding-Interview/dp/B07F16D3BG/ref=pd_lpo_sbs_14_t_1?_encoding=UTF8&amp;amp;psc=1&amp;amp;refRID=RD27GF1B4JP3R14XH98M">Cracking the Coding Interview&lt;/a>, &lt;a href="https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202/ref=sr_1_2?ie=UTF8&amp;amp;qid=1546546500&amp;amp;sr=8-2&amp;amp;keywords=Algorithm+Design">The Algorithm Design Manual&lt;/a> and &lt;a href="https://www.amazon.com/Elements-Programming-Interviews-Questions-Tsung-Hsien/dp/B00C7F0V3W/ref=sr_1_6?ie=UTF8&amp;amp;qid=1546546537&amp;amp;sr=8-6&amp;amp;keywords=elements+of+Programming+Interviews">Elements of Programming Interviews&lt;/a>), paid a monthly subscription to leetcode.com, did some problems out there and that was it. I even told all my friends, and they all supported me. But each time I discovered a hard problem or did a mock interview that went bad, I would really feel ashamed and stopped trying. I would procrastinate and find other things to do (like finishing other work-related tasks or start a side-project in a new language etc.).
I wanted to feel safe and comfortable. I felt stupid that I didn’t know how to solve that problem, but I felt smart that I’ve could complete this extra task or did something pointless in a new programming language.&lt;/p></description></item><item><title>2019</title><link>https://blog.vtemian.com/post/2019/</link><pubDate>Wed, 02 Jan 2019 21:36:57 +0200</pubDate><guid>https://blog.vtemian.com/post/2019/</guid><description>&lt;p>So here I am, me, &lt;strong>naked&lt;/strong>, starting a blog.&lt;/p>
&lt;p>I must admit, I’m shy and I don’t have any &lt;strong>courage&lt;/strong>. I’ve always been this way. I lack the courage to make decisions, to commit, to trust myself. I’ve always wondered if people will accept me and I’ve tried my best to please and impress people.&lt;/p>
&lt;p>This led to a stagnation stage. I was too afraid of trying new things, learning, experimenting, trusting. I was, and I still am &lt;strong>afraid of failing&lt;/strong>. What my friends will think of me if I say something stupid? What will happen if I’ll say something wrong during a presentation? What if I’ll ask a foolish question, during a presentation? What will the interviewer think if I say or do something wrong? What my friends/parents will think of me if I fail this interview? Why did that driver honk me? Did I make something wrong? What&amp;hellip;if&amp;hellip;something&amp;hellip;stupid?&lt;/p></description></item></channel></rss>