Skip to content
Writing

Blog

Notes on building for the web and mobile: performance, architecture, AI, and the craft of shipping.

2
series
35
articles
25
Topics

All articles

Illustration of a project folder and three identical copies, each with its own change, all resting on the same shared base
AI28 Oct 202624 min read

What is a git worktree: how it works and when to use one

What a git worktree is, explained in depth: what git writes to disk, what it shares with the repository, its commands, its limits and when to use one.

Read more
Illustration: on the left, a conversation that ends in an answer; on the right, the same conversation connected to a calendar, a database and an order system, ending in a completed action
AI27 Sep 202615 min read

Chatbot vs AI agent: differences, benefits and which one your business needs

Chatbot vs AI agent: what each one does, their benefits, the work and risk an agent adds, and how to decide which one your business needs before a quote.

Read more
Illustration: a client and the engineer talk; the conversation turns into a written proposal with the scope trimmed and the price sealed, and the payment is split into milestones released one at a time
Product26 Sep 202618 min read

How much does it cost to build an app, and why I quote a fixed price

How much does it cost to build an app? What drives the price, why nobody serious gives you a number before scoping, and what a fixed-price quote guarantees you.

Read more
Jev illustration: a state enters a decision node and comes out as three typed values, a yes or no, a choice and a score, with no text in between
AI23 Sep 202613 min read

What is Jev: TypeSafe AI's model that decides instead of writing

What is Jev, TypeSafe AI's System One model: it returns typed decisions with probabilities instead of text. How to call its API, what it costs, when to use it.

Read more
Illustration: the client's money travels along a copper path that stops at a locked box, and only continues to the developer once a delivery marked with a check crosses the other way; below, a secondary path leads to a scale
Product23 Sep 202616 min read

Why hire me through Upwork: protected payments, a verifiable track record and arbitration

What you gain by hiring through Upwork: money in escrow until you approve each milestone, auditable hours, a track record nobody can edit, and arbitration.

Read more
Illustration: irregular, muted blocks piled up with no order pass through a copper reading line and come out as three ordered rows inside a document, two marked with a tick and one discarded
Product19 Sep 202616 min read

You inherited a product: the code audit before you continue

What a code audit reviews when you inherit a product from another team, what the written verdict says, and how to decide between keeping, fixing and rewriting.

Read more
Illustration: a loose ticket that ends in a block of code, next to a continuous path that runs from the decision through building, launching and maintaining a product
Product19 Sep 202615 min read

What is a product engineer, and how is that different from a programmer?

What a product engineer does, how the role differs from a programmer, and how to tell which of the two your business needs before you hire anyone.

Read more
Illustration of an app in the center surrounded by system surfaces: a widget, a dynamic island, a watch and a local model symbol, all connected to it
Mobile13 Sep 202617 min read

What you can only do in native: WidgetKit, Live Activities, App Intents, StoreKit 2, Foundation Models and watchOS

What only native iOS can do and React Native can't: WidgetKit, Live Activities, App Intents and Siri, StoreKit 2, Foundation Models on device, and watchOS.

Read more
Illustration of a table of cases where each row is compared against a reference, next to a stopwatch that represents build time
Mobile12 Sep 202616 min read

iOS testing and tooling for seniors: Swift Testing, snapshots, mocks, Instruments and build times

iOS testing coming from Jest: Swift Testing vs XCTest, snapshots, mocks via protocols and URLProtocol, XCUITest vs Maestro, Instruments and faster build times.

Read more
Illustration of a chain of links joining a certificate, a profile and a signed package, with a seal at the end representing the review
Mobile11 Sep 202616 min read

Build, signing and the App Store: what EAS hid from you

What EAS Build did for you is now yours: certificates, profiles and entitlements, Fastlane match, TestFlight, App Review rejections and the Privacy Manifest.

Read more
Illustration of a shape that transforms in three phases toward another position, with a scale of text sizes and a symbol to one side
Mobile10 Sep 202615 min read

UI, theming and animations in SwiftUI without NativeWind or Reanimated

Theming, animations and accessibility in SwiftUI without NativeWind or Reanimated: design tokens, Dynamic Type, SF Symbols, withAnimation and Liquid Glass.

Read more
Illustration of a row of small modules on the left connected one to one with system blocks on the right, with one block marked as the main one
Mobile9 Sep 202617 min read

