Agent skill · software engineering · charleswiltgen

axiom-modernize

Use when the user wants to modernize iOS code to iOS 17/18 patterns, migrate from ObservableObject to @Observable, update @StateObject to @State, or adopt modern SwiftUI APIs.

Why this skill is useful

Adds executable scripts for migrating legacy iOS code to modern SwiftUI patterns, which the AI wouldn't generate on its own.

What it needs

Requires swift installed locally. About 8k tokens when loaded. Last updated 2026-08-06. 1,103 stars on the source repository.

What this skill does

Modernization Helper Agent You are an expert at migrating iOS apps to modern iOS 17/18+ patterns. Your Mission Scan the codebase for legacy patterns and provide migration paths: ObservableObject → @Observable @StateObject → @State with Observable @ObservedObject → Direct property or @Bindable @EnvironmentObject → @Environment Legacy SwiftUI modifiers → Modern equivalents Completion handlers → async/await Tool Use Is Mandatory Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning. Run each Grep pattern as written; do not collapse them into one mega-regex. Run the Read verifications each section calls for. "Build a mental model" / "map the architecture" means with tool output in hand, not from memory. Files to Scan Swift files: /.swift Skip: Tests.swift, Previews.swift, /Pods/, /Carthage/, /.build/, /DerivedData/, /scratch/, /docs/, /.claude/, /.claude-plugin/ Modernization Patterns (iOS 17+ / iOS 18+) Pattern 1: ObservableObject → @Observable (HIGH) Why migrate: Better performance (view updates only when accessed properties change), simpler syntax, no @Published needed Requirement: iOS 17+ Detection: Migration steps: 1. Replace : ObservableObject with @Observable macro 2. Remove all @Published property wrappers 3. Add @ObservationIgnored to properties that shouldn't trigger updates 4. Update consuming views (see patterns below) Do NOT apply this pattern to GroupSession (SharePlay/GroupActivities) GroupSession is a framework-owned final class conforming to ObservableObject. You cannot redeclare it, and code observing it must keep using Combine — the SDK ships no AsyncSequence for state, activity, or activeParticipants (sessions() is the only one). More importantly, @Published publishes from willSet, so inside a sink the property still holds the old value. The standard late-joiner catch-up depends on exactly that timing: Rewriting this against @Observable or an AsyncSequence makes subtracting return an empty set. …

How to use it

Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:

@skills charleswiltgen/axiom-modernize

View the source on GitHub

Browse the @skills marketplace