My wife keeps telling me: “Honey, we’re making money more than ever, why can’t we have more financial freedom?” I have more kids now. As they grow, they need more money, programs to keep them busy and properly educated. But aside from that, there’s the extra cost This post is my research into the extra costs. Groceries, rent, cars, insurance. Pretty much everything. While researching, I also looked into something slightly different: were prices already increasing at the same pace before 2020? ...
What Does a Database Migration Mean?
I’ve been building a personal project with Codex. Doesn’t matter what it does — the relevant part is that it needs a server, and for that Codex told me to use Supabase. Fine. I have no opinions about backend-as-a-service, I just want something that stores rows and doesn’t make me think about it. Then it created a jobs table and put it in a file called supabase/migrations/20260821143210_create_jobs.sql: create table jobs ( id uuid primary key default gen_random_uuid(), title text not null, created_at timestamptz not null default now() ); alter table jobs enable row level security; Fine. That’s a table. The next day I asked for a status column, and it made another file, supabase/migrations/20260822091544_add_status_to_jobs.sql: ...
A Framework to Make Decisions Faster as a Lead Software Engineer
“Do you know what leadership means, Lord Snow? It means that the person in charge gets second-guessed by every clever little tw*t with a mouth. But if he starts second-guessing himself, that’s the end.” - Ser Alliser Thorne Before I became a lead software engineer / owner of code I often thought my beloved company was terrible at their architecture. I questioned a lot of decisions. But decision making at scale is difficult. ...
How to Use Git Worktree? And How It's used by AI Agents?
Git Worktree Why would you want to use it? To be able to checkout multiple branches at the same time without having to clone your repo. Currently if you run git worktree list you’d see that you only have one git-worktree. e.g. I get the following /Users/mfaani/Developer/project-iOS 0960933f [main] The commit and branch name show the current HEAD; if you were on another branch, the worktree would show that branch instead. ...
When to Use AGENTS.override.md?
How is AGENTS.override.md different from AGENTS.md? Why not just edit the current AGENTS.md file instead? Override is usually for temporary or unique cases. Examples: Temporarily testing different agent behavior Override an inherited team file without deleting it. Could be for a developer-specific environment or local workflow. When certain files of a group of files require different instructions. So you create a new directory and add an override to be more explicit. To say this differently, AGENTS.override.md is best when the override is specific to a directory, environment or process, while AGENTS.md remains the default shared config. ...
xcodebuild for AI
I’m running into some issues with the project setup Claude came up for me and I’m triaging it now. It’s using xcodebuild which prompted me to write this post. Prerequisite Highly recommend to acquaint yourself with the following definitions: Project Target Scheme Action Destination Product For that see my stackoverflow answer to: Xcode: What is a target and scheme in plain language? What is xcodebuild? It’s command line tool made by Apple. It allows you to build, test, archive your app. It operates on one or more targets contained in your project, or a scheme contained in your project or workspace ...
How the mental cost of AI can be reduced over time and type of usage?
People vs 0s and 1s Despite being a fervent user of AI tools, I long struggled to figure out where AI hurts software engineers and where it helps. While I enjoy working from home and not having to commute, I also enjoy going to the office, seeing people, having lunch with them. Talking about sports, work, the future. Talk about myself. Get to know them and their family. Their culture, roots. I’m very much a people’s person. I enjoy having slack conversations. Sharing pictures, travel tips, shared passions or pain points about life, being a software engineer. How to raise kids, keep a well maintained house. etc. Even when it’s not in person, I prefer to see people’s face online. Or at worst at least see an actual profile photo. I also enjoy asking and answering questions on stackoverflow / reddit / slack. I feel more human and worthy when people or more so if a person who’s an iOS community leader, spends the time and answers my question and cherish the moment where years later I meet these people in real life for the first time. I take photos with them, hug them. All of it. ...
Part 1 - State Drive Nagiation: Overview
Intro What triggered the writing of this post were two things: 1. Prior Experience with State Machine We’ve been using state machine for the past few years to simplify a complex onboarding flow. The complexity of our feature rises from: having too many conditions that determine the correct state having the conditions scattered. Some conditions are known at the time of app launch, some are known at the time of onboarding flow commencing, but some others are only known after user identifies their device to us. This adds further complexity to our flow. ...
Part 2 - State Driven Navigation: Tutorial
💡 Read Part 1 first to understand the concept. This post shows you exactly how to implement it. What We’re Building A simple 3-screen onboarding flow: Account Loader Screen → Loads the user’s account in a loader screen Welcome Screen → user taps “Get Started” Device Identification Screen → user enters their devices CMMac Let’s build this with state-driven navigation, step by step. 1 - States States represent every screen your user can be on: ...
What does actor reentrancy mean?
If you captured any state before doing some async work in your actor, then by the time your task is resumed, your captured state may be stale. This is what actor reentrancy is about. Because of this, you should avoid capturing things that are subject to change before your task is suspended. Instead, only retrieve values after your task is resumed. The term “reentrant” literally means “able to be entered again.” When an actor method suspends at an await point, the actor isn’t locked, other methods can enter and execute, potentially modifying the actor’s state. When your original method resumes, it has “reentered” an actor that may now be in a different state than when it left. ...