From the expo-* ecosystem to Apple frameworks: the equivalence table by domain

Which Apple framework replaces each expo-* package in native iOS: camera, location, auth, payments, notifications, files, plus Info.plist permissions.

Read more
Illustration of three stacked storage layers, with a separate sealed box representing the Keychain and a cloud syncing with the main layer
Mobile8 Sep 202614 min read

iOS persistence: SwiftData, GRDB and Keychain, and why Realm is no longer an option

Choosing between SwiftData, GRDB and Core Data for iOS persistence, why Realm is out, why the Keychain survives uninstalls, and offline-first with CloudKit.

Read more
Illustration of sanitype: a payload crosses a boundary and comes out with its sensitive fields masked, plus a report of what was touched
AI7 Sep 202620 min read

Sensitive data out of the prompt: a TypeScript library written in 39 minutes from its specification

sanitype redacts, masks or drops sensitive data in process before a payload reaches an LLM, a log sink or a third party. How it is built in TypeScript.

Read more
Illustration of several tasks running in parallel inside one frame and converging on a single exit point, with an isolated actor to one side
Mobile7 Sep 202616 min read

Swift concurrency: goodbye event loop. async let, TaskGroup, actors and Swift 6

Swift Concurrency for JavaScript developers: no event loop, async let and TaskGroup instead of Promise.all, actors, @MainActor, Sendable and Swift 6 data races.

Read more
Illustration of a data layer: the network and a local store feed a single stream that reaches the view, with the cache as the primary source
Mobile6 Sep 202616 min read

Data in Swift: what TanStack Query did for you and how to build your cache layer

Swift has no TanStack Query. How to build an iOS data layer: URLSession and Codable, an AsyncStream repository, SwiftData or GRDB as cache, invalidation.

Read more
Illustration of Spec-Driven Development: a specification turns into acceptance criteria and from there into the earthquake list of a mobile app
AI5 Sep 202623 min read

Spec-Driven Development in React Native: an MVP that lists the world's earthquakes, specified before writing code

Spec-Driven Development on a React Native MVP that lists the world's earthquakes: the spec decides what the list shows; its acceptance criteria become tests.

Read more
Illustration of a stack of screens piled in depth, with an external link entering an intermediate screen directly
Mobile5 Sep 202614 min read

SwiftUI navigation without file-based routing: NavigationStack, a Route enum and deep links

SwiftUI navigation for Expo Router users: NavigationStack with a Route enum, Coordinator pattern, deep links, Universal Links and what swift-navigation adds.

Read more
Illustration of a central state feeding views that only observe the part they read, with separate modules around it
Mobile4 Sep 202616 min read

State and architecture in SwiftUI: from Zustand and Redux to @Observable and TCA

SwiftUI state coming from Zustand and Redux: MVVM with @Observable by default, when TCA is worth it, dependency injection, and modular packages early.

Read more
Illustration of a voice agent: a call comes in, a backend resolves dates and options, and a confirmed appointment comes out on the calendar
AI4 Sep 202625 min read

Voice agent that books appointments: ElevenLabs, Cal.com and a backend that never lets the model guess

How I built a voice agent that books 30-minute appointments with ElevenLabs and Cal.com, and why the Fastify backend keeps the model from inventing times.

Read more
Illustration of a view tree where each node proposes a size to its children and receives an answer, with a main path highlighted
Mobile3 Sep 202616 min read

SwiftUI is not React, even if it looks like it: body, identity, modifiers and layout

SwiftUI for React developers: body vs render, view identity, why modifier order matters, layout without flexbox, and how hooks map to property wrappers.

Read more
Illustration of two type systems: a shape that gets copied as it passes from hand to hand and another that is shared by reference, with a container that may be empty
Mobile2 Sep 202617 min read

Swift for people who already master TypeScript: the five differences that change how you design

Swift for TypeScript developers: value vs reference semantics, optionals in the type system, enums with associated data, protocol extensions, Codable over zod.

Read more
Illustration of two paths leaving the same point: one covers two platforms with a single layer and the other reaches the system's capabilities directly
Mobile1 Sep 202617 min read

Why a senior React Native developer should learn native in 2026

When native iOS beats React Native (widgets, day-one APIs, on-device ML), when it loses (two platforms, OTA, team) and why Swift adds to your toolkit.

