Swift Concurrency
nimblehq/ios-templates
Write, review, or fix Swift 6 concurrency code using actors, Sendable, structured concurrency, and the strict data-race-safety model.
Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or…
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrency --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/swift-concurrency .claude/skills/swift-concurrency && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .claude/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrencyType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrency --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/swift-concurrency .agents/skills/swift-concurrency && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .agents/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrency --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/swift-concurrency .cursor/skills/swift-concurrency && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .cursor/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/henrypldev/react-native-nitro-mlx.git --path .agents/skills/swift-concurrency--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrency --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/swift-concurrency .gemini/skills/swift-concurrency && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .gemini/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrencyInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/swift-concurrency .github/skills/swift-concurrency && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .github/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install henrypldev/react-native-nitro-mlx swift-concurrency --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/henrypldev/react-native-nitro-mlx.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/swift-concurrency .opencode/skills/swift-concurrency && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "swift-concurrency" agent skill from https://github.com/henrypldev/react-native-nitro-mlx/tree/main/.agents/skills/swift-concurrency into .opencode/skills/swift-concurrency/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-concurrency", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
swift-concurrencyDiagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or…
Swift Concurrency is an agent skill from henrypldev/react-native-nitro-mlx. Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or concurrency-related compiler and linter warnings.
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 16 other files, including reference files (for example `references/_index.md`, `references/actors.md` and `references/async-algorithms.md`).
It sits in Development, covering Async programming, Linting and formatting and iOS development. It works with Swift and Xcode. The repository describes itself as: Run LLMs on device using Apple's MLX. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit d58dda0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
swiftFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
swiftconcurrencycourse.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Swift Concurrency loads about 3.1k tokens when it runs, and up to ~57k if it reads all its reference files. Until then it costs about 65 tokens; SKILL.md has 1,351 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from henrypldev/react-native-nitro-mlx at commit d58dda0, republished under its MIT licence (© henrypldev). 1,351 words, ~3,118 tokens.
.claude/skills/swift-concurrency/SKILL.md (or your agent's skills folder). This skill also uses 15 other files; get the full folder from GitHub.Before proposing a fix:
Package.swift or .pbxproj to determine Swift language mode, strict concurrency level, default isolation, and upcoming features. Do this always, not only for migration work.@MainActor, custom actor, actor instance isolation, or nonisolated.await): start on @MainActor only when that prefix truly needs main-actor access; otherwise use Task { @concurrent in ... } and hop back with MainActor.run only after the suspension. A trivial non-main line (for example, print) followed by main-actor work in the same prefix is not a reason to use @concurrent. For delayed retries, timers, and backoff tasks, separate the waiting from the UI mutation. The sleep often belongs off the main actor even when the final state update belongs on it.Project settings that change concurrency behavior:
| Setting | SwiftPM (Package.swift) | Xcode (.pbxproj) |
|---|---|---|
| Language mode | swiftLanguageVersions or -swift-version (// swift-tools-version: is not a reliable proxy) | Swift Language Version |
| Strict concurrency | .enableExperimentalFeature("StrictConcurrency=targeted") | SWIFT_STRICT_CONCURRENCY |
| Default isolation | .defaultIsolation(MainActor.self) | SWIFT_DEFAULT_ACTOR_ISOLATION |
| Upcoming features | .enableUpcomingFeature("NonisolatedNonsendingByDefault") | SWIFT_UPCOMING_FEATURE_* |
| Approachable Concurrency | N/A (use individual upcoming features) | SWIFT_APPROACHABLE_CONCURRENCY |
Xcode 26 note: New projects created in Xcode 26 will often start with
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActorandSWIFT_APPROACHABLE_CONCURRENCY = YESenabled by default. Treat these as likely defaults for newly created projects, not as confirmed settings.
If any of these are unknown, ask the developer to confirm them before giving migration-sensitive guidance. Do not guess, even for new Xcode 26 projects.
Guardrails:
@MainActor as a blanket fix. Justify why the code is truly UI-bound.Task.detached only with a clear reason.@preconcurrency, @unchecked Sendable, or nonisolated(unsafe), require a documented safety invariant and a follow-up removal plan.Use Quick Fix Mode when all of these are true:
Skip Quick Fix Mode when any of these are true:
| Diagnostic | First check | Smallest safe fix | Escalate to |
|---|---|---|---|
Main actor-isolated ... cannot be used from a nonisolated context | Is this truly UI-bound? | Isolate the caller to @MainActor or use await MainActor.run { ... } only when main-actor ownership is correct. | references/actors.md, references/threading.md |
Actor-isolated type does not conform to protocol | Must the requirement run on the actor? | Prefer isolated conformance (e.g., extension Foo: @MainActor SomeProtocol); use nonisolated only for truly nonisolated requirements. | references/actors.md |
Sending value of non-Sendable type ... risks causing data races | What isolation boundary is being crossed? | Keep access inside one actor, or convert the transferred value to an immutable/value type. | references/sendable.md, references/threading.md |
SwiftLint async_without_await | Is async actually required by protocol, override, or @concurrent? | Remove async, or use a narrow suppression with rationale. Never add fake awaits. | references/linting.md |
wait(...) is unavailable from asynchronous contexts | Is this legacy XCTest async waiting? | Replace with await fulfillment(of:) or Swift Testing equivalents. | references/testing.md |
| Core Data concurrency warnings | Are NSManagedObject instances crossing contexts or actors? | Pass NSManagedObjectID or map to a Sendable value type. | references/core-data.md |
Thread.current unavailable from asynchronous contexts | Are you debugging by thread instead of isolation? | Reason in terms of isolation and use Instruments/debugger instead. | references/threading.md |
| SwiftLint concurrency-related warnings | Which specific lint rule triggered? | Use references/linting.md for rule intent and preferred fixes; avoid dummy awaits. | references/linting.md |
... cannot satisfy conformance requirement for a 'Sendable' type parameter (SendableMetatype) | Does the conformance carry global-actor isolation? | Remove actor isolation from the conformance, or avoid passing the metatype across isolation boundaries. See SendableMetatype section in references/actors.md. | references/actors.md |
Prefer changes that preserve behavior while satisfying data-race safety:
@MainActor.actor, or use @MainActor only if the state is UI-owned.async API marked @concurrent; when work can safely inherit caller isolation, use nonisolated without @concurrent. When spawning a Task, match entry isolation to its synchronous prefix. If nothing before the first await needs the main actor, use Task { @concurrent in ... } and hop back via await MainActor.run { ... } for the UI update. If the prefix mixes a trivial non-main statement with main-actor work, keep the inherited @MainActor start—splitting the cheap line off-main is not worth an extra hop.@unchecked Sendable.| Need | Tool | Key Guidance |
|---|---|---|
| Single async operation | async/await | Default choice for sequential async work |
| Fixed parallel operations | async let | Known count at compile time; auto-cancelled on throw |
| Dynamic parallel operations | withTaskGroup | Unknown count; structured — cancels children on scope exit |
| Sync → async bridge | Task { } | Inherits actor context; use Task.detached only with documented reason |
| Shared mutable state | actor | Prefer over locks/queues; keep isolated sections small |
| UI-bound state | @MainActor | Only for truly UI-related code; justify isolation |
Network request with UI update
Task { @concurrent in
let data = try await fetchData()
await MainActor.run { self.updateUI(with: data) }
}Processing array items in parallel
await withTaskGroup(of: ProcessedItem.self) { group in
for item in items {
group.addTask { await process(item) }
}
for await result in group {
results.append(result)
}
}Match a Task's entry isolation to its synchronous prefix (everything from { to the first await).
@MainActor, keep the inherited @MainActor start.@MainActor, prefer Task { @concurrent in ... } and hop back only for UI-owned mutation.// ❌ Synchronous prefix is empty; first work hops away
Task {
await hopToOtherIsolationDomain()
}
// ❌ Synchronous prefix is only `print` (trivial, non-main); first await hops away
Task {
print("Also not main-thread-bound")
await hopToOtherIsolationDomain()
}
// ✅ Start off the main actor, hop back only for UI work
Task { @concurrent in
await hopToOtherIsolationDomain()
await MainActor.run { updateUI() }
}
// ✅ Synchronous prefix DOES contain main-actor work — keep inheritance
Task {
print("debug") // trivial, non-main — rides along
self.isLoading = true // needs @MainActor, before any await
await fetchData()
}Key changes in Swift 6:
Apply this cycle for each migration change:
swift build or Xcode build to surface new diagnosticsswift test or Cmd+U)If a fix introduces new warnings, resolve them before continuing. Never batch multiple unrelated fixes — keep commits small and reviewable.
For detailed migration steps, see references/migration.md.
Open the smallest reference that matches the question:
references/async-await-basics.md — async/await syntax, execution order, async let, URLSession patternsreferences/tasks.md — Task lifecycle, cancellation, priorities, task groups, structured vs unstructuredreferences/actors.md — Actor isolation, @MainActor, global actors, reentrancy, custom executors, Mutexreferences/sendable.md — Sendable conformance, value/reference types, @unchecked, region isolationreferences/threading.md — Execution model, suspension points, Swift 6.2 isolation behaviorreferences/async-sequences.md — AsyncSequence, AsyncStream, when to use vs regular async methodsreferences/async-algorithms.md — Debounce, throttle, merge, combineLatest, channels, timersreferences/testing.md — Swift Testing first, XCTest fallback, leak checksreferences/performance.md — Profiling with Instruments, reducing suspension points, execution strategiesreferences/memory-management.md — Retain cycles in tasks, memory safety patternsreferences/core-data.md — NSManagedObject sendability, custom executors, isolation conflictsreferences/migration.md — Swift 6 migration strategy, closure-to-async conversion, @preconcurrency, FRP migrationreferences/linting.md — Concurrency-focused lint rules and SwiftLint async_without_awaitreferences/glossary.md — Quick definitions of core concurrency termsWhen changing concurrency code:
Task.isCancelled in long-running operations.Mutex would express ownership more safely.Note: This skill is based on the comprehensive Swift Concurrency Course by Antoine van der Lee.
© henrypldev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 15 other files (references) in .agents/skills/swift-concurrency of henrypldev/react-native-nitro-mlx.
Open the folder on GitHubat commit d58dda0
We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 3 other GitHub owners. This page covers the copy in henrypldev/react-native-nitro-mlx, which our catalogue first saw on October 7, 2026.
Swift Concurrency next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Swift Concurrency this skillhenrypldev/react-native-nitro-mlx | 100 | 3 repos | ~3.1k | Automated safety check: Pass | MIT | |
| Swift Concurrencynimblehq/ios-templates | 110 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Swift Concurrencyjamesrochabrun/skills | 216 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Concurrency Patternsgustavscirulis/snapgrid | 117 | 1 repos | ~1.2k | Automated safety check: Pass | Custom licence | |
| Swift Concurrency Protwostraws/Swift-Concurrency-Agent-Skill | 564 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Swift Concurrencysupabitapp/supaterm | 172 | — | ~3.3k | Automated safety check: Pass | Custom licence |
nimblehq/ios-templates
Write, review, or fix Swift 6 concurrency code using actors, Sendable, structured concurrency, and the strict data-race-safety model.
jamesrochabrun/skills
Guide for building, auditing, and refactoring Swift code using modern concurrency patterns (Swift 6+).
gustavscirulis/snapgrid
Swift concurrency patterns including Swift 6.2 approachable concurrency, structured concurrency, actors, continuations, and migration.
twostraws/Swift-Concurrency-Agent-Skill
Reviews Swift code for concurrency correctness, modern API usage, and common async/await pitfalls.
supabitapp/supaterm
Diagnose data races, convert callback-based code to async/await, implement actor isolation patterns, resolve Sendable conformance issues, and guide Swift 6 migration.
AFK-surf/OpenBridge
Expert guidance on Swift Concurrency best practices, patterns, and implementation.
Categories
Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or…. Swift Concurrency is an agent skill from henrypldev/react-native-nitro-mlx. Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or concurrency-related compiler and linter warnings.
Swift Concurrency fits situations like: tasks that involve Async programming; tasks that involve Linting and formatting; tasks that involve iOS development.
Run `npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a claude-code`. Or copy the skill folder (.agents/skills/swift-concurrency in henrypldev/react-native-nitro-mlx) into .claude/skills/swift-concurrency in your project. Claude Code loads it when a task matches its description.
Run `npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a codex`. Or copy the skill folder (.agents/skills/swift-concurrency in henrypldev/react-native-nitro-mlx) into .agents/skills/swift-concurrency in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add henrypldev/react-native-nitro-mlx --skill swift-concurrency -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/swift-concurrency, .gemini/skills/swift-concurrency, .github/skills/swift-concurrency and .opencode/skills/swift-concurrency in your project.
Going by SKILL.md and its folder, Swift Concurrency needs the command-line tools its instructions call (swift).
SKILL.md names 1 domain. As links in the text: swiftconcurrencycourse.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Swift Concurrency is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 54k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Swift Concurrency: Swift Concurrency (nimblehq/ios-templates, 110 stars), Swift Concurrency (jamesrochabrun/skills, 216 stars), Concurrency Patterns (gustavscirulis/snapgrid, 117 stars) and Swift Concurrency Pro (twostraws/Swift-Concurrency-Agent-Skill, 564 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
henrypldev (a GitHub organization) maintains it in henrypldev/react-native-nitro-mlx, which has 100 GitHub stars. The repository was last updated on August 25, 2026.
Source: henrypldev/react-native-nitro-mlx on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.