Cody Cantrell, in an engraved portrait

Cody Cantrell

Full-stack engineer and AI developer. I build native apps, backends, and the AI running inside them.

last push · July 31, 2026

About

Self-taught — and I stand behind it

I'm self-taught, and everything I've shipped came from wanting to build it myself first. Workout Buddy — an iOS and watchOS app with an AI coach that reads your training history and rewrites your program to fit — pulled me through React Native, native Swift and a Postgres backend on Supabase. The Harvest is a Bible app built on nothing but Apple's own frameworks. And in between, four sites for local businesses here in Southern Illinois: a coffee shop, a home inspector, a church, a play place for kids — each one shipped, each one still live.

Outside of it: Jesus first, then my wife Gracie and our son Shepherd — most of what isn't spent building software is spent with them. I work out most days and stay active, which is half the reason Workout Buddy exists in the first place. Disney World is the one trip we never get tired of taking.

Swift · AI integration · React Native · Postgres

Resume

Where I have worked

Draft — not yet filled in

This timeline is a shell. The layout is finished; the history is not. Rather than fill it with a plausible-looking career, it stays marked as unwritten until the real one goes into content/resume.ts.

  1. TODO — e.g. JAN 2024 — PRESENT · TODO — city, state, or "Remote"

    TODO — employer or "Independent"

    TODO — your title

    • TODO — what you owned, stated as a responsibility.
    • TODO — what you shipped, with the platform or stack named.
    • TODO — an outcome with a number in it, if you have one.
  2. TODO — earlier role

    TODO — employer

    TODO — your title

    • TODO — what you did there.

What I work in

Platform
  • Swift
  • SwiftUI
  • watchOS
  • App Intents
  • WidgetKit
  • Live Activities
Data
  • SwiftData
  • CloudKit
  • HealthKit
  • Postgres
  • Row-level security
Practice
  • App Store release
  • Crash triage
  • Accessibility
  • Performance budgets

Projects

Skills

  • Swift
  • SwiftUI
  • watchOS
  • HealthKit
  • WidgetKit
  • CloudKit
  • React Native
  • TypeScript
  • Next.js
  • PostgreSQL
  • Supabase
  • Tailwind CSS
  • Git
  • GSAP
  • WebGL
  • Accessibility

Flagship

Workout Buddy

iOS · watchOSShipped to the App Store in June 2026

Open in the App StoreVisit the site

Workout Buddy is a hypertrophy training app for iPhone and Apple Watch. You log sets, it runs auto-progressing mesocycles against RP volume landmarks, and an AI coach proposes program changes that the app validates before it applies them — for lifters who want real programming without building a spreadsheet.

I designed it, built it, shipped it, and I am the only person who maintains it. Roadmap, App Store review, crash triage, support email.

Native depth

watchOS app
SwiftUI, driven by a pure workout state machine. A real HKWorkoutSession with pause and resume; live, average and max heart rate and active calories round-trip into phone history. Starts standalone.
Live Activities
Lock Screen and Dynamic Island, with an interactive Log set button that works while the app is suspended — and says so when a set needs typed numbers first.
App Intents
Ask Buddy and Start Workout, surfaced in Siri, Shortcuts and Spotlight, plus an iOS 18 Control Center and Action-button control.
Widgets
Home and Lock Screen steps widgets that refresh themselves from the pedometer while the app is closed, and a watch complication that deep-links in.
HealthKit
Workouts, heart rate, bodyweight and steps. Phone workouts write back to Apple Health with cross-device dedupe against the watch’s own save.
Native bridges
Two custom Expo modules I wrote: ActivityKit over an App Group queue and a Darwin notification, and WatchConnectivity.

Architecture

  1. Surfaces

    Four processes, four memory budgets

    • iPhone app (Expo / RN)
    • Watch app (SwiftUI)
    • Widgets
    • Live Activity
  2. Commands

    One entry point for every surface

    • App Intents
    • Siri / Shortcuts / Control Center
  3. Domain

    Pure, tested, no UI framework

    • Auto-progression engine
    • Workout state machine (Swift)
    • Offline write queue
  4. State

    Local first, server second

    • zustand + AsyncStorage
    • Supabase (Postgres + RLS)
  5. Integrations

    Optional — denial degrades, never blocks

    • HealthKit
    • Anthropic proxy
    • RevenueCat