Read more
Illustration of an agent's hard limits: the agent loop enclosed in a frame of checks—budget, command allowlist, path allowlist—with a kill switch outside and a log of every turn
AI31 Aug 202633 min read

The hard limits of an autonomous agent: what keeps it from disaster

Hard limits that let you leave an autonomous agent running: iteration and token caps, command and path allowlists, a kill switch, idempotency, observability.

Read more
Data annotation illustration: a person trains a robot by approving a labeled example with a check mark while the training signal flows toward the robot
AI25 Jul 202613 min read

Data annotation jobs: what labeling and reviewing AI responses involves

What data annotation jobs and AI response review are: the tasks involved, how they feed model training (RLHF), and how annotator quality is measured.

Read more
Illustration of an agent fleet: a prompt fans out to several agents in parallel, each in its own worktree
AI6 Jul 202616 min read

Orca: the ADE for orchestrating a fleet of coding agents in parallel

I tried Orca, the open-source Agent Development Environment, to run a fleet of parallel coding agents: Claude Code, Codex and more, each in its own worktree.

Read more
Illustration of the end-to-end system: a Jira ticket enters through a trigger, passes through a stateful queue, runs in an ephemeral workspace, and comes out as a pull request that returns to Jira as a comment
AI2 Jul 202629 min read

From a Jira ticket to a pull request: the end-to-end autonomous system

How I made the agent an autonomous system: a Jira ticket triggers it, a queue with persistent state runs it exactly once, and it returns a PR and a comment.

Read more
Illustration of an isolated agent: a separate working copy branches off the repository on its own branch, the loop works inside it, and the output is a pull request, not a merge
AI30 Jun 202619 min read

The agent inside a real repo: isolating tasks with git worktree and shipping a PR

How to put an agent loop to work on a real repo: isolate each task with git worktree, reproduce the bug with a test, run the suite and ship a PR, not a merge.

Read more
Illustration of the ReAct loop: an agent picks among four tools—read, search, write, run—and builds its own context with each observation
AI30 Jun 202621 min read

From generating files to using tools: a code agent's ReAct loop

From generating a whole function to a code agent that reads, searches, edits and runs with tools: the ReAct loop, and why the agent builds its own context.

Read more
Illustration of three levels of input for an agent: hand-written tests, examples the agent turns into tests, and the repo's existing suite as the evaluator
AI30 Jun 202624 min read

Who writes the agent's tests: three ways to define what's correct

Who writes a coding agent's tests decides what counts as correct. Three options: spec and tests by hand, examples it turns into tests, or the repo's own suite.

Read more
Execution sandbox illustration: the model's text enters an isolated enclosure with a timer, passes through four filters, and comes out as a classified observation
AI30 Jun 202621 min read

The sandbox in an agent loop: from the model's text to a reliable observation

The sandbox in an agent loop turns LLM-generated code into a reliable observation: extract the code, check it parses, run it with a timeout, isolate it.

Read more
Write-test-fix loop illustration: one node writes code, another tests it, and the failure feeds back as context until the tests pass
AI30 Jun 202624 min read

The simplest loop that works: a write-test-fix agent, step by step

The simplest agent loop that works: spec and tests by hand, the model writes code, it runs, and failures feed back as context. A complete write-test-fix loop.

Read more
Agent loop illustration: a goal enters a cycle of decide, act, and observe that repeats until a stopping condition
AI29 Jun 202612 min read

What an agent loop is (and isn't): state, action, stop

What an agent loop is and isn't: its three components—state, action, and stopping condition—and why 'build me an app' is input for a chat, not an agent.

Read more
Model routing illustration: a request is split across several models, with most of the traffic going to the main model
AI29 Jun 202625 min read

Model routing with OpenRouter and DeepSeek to cut costs without losing quality

How I routed models in production with OpenRouter: DeepSeek for the bulk of traffic, premium models only where it matters, lower LLM costs, same quality.

Read more
Illustration of a news pipeline: several RSS feeds converge into a flow that filters, rewrites with AI, and publishes a draft
Automation29 Jun 202617 min read

I automated a news site with n8n: from 20 RSS feeds to WordPress drafts

How I built an n8n pipeline: 20 RSS feeds in, Postgres dedupe, tiered AI rewrites, and out comes a WordPress draft with an image and a Telegram alert.

Read more