Notes from building.
Design decisions, system boundaries, and things I learned by following a question.

a phone.
Giving AI an Android phone
What building Aster taught me about connecting AI agents to Android: observation, actions, device permissions, and keeping control understandable.

is the input.
Designing interactions around a laptop hinge
Design notes from UnfoldMyMac: using lid movement as input, making effects feel connected to hardware, and considering motion as system behaviour.

Why Narrow Front’s battles are decided off screen
Why Narrow Front keeps the rules of a battle apart from the 3D view, and what that choice changed for fairness, replays, testing and two-phone play.

Three ways into one Android phone
Why Aster lets an AI agent reach an Android phone in three ways, who each one is for, and the safety rules that stay the same underneath all of them.

The rules I designed OpenAlly around
The product principles behind OpenAlly: one place where work happens, agents that own their choices, storage boundaries people can check, and a companion kept separate.

When a laptop lid becomes an input
What UnfoldMyMac taught me about physical input: hardware that may not answer, effects that follow your hand, and an app that stays out of the way of real work.

Designing a puzzle where every jam has a way out
The design thinking behind Siren Jam’s 160 levels: why every jam must be solvable, how move limits stay fair, and what checking each level frees playtesting to do.

Building an AI browser for Android that asks first
The product decisions behind TaffyGo: starting from Chromium, keeping the assistant inside rules people can see, and letting each person bring their own AI provider.

Designing tool calls for agents that act
Lessons from Aster and OpenAlly on tool descriptions, arguments, results, errors and approvals when an AI agent can change things on a real device.

Getting Forza Horizon 6 telemetry to a MOZA wheel
Why MOZA Pit House ignored Forza Horizon 6, how a small open-source bridge filled the gap, and what debugging it taught me about checking assumptions.

Keeping a Unity game cool on a phone
Practical Unity mobile performance habits from shipping two games: measure on the device, pace frames, budget pixels, hide what nobody sees and never show a black screen.

Rewarded ads a player can say no to
How Narrow Front and Siren Jam use optional rewarded ads: what Google’s rules require, why a watched video must always pay, designing the no-ad state, and consent first.

A static site that checks itself
Why satyajiit.dev treats its build as two halves, one that makes the pages and one that reads them back, and the quiet failures that approach catches.

What shipping small products keeps teaching me
Lessons from taking TaffyGo, Aster, UnfoldMyMac, ZyadaShop and two Matterward Labs games from an idea to a store listing or a public repository.

Getting a new app through Google Play’s closed testing requirement
What Google Play asks of new personal developer accounts before production access: 12 testers, 14 days, and an application that rewards an honest test.

Filling in Google Play Data safety and Apple App Privacy for a small app
How to answer Google Play’s Data safety form and Apple’s App Privacy details honestly, including what ads SDKs collect and both stores’ account deletion rules.

Accessibility basics for small mobile games
Practical accessibility for small mobile games: readable text, contrast, cues beyond colour, touch target sizes, captions, motion, haptics and difficulty.

Learning Android development in 2026: a practical path
A practical path into Android development in 2026: Kotlin, Jetpack Compose, Google’s Android Basics course, the architecture guide, testing and a first release.
There’s an app I wish existed.
Tell me who would use it and what they are trying to do. A rough sketch is plenty to start with.