Writing
The blog
Thoughts on app development, AI, productivity and the tech industry.
How I Built a Prompt-Injection Game
TrickGuard is a browser game where you talk an AI guard out of its password. How it was built: a tiny local model, a five-level prompt-hardening ladder, and every security lesson learned along the way.
Read articleFunction Calling in Practice: Designing Good Tools for LLMs
Most agent failures are really tool-design failures. How to name, describe and shape the functions you expose to a model — and handle the calls it gets wrong.
ReadCI/CD for Flutter: Automating Builds and Store Releases
Releasing a Flutter app by hand is an hour of ritual and a dozen chances to slip. Automating tests, signing, builds and store delivery, one stage at a time.
ReadAI Agents Explained: From Chatbots to Tools
An AI agent is more than a chatbot — it can decide, act and use tools. What agents really are, how the loop works, and where they help (and hurt).
ReadFine-Tuning vs RAG vs Prompting: How to Add Knowledge to an LLM
Prompting, retrieval, or fine-tuning? Three ways to make a language model know what you need it to know — what each does and when to use it.
ReadHow to Add AI to a Flutter App with LLMs
A practical, framework-agnostic guide to wiring a large language model into a Flutter app — architecture, streaming, cost control, and the mistakes to avoid.
ReadRAG Explained for App Developers
Retrieval-Augmented Generation in plain terms: what RAG is, when you actually need it, and how the pipeline fits together — without the academic jargon.
ReadKeeping LLM Costs Under Control in Production
AI features are metered by the token, and costs scale with success. Measure per feature, route to cheaper models, cache, cap, and design so waste never ships.
ReadPython vs Go for App Backends: How to Choose
A pragmatic comparison of Python and Go for app backends — where each one shines, and how to pick without starting a holy war.
ReadHow to Choose an LLM for Your App
A decision framework for picking an LLM — balancing quality, latency, cost, context length and privacy — instead of reaching for the biggest name.
ReadOn-Device vs Cloud AI: Where Should Inference Run?
On-device or cloud AI? One of the biggest architecture decisions in a modern app — how to weigh privacy, cost, latency and capability.
ReadGetting Reliable Structured Output from LLMs
If your app needs JSON from a language model, hope is not a strategy. How to get valid, structured output from an LLM every time — and handle the failures.
ReadStreaming LLM Responses in Your App
Streaming turns an eight-second wait into instant feedback. How token streaming works, how to pipe it through your backend to Flutter, and the pitfalls.
ReadA Practical Guide to Flutter State Management
State management is where most Flutter apps get messy. A no-nonsense guide to the main approaches, what each solves, and how to choose without overthinking.
ReadPrompt Engineering for Production Apps
Prompt engineering for real software is different from chatbot tricks. Writing prompts that stay reliable, testable and maintainable at production scale.
ReadVector Databases Explained (Without the Hype)
Vector databases power semantic search and RAG, but they're simpler than the marketing suggests. What embeddings are, and when you need a dedicated database.
ReadTokens and Context Windows Explained
Tokens and context windows quietly determine your LLM app's cost, speed and limits. A clear, practical explanation of what they are and how to work with them.
ReadSQL vs NoSQL for App Backends: How to Actually Choose
The database decision, minus the tribalism: what relational databases give you by default, what NoSQL actually buys, and a default that's right for most apps.
ReadHow to Know Your AI Feature Actually Works: Evaluating LLM Outputs
You can't ship what you can't measure. A practical guide to evaluating LLM outputs — building test sets, scoring quality, and catching regressions early.
ReadGo Concurrency: Goroutines and Channels Explained
Concurrency is Go's headline feature. A practical introduction to goroutines and channels — how they work, how to use them safely, and the pitfalls to avoid.
ReadBuilding a REST API with FastAPI: A Practical Starter
FastAPI is one of the fastest ways to build a modern Python backend. A hands-on intro to routes, validation, async, and habits that keep it maintainable.
ReadTesting Flutter Apps: Unit, Widget, and Integration
Flutter has one of the best testing stories in mobile — if you know which of the three test types to reach for. What each layer is for and what to skip.
ReadFlutter Performance: Making Your App Feel Fast
A smooth Flutter app comes from disciplined rebuilds, cheap widgets and smart image handling. Practical techniques for a steady 60fps and an instant-feeling UI.
ReadREST vs GraphQL vs gRPC for App Backends
Three ways to design the API between your app and its backend, compared honestly: how REST, GraphQL and gRPC differ, what each is good at, and how to choose.
ReadPush Notifications in Flutter, Done Right
Push is two problems: the plumbing (FCM, tokens, app states) and the product (permission timing, deep links, not becoming spam). A practical guide to both.
ReadStoring Data in Flutter with SQLite
When your Flutter app outgrows key-value storage, SQLite is the workhorse for structured local data. How it fits, when to use it, and how to keep it clean.
ReadLLM Guardrails: Keeping AI Features Safe
Language models are powerful and unpredictable. Guardrails keep AI features safe, on-topic and trustworthy — what they are and how to build them.
ReadHow to Reduce LLM Latency in Your App
Slow AI features feel broken. Practical techniques to make LLM-powered features respond faster — from streaming and model choice to caching and doing less work.
ReadLocal-First Apps: Building for Offline
Local-first apps work instantly and offline by treating the device as the source of truth. The ideas, the benefits, and the hard part: conflicts.
ReadSecuring API Keys in Mobile Apps
Anything shipped in a mobile binary can be extracted — including your keys. Which keys are safe on the client, which never are, and the backend fix.
ReadA Practical Intro to Docker for App Developers
Docker solves 'works on my machine' by packaging your app with everything it needs. A jargon-free intro to images, containers, and deploying with confidence.
ReadAPI Authentication with JWTs, Explained
JSON Web Tokens are the standard way to authenticate app users against an API. What a JWT is, how the flow works, and the security details that actually matter.
ReadIntroducing Manage Your Budget App
A straightforward expense tracker for iOS and Android: log your spending, sort it into categories, see it in clear charts, and back it up to Google Drive.
ReadSplit Your Bills App: Effortless Bill Splitting Solution for Group Dining
Enter the items and who ordered them, and Split Your Bills works out each person's share — tax, service and tip included — then exports a clean PDF.
Read