Pinned Tweet
Hi, I'm Vitaliy, a developer from Kyiv.
I build AI agents and integrate AI into existing products. Beyond that I'm a full-stack developer, so I can take a web app from idea to launch.
What I care about most is AI that works on real data and doesn't make things up.
My projects and case studies are on my site, along with an AI chat you can ask about me.
Open to new projects.
italik.dev
Lately I've been thinking about how to make MCP calls faster.
I thought the problem was that the server regions were too far away (and that was a small part of it), but while digging into it I ran into a different problem. Most of the time actually goes to Claude working on the project, its thinking (which is expected).
And I noticed that get_scene returns a lot of data it doesn't need, and Claude has to read all of it and keep it in context.
So the fix was simple but effective. I added compactScene: default values are no longer sent, numbers are rounded to 3 decimals, because before they could be really long, and overall Claude now only gets the data it will actually need.
This small fix cut the get_scene output by about half (44-51%)
Keyline update: Claude can now align and distribute elements (to each other, a group or the frame), and keyframes move with them, so the motion holds.
It also catches elements a few pixels off and lines them up.
Plus 75 Lucide icons, and Claude stops "fixing" your brand colors
One prompt in Claude Code. Then I just watched.
Claude builds the animation live in Keyline, commit by commit, checks its own frames, and here's what came out.
Works with your own Claude over MCP. No credits
keyline.italik.dev
AI can make an animation in a minute. Making it feel right takes the rest of your evening.
"A bit snappier" isn't something you can explain in a chat.
So I built Keyline. Your Claude builds the animation. You pause on the frame that's off, click the element and say what to change, and Claude fixes exactly that. Then you drag the easing curve by hand until it feels right.
Made in Keyline from a reference shot of @thesamirho dashboard design.
Link below
Try it: keyline.italik.dev
Connect your Claude in one line (Claude Code):
claude mcp add --transport http keyline keyline.italik.dev/mcp
On claude.ai, add the same URL as a custom connector. Or use the in-app chat with your own API key.
Not every message needs Claude to think hard.
Making it red shouldn’t cost the same as building a launch video.
In my app, a cheap decision model (Cloudflare’s Clef) reads each message first and decides how hard Claude should think. It doesn’t write text, it just picks. 96% accurate on my eval
Doc harness update: it has a frontend now.
In the CLI, when the agent started a quiz, the tool just waited for my answers in the terminal. Over HTTP that doesn't work.
So the loop has to stop mid tool call, save the history, and resume when the answers come in. Rebuilding the backend on Hono for that
My prompt cache never worked, and the API never told me.
The cached part of the prompt was 18 tokens short of the minimum. No error, no warning. It just billed the full prompt every time.
Fixing it took the cost per 1,000 transactions from $2.86 to $0.68.
A cache that never turns on looks exactly like one that does. Check the bill, not the code.
My AI finance advisor made up numbers on my real bank data.
I told it clearly to only repeat figures the app had calculated. It still put two different totals for the same thing in one notification. Neither was in its data.
So the model doesn't do math anymore. Every number comes from SQL, and a few lines of code check each amount in the answer against the data before anyone sees it.
A prompt is a request. A check in code is a guarantee
Full write-up: the check itself, where it still failed, and how the same idea cut my AI cost by ~80%:
italik.dev/blog/the-model-ne…
Doc harness update.
I've added a tool that lets the agent create a quiz during a conversation and then go through the wrong answers.
I also moved the schemas and validation to Zod. Writing them by hand was fun at first. Now, it's just the same boilerplate over and over again.
Building a doc-quiz harness from scratch, day 1.
You point it at a docs site, then either chat with it about the docs or have it quiz you. Subagents, a human-in-the-loop step, no frameworks.
Probably slower this way, but I want to know how this stuff actually works under the hood
My currency test passed on five tables that had no rows in them. The fixture never seeded them, so the check ran over nothing and went green. Found it by accident.
"Fix the input and everything downstream fixes itself."
Better input means the numbers the model sees are real. Doesn't stop it from returning a total that was never in the document.
I gave up on checking and took the ability away. It picks the query, code runs it, it never types a number.
How do you dedupe AI-generated output? I hash the title with numbers stripped out, because the same insight kept coming back as "7.5 months" then "7.3". Feels crude. Curious what people do.
Two different failures show up as the same JSON parse error: the model returned garbage, or the response got cut off at max_tokens. I treated both as bad output and retried. Which re-ran the exact call that had already hit the ceiling. Branch on stop_reason first







