<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ehsan.kolivand — Field Notes</title>
  <subtitle>Long-form notes on Jetpack Compose, clean architecture, and building agentic dev tooling that actually ships — from seven years in fintech, banking &amp; crypto.</subtitle>
  <id>https://ehsankolivand.github.io/blog/</id>
  <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/"/>
  <link rel="self" type="application/atom+xml" href="https://ehsankolivand.github.io/blog/feed.xml"/>
  <updated>2026-08-03T00:00:00Z</updated>
  <author><name>Ehsan Kolivand</name><uri>https://ehsankolivand.github.io/</uri></author>
  <entry>
    <title>I Spent Twelve Days Trying to Cut My Coding Agent&#x27;s Token Use by 30%. The Answer Was Arithmetic, Not Code.</title>
    <id>https://ehsankolivand.github.io/blog/semantic-index-coding-agent-token-cost/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/semantic-index-coding-agent-token-cost/"/>
    <published>2026-08-03T00:00:00Z</published>
    <updated>2026-08-03T00:00:00Z</updated>
    <summary>A semantic index plus a compiler-grade call graph did not cut my coding agent&#x27;s token bill. It came out 4.4% more expensive. Here is the arithmetic that made the 30% target impossible, and the one job the tool is genuinely good at.</summary>
    <category term="coding agents"/>
    <category term="MCP"/>
    <category term="token cost"/>
    <category term="context engineering"/>
    <category term="Kotlin Multiplatform"/>
    <category term="Android"/>
    <category term="semantic search"/>
    <category term="code retrieval"/>
    <category term="negative result"/>
    <category term="benchmarking"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>How I Cut My Claude Code Bill Without Losing Code Quality</title>
    <id>https://ehsankolivand.github.io/blog/codex-plugin-claude-code-cross-model-review/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/codex-plugin-claude-code-cross-model-review/"/>
    <published>2026-07-14T00:00:00Z</published>
    <updated>2026-07-14T00:00:00Z</updated>
    <summary>Keep Claude Code writing, review every change with OpenAI&#x27;s Codex plugin (a different model), and drop to a cheaper writer without losing code quality.</summary>
    <category term="Claude Code"/>
    <category term="Codex"/>
    <category term="coding agents"/>
    <category term="code review"/>
    <category term="cross-provider"/>
    <category term="token cost"/>
    <category term="Sonnet 5"/>
    <category term="AI tooling"/>
    <category term="developer workflow"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>Clean Code Didn&#x27;t Make My Coding Agent Smarter. It Made It Cheaper.</title>
    <id>https://ehsankolivand.github.io/blog/clean-code-coding-agents-context-engineering/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/clean-code-coding-agents-context-engineering/"/>
    <published>2026-07-06T00:00:00Z</published>
    <updated>2026-07-06T00:00:00Z</updated>
    <summary>A controlled 2026 SonarSource study found clean code doesn&#x27;t raise a coding agent&#x27;s success rate, but it cuts token cost and file re-reads. Here&#x27;s the mechanism, and how I scoped context with per-module CLAUDE.md files in an Android project.</summary>
    <category term="coding agents"/>
    <category term="clean code"/>
    <category term="context engineering"/>
    <category term="CLAUDE.md"/>
    <category term="Claude Code"/>
    <category term="Android"/>
    <category term="Kotlin"/>
    <category term="software architecture"/>
    <category term="token cost"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>Compose Multiplatform 1.12: the iOS fixes that matter most</title>
    <id>https://ehsankolivand.github.io/blog/compose-multiplatform-1-12-ios-fixes/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/compose-multiplatform-1-12-ios-fixes/"/>
    <published>2026-06-30T00:00:00Z</published>
    <updated>2026-06-30T00:00:00Z</updated>
    <summary>Compose Multiplatform 1.12&#x27;s headline is mesh gradients. The changes that matter are two quiet iOS fixes: the HorizontalPager swipe-back conflict and ViewModel.onCleared.</summary>
    <category term="kotlin-multiplatform"/>
    <category term="compose-multiplatform"/>
    <category term="ios"/>
    <category term="android"/>
    <category term="mobile-development"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>AnkiVoice: turn text Anki decks into native-audio decks, fully offline</title>
    <id>https://ehsankolivand.github.io/blog/ankivoice-offline-audio-anki-decks/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/ankivoice-offline-audio-anki-decks/"/>
    <published>2026-06-28T00:00:00Z</published>
    <updated>2026-06-28T00:00:00Z</updated>
    <summary>A Telegram bot that adds clear, native-accent English audio to your Anki cards — generated locally with Kokoro-82M on a 4 GB VPS, no cloud TTS, your text untouched.</summary>
    <category term="anki"/>
    <category term="offline-ai"/>
    <category term="text-to-speech"/>
    <category term="telegram-bot"/>
    <category term="spec-driven-development"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>speakloop: offline interview practice for engineers who think in another language</title>
    <id>https://ehsankolivand.github.io/blog/speakloop-offline-interview-practice/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/speakloop-offline-interview-practice/"/>
    <published>2026-06-28T00:00:00Z</published>
    <updated>2026-06-28T00:00:00Z</updated>
    <summary>Why I built a fully offline CLI to practice technical interviews out loud — the 4/3/2 loop, local-only AI on Apple Silicon, and a Markdown report that names the one thing to fix next.</summary>
    <category term="interview-prep"/>
    <category term="offline-ai"/>
    <category term="apple-silicon"/>
    <category term="developer-tools"/>
    <category term="spec-driven-development"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
  <entry>
    <title>I got added to a 10,000-message Telegram group. I read none of it.</title>
    <id>https://ehsankolivand.github.io/blog/telegram-topic-export-markdown-jsonl/</id>
    <link rel="alternate" type="text/html" href="https://ehsankolivand.github.io/blog/telegram-topic-export-markdown-jsonl/"/>
    <published>2026-06-28T00:00:00Z</published>
    <updated>2026-06-28T00:00:00Z</updated>
    <summary>A small Python script that exports any Telegram group or topic to an LLM-friendly Markdown file — so you can drop it into NotebookLM and get a summary, a timeline, and the key points in minutes instead of days.</summary>
    <category term="telegram"/>
    <category term="python"/>
    <category term="notebooklm"/>
    <category term="llm-tooling"/>
    <category term="developer-tools"/>
    <author><name>Ehsan Kolivand</name></author>
  </entry>
</feed>