A React Native app with native Swift where native is the only way to do it. Everything above the store is a surface; everything below it is state.

Decisions

  1. The rest timer does not tick from the app

    The Live Activity renders its countdown with a system timer interval, so the Lock Screen stays accurate. I spend the update budget only on state changes — set finished, rest started, session ended.

    TradeoffI gave up control of the countdown formatting and cannot easily show anything but elapsed or remaining time. In exchange the timer never drifts, never goes stale, and never gets throttled out mid-set.

  2. The Lock Screen can log a set while the app is suspended

    The interactive Log set button writes into an App Group queue and raises a Darwin notification rather than waking the JavaScript runtime. The app drains the queue when it next runs, so the tap is durable whether or not anything is alive to receive it.

    TradeoffTwo writers now touch the same workout, which is the whole reason the queue and its drain order had to be designed rather than assumed. The payoff is a button that is honest: it works when the app is gone, and it says so when a set genuinely needs typed numbers first.

  3. The AI coach proposes; the app decides

    The chat coach never writes to the program. It returns a proposed change, the app validates it against its own rules, and only then applies it. Requests go through a server-side proxy with a hard per-user dollar budget enforced atomically.

    TradeoffCoaching needs a network and costs money per user, so it can never be the only way to train — everything it suggests has to be reachable by hand too. What it buys is that a bad generation is a rejected proposal rather than a corrupted mesocycle, and that one user cannot run up my bill.

  4. Offline is the default, not a fallback

    Every write lands in local state first and joins a persistent queue that syncs to Supabase with backoff and poison-entry rotation. Nothing in the logging path waits on a request.

    TradeoffI maintain a queue, its retry policy and its failure modes instead of letting a client library own them. But the app works the same in a gym basement as it does on wifi, and one permanently bad row cannot wedge the sync forever.

  5. The native code is testable without a simulator

    A root Package.swift compiles the pure Swift — the watch state machine and its friends — on macOS. `swift test` runs 93 native tests in about four seconds.

    TradeoffThe pure logic has to stay genuinely free of UIKit and WatchKit for this to keep working, which is a constraint on where code is allowed to live. It also means CI can check the hardest part of the app in seconds.

Honestly

The hardest problem

Keeping one workout consistent across four processes that do not share memory. The phone app, the watch, a widget and a Live Activity can all believe they know the current set, and the Live Activity’s Log set button can fire when the app is not running at all.

The answer was to stop treating the app as the owner of the session. Surfaces append into an App Group queue; a drain step folds them into state in a defined order. What made it hard was not the merge — it was accepting that the surfaces could not simply call into the app, because most of the time there is no app there to call.

What I would refactor

The progression rules exist as one pure, tested module, and that is the part I trust. What I would go back for is the boundary around it: too much of the app still reaches for raw workout rows when it wants a derived number, so a rule change means auditing call sites rather than changing one function. It works because the module is right, not because the design stops the rest of the app from working around it.

Screens

  • Workout Buddy — today’s Push session, logging a set with the rest timer running

    Today

  • Workout Buddy — Buddy, the AI coach, proposing a change to the Push day

    Coach

  • Workout Buddy — the Programs list with an active Push/Pull/Legs mesocycle

    Programs

  • Workout Buddy — the Profile screen, with training streaks and step tracking

    Profile

Native app

The Harvest

iOS · SwiftUIA Bible app centred on Jesus.

A native iOS Bible app built around reading, writing and listening rather than streaks and badges. Two full public-domain translations ship inside the binary, so it works with the network off.

Read the code on GitHub

What's inside

The whole Bible, offline
KJV and the World English Bible bundled — all 66 books, 31,100+ verses. Reference and full-text search, and a six-colour highlight palette where each colour carries a meaning.
Notes as a writing room
A parchment surface with serif ink and gentle prompts, verse attachments, and Reflection, Sermon and Prayer as distinct kinds.
Sermons that take their own notes
Add a podcast URL or import audio, then on-device transcription pulls out key points and every scripture mentioned as tappable chips that open the reader. Works with no backend — a connected one just makes the summary richer.
Ask, with the app as context
An assistant that activates once you connect your own backend. It already knows the passage you are in, your notes and your plan, and answers with verse chips that jump straight into the reader.

Constraints

  • No third-party dependencies — Apple frameworks and bundled public-domain scripture only.
  • iOS 18 deployment target, iPhone-first and running on iPad, with Liquid Glass surfaces on iOS 26 and a graceful material fallback below it.
  • Design carries the intent: warm near-black canvas, antique gold and parchment, procedural light backgrounds, arch motifs.

Screens

  • The Harvest — the Home screen, with the verse of the day and today’s reading

    Home

  • The Harvest — the KJV reader, open to 1 John 4

    Reader

  • The Harvest — Notes, filterable by Reflection, Sermon and Prayer

    Notes

  • The Harvest — Sermons, ready to transcribe an added sermon

    Sermons

Client work

Little Town

Client · Web

A play-town for small children in Fairfield, Illinois — memberships, parties and open play.

Open the live siteRead the code on GitHub

What it does

  • Seven hand-built pages — visit, memberships, pricing, parties, the story — written to answer a parent’s questions in the order a parent actually asks them.
  • Hand-written HTML, CSS and a little JavaScript. No framework and no build step — a brochure doesn’t need a toolchain.
  • Cross-sells the coffee shop next door, which is the other site on this page.
Little Town — the home page

Little Town

Little Town — the home page, on mobile

Mobile

Client work

Fusion Coffee

Client · Web

Marketing site for a specialty coffee shop in downtown Fairfield, Illinois.

Open the live siteRead the code on GitHub

What it does

  • Built from the shop’s own moodboard — warm, editorial and photography-forward — with their neon logo kept as the brand mark.
  • Next.js App Router exported as a fully static site, and installable as a PWA from the web manifest and icon set.
  • Shop content — address, hours, menu, socials — lives in a single site file, so it changes in one place.
  • Ordering hands off to the Square flow the shop already runs.
Fusion Coffee — the home page

Fusion Coffee

Fusion Coffee — the home page, on mobile

Mobile

Client work

PC Pro Inspections

Client · Web

Marketing site for a residential home inspection business in Southern Illinois.

Open the live siteRead the code on GitHub

What it does

  • Instant quote calculator, lead capture with no backend, local SEO and JSON-LD.
  • Static React build; the owner edits business details in one config file.
  • Built to rank for someone searching for an inspector in the next town over.
PC Pro Inspections — the home page

PC Pro Inspections

PC Pro Inspections — the home page, on mobile

Mobile

Client work

Faith Outreach

Client · Web

A church website redesign in Terre Haute, Indiana — redesigned in place, on the platform the staff already knew.

Open the live site

What it does

  • Redesigned in place on Squarespace 7.1 rather than rebuilt in code, because the people who had to keep it updated were church staff, not developers.
  • The work happened on a private duplicate of the live site, so nothing changed for a visitor until it was ready.
  • Delivered as a project binder: redesign plan, brand kit, page-by-page copy, a build runbook and a plain-English edit guide for staff.
  • An old-to-new redirect map built from the site’s existing sitemap, so the congregation’s existing links and search rankings survived the launch.
  • The church has since moved the live site onto a different platform — the screenshots below are the Squarespace redesign as delivered, not the site’s current build.
Faith Outreach — the redesigned home page

Faith Outreach

Faith Outreach — the Plan Your Visit page, on mobile

Mobile

Contact

Open to full-stack and AI engineering roles

Swift · AI integration · React Native · Postgres

Southern Illinois

cantrellco.13@gmail.com

No inbox filter and no assistant between us — I read every message myself.

Activity

Public repos
9
Last push
July 31, 2026
Mostly
TypeScript
TypeScript 50% · HTML 38% · Swift 13%