Expo Brownfield
expo/skills
Integrate Expo and React Native into an existing native iOS or Android app.
A skill your agent uses when building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models, Swift 6 strict data-race diagnostics…
$ npx skills add ericrisco/rsc-harness --skill swift-ios -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness swift-ios --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/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/swift-ios .claude/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .claude/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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/ericrisco/rsc-harness/tree/main/skills/swift-iosType 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 ericrisco/rsc-harness --skill swift-ios -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness swift-ios --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/swift-ios .agents/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .agents/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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 ericrisco/rsc-harness --skill swift-ios -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness swift-ios --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/swift-ios .cursor/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .cursor/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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/ericrisco/rsc-harness.git --path skills/swift-ios--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 ericrisco/rsc-harness --skill swift-ios -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness swift-ios --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/swift-ios .gemini/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .gemini/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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 ericrisco/rsc-harness swift-iosInstalls 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 ericrisco/rsc-harness --skill swift-ios -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/swift-ios .github/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .github/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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 ericrisco/rsc-harness --skill swift-ios -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness swift-ios --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/swift-ios .opencode/skills/swift-ios && 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-ios" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/swift-ios into .opencode/skills/swift-ios/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swift-ios", 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-iosA skill your agent uses when building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models, Swift 6 strict data-race diagnostics…
Swift iOS is an agent skill from ericrisco/rsc-harness. Use when building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models, Swift 6 strict data-race diagnostics, async/await and actors, SwiftData persistence, NavigationStack, and Swift Testing. NOT cross-platform Dart (that is flutter), NOT React Native (that is react-native), NOT native Kotlin for Android (that is kotlin-android), NOT shared KMP code across both OSes (that is compose-multiplatform).
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/concurrency.md`).
It sits in Mobile, covering iOS development and Cross-platform mobile apps. It works with iOS, Swift, SwiftUI and React Native. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
Read from SKILL.md and the folder at commit e3d5b33. 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.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
swiftxcodebuildxcrunFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From 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 iOS loads about 3k tokens when it runs, and up to ~5.3k if it reads all its reference files. Until then it costs about 120 tokens; SKILL.md has 935 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); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 935 words, ~2,957 tokens.
.claude/skills/swift-ios/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Hand-off — the language vs the platform. This skill owns the platform: SwiftUI/UIKit views,
app lifecycle, Xcode, iOS APIs, App Store shipping. Language-level Swift — Swift 6 data-race safety
and approachable concurrency, actors and task groups, some vs any, ARC and performance, Swift
Testing, macros — is this skill's own ground. A concurrency error, a hang, a data race or a
retain cycle belongs here. Interface feel, springs and materials: ../motion-craft/SKILL.md.
Native Apple-platform apps: the code is .swift, the UI is SwiftUI, and the compiler enforces actor isolation. If the answer is a @MainActor, @Observable, async let, #expect, NavigationStack, or @Model, you are in the right place.
Mismatched language modes produce diagnostics you cannot reproduce and "fixes" that break the user's build. Pin the ground truth first.
swift --version # exact toolchain
xcodebuild -version # Xcode version
# In the .xcodeproj / Package.swift, read two settings per target:
# SWIFT_VERSION (Swift Language Version: 5 or 6)
# SWIFT_DEFAULT_ACTOR_ISOLATION (Default Actor Isolation: nonisolated or MainActor)Assumed baseline: Xcode 26 / Swift 6.2 / iOS 26 SDK (current stable seen is Xcode 26.2 / Swift 6.2.3). Do not quote a version you have not confirmed in the user's project. Rule: write for the target's actual language mode. Swift 5-mode code dropped into a Swift 6 target (or vice-versa) is the most common source of "it compiles on my machine" failures.
For new code use @Observable (the Observation framework), never ObservableObject / @Published. Why: Observation tracks per-property — a view re-renders only when a property it actually reads changes, not on every object mutation.
| Property wrapper | Use it when | One-line why |
|---|---|---|
@State | The view owns a value or an @Observable instance | Lifecycle tied to the view; survives re-renders |
@Binding | A child needs write access to a parent's value | Passes a mutable reference down, no ownership |
@Bindable | You need two-way bindings into an @Observable | Produces $model.field for TextField etc. |
@Environment | Dependency injection of a shared @Observable | One source of truth, no prop-drilling |
@Observable gives you zero thread safety. Mutating an observed property off the main actor races the UI. Annotate UI models @MainActor.
// Bad — legacy pattern, whole-object invalidation, no isolation
final class CounterModel: ObservableObject {
@Published var count = 0
}
// Good — per-property tracking, main-actor isolated
@MainActor @Observable
final class CounterModel {
var count = 0
}
struct CounterView: View {
@State private var model = CounterModel() // view owns it
var body: some View {
Stepper("\(model.count)", value: $model.count) // @State gives bindings to @Observable
}
}The mental model: SwiftUI runs on the main actor. Anything that touches UI state is main-actor work. Background work hops off, then hops back to mutate.
@MainActor class for UI/view-model state — it is the UI thread.actor for shared non-UI mutable state (a cache, a connection pool). Never model a SwiftUI view model as an actor — actors are reentrant and not main-bound, so your UI updates land off-main.Task { } inherits the current actor + priority — use it to fire async work from a Button. Task.detached inherits nothing and is almost never what you want; reaching for it to silence a warning is a bug, not a fix.async let / TaskGroup for structured parallelism (fan out, then await all).Task.isCancelled or try Task.checkCancellation() in loops. SwiftUI's .task {} auto-cancels when the view disappears — prefer it over a bare Task {} for view-lifetime work.The #1 footgun — mutating observed UI state off the main actor:
// Bad — detached task mutates main-isolated state; intermittent glitches + Swift 6 data-race warning
@MainActor @Observable final class Feed {
var items: [Item] = []
func load() {
Task.detached {
let data = try? await API.fetch()
self.items = data ?? [] // off-main mutation: WRONG
}
}
}
// Good — Task {} inherits the main actor; await off-main work, mutation lands on-main
@MainActor @Observable final class Feed {
var items: [Item] = []
func load() async {
do {
items = try await API.fetch() // await suspends; assignment is back on main
} catch is CancellationError {
// view disappeared — nothing to do
} catch {
// surface error
}
}
}
// In the view: .task { await feed.load() } // auto-cancels on disappearEscape hatch for UI-centric apps: set Default Actor Isolation = MainActor (SE-0466) on the target — unannotated code becomes main-actor-isolated by default, killing false-positive data-race warnings; you opt out with nonisolated only where you genuinely need it. The full diagnostic catalog, Sendable rules, and the staged Swift 6 migration live in references/concurrency.md.
| Choice | Use when |
|---|---|
| SwiftData (default) | New SwiftUI apps; relational/object graph; light-to-moderate migration needs |
| Core Data | Advanced/custom migrations, mature NSPersistentCloudKit edge cases |
Files (Codable → disk) | Trivial, non-relational blobs only |
import SwiftData
@Model final class Workout {
var name: String
var minutes: Int
init(name: String, minutes: Int) { self.name = name; self.minutes = minutes }
}
// App entry: attach the container once
WindowGroup { ContentView() }.modelContainer(for: Workout.self)
// In a view: query + mutate
struct ListView: View {
@Query(sort: \Workout.name) private var workouts: [Workout]
@Environment(\.modelContext) private var context
var body: some View {
List(workouts) { Text($0.name) }
.toolbar { Button("Add") { context.insert(Workout(name: "Run", minutes: 30)) } }
}
}Bad: hand-rolling JSON-to-disk for relational data with cross-references. Good: model the relationship with @Model and let SwiftData own identity and autosave.
Use NavigationStack with a value-typed path + navigationDestination(for:) — type-safe, programmatic, and deep-linkable. NavigationView is deprecated.
// Bad
NavigationView { List(items) { NavigationLink(item.name, destination: DetailView(item: item)) } }
// Good — push by value, deep-link by mutating the path
@State private var path: [Item] = []
NavigationStack(path: $path) {
List(items) { item in NavigationLink(item.name, value: item) }
.navigationDestination(for: Item.self) { DetailView(item: $0) }
}
// Deep link: path = [parent, child]Use NavigationSplitView for iPad/Mac multi-column layouts.
Swift Testing is the default (Xcode 16+, matured through Xcode 26): @Test, #expect (soft — keeps running), #require (hard — throws/unwraps), @Test(arguments:) for parameterized cases, @Suite types, parallel + in-process by default.
import Testing
@testable import MyApp
@Suite struct ScoreTests {
@Test func startsAtZero() { #expect(Score().value == 0) }
@Test(arguments: [1, 2, 3]) func adds(_ n: Int) {
var s = Score(); s.add(n)
#expect(s.value == n)
}
@Test func requiredUser() throws {
let user = try #require(UserStore().current) // hard stop if nil
#expect(user.isActive)
}
}UI automation (XCUIApplication) and performance (XCTMetric) stay in XCTest — both frameworks coexist in one target. Run: xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 17'. Depth (traits, confirmation for async events, in-memory ModelContainer for SwiftData, the XCTest migration table) in references/testing.md.
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 17' build
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 17' test
xcrun simctl list devices # manage simulators
swift build && swift test # SwiftPM packages (libraries / modular targets)App = .xcodeproj/.xcworkspace built with xcodebuild. Library or shared module = Package.swift built with swift build; use SwiftPM to pin dependency versions.
New surface: Liquid Glass via .glassEffect() (no UIVisualEffectView), the @Animatable macro for custom animatable shapes, native SwiftUI WebView, Chart3D, richer TabView roles. Adopt them behind if #available(iOS 26, *); do not casually raise the whole deployment target — most apps still support N-1/N-2.
| Anti-pattern | Why it's wrong | Do instead |
|---|---|---|
actor for a SwiftUI view model | Reentrant, not main-bound → UI mutates off-main | @MainActor @Observable class |
Task.detached to silence a warning | Drops actor + priority inheritance; hides the real race | Task {} or .task {} |
@nonisolated(unsafe) to quiet isolation errors | Disables the safety you turned on; the race remains | Make the type Sendable or keep it main-isolated |
DispatchQueue.main.async inside an @Observable model | Old concurrency model fighting actors | Annotate the model @MainActor |
ObservableObject / @Published for new code | Whole-object invalidation, no isolation help | @Observable |
NavigationView | Deprecated, no type-safe path | NavigationStack + navigationDestination |
| Blocking the main actor with sync network/disk I/O | Freezes the UI | await async work, hop back to main to mutate |
@MainActor on pure compute / leaf utilities | Needless serialization onto the UI thread | Leave it nonisolated |
XCTAssert in a new Swift Testing file | Mixing frameworks; loses #expect diagnostics | #expect / #require |
Force-unwrapping @Query / fetch results | Crashes on empty store | Handle the empty case |
github-actions, testing-web) — see recommends.© ericrisco, 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 5 other files (scripts, references) in skills/swift-ios of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Swift iOS 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 iOS this skillericrisco/rsc-harness | 167 | — | ~3k | Automated safety check: Pass | MIT | |
| Expo Brownfieldexpo/skills | 2.7k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Simulator Audio E2Ehyochan/react-native-nitro-sound | 961 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Expo UIarcboxlabs/linkcode | 156 | — | ~1.2k | Automated safety check: Pass | MIT | |
| SimdeckNativeScript/SimDeck | 152 | — | ~3.6k | Automated safety check: Pass | MIT |
expo/skills
Integrate Expo and React Native into an existing native iOS or Android app.
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
hyochan/react-native-nitro-sound
Build and run repeatable react-native-nitro-sound recorder/player regression tests on an iOS Simulator or Android emulator, with explicit virtual-device selection, microphone permission, Maestro…
arcboxlabs/linkcode
Framework (OSS). An agent skill from arcboxlabs/linkcode.
NativeScript/SimDeck
A skill your agent uses for simulator lifecycle, app install/launch, live viewing, UI inspection, touch/keyboard automation, screenshots, recordings, logs, pasteboard, hardware controls, and…
software-mansion-labs/skills
Software Mansion's moq-kit — native Swift (iOS) and Kotlin (Android) SDKs for Media over QUIC (moq-lite) live streaming: sub-second-latency playback, camera/microphone/screen publishing, and…
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models, Swift 6 strict data-race diagnostics…. Swift iOS is an agent skill from ericrisco/rsc-harness. Use when building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models, Swift 6 strict data-race diagnostics, async/await and actors, SwiftData persistence, NavigationStack, and Swift Testing.
Swift iOS fits situations like: building native iOS and Apple-platform apps in Swift with SwiftUI and modern Swift concurrency — observable view models; swift 6 strict data-race diagnostics; async/await and actors; swiftData persistence.
Run `npx skills add ericrisco/rsc-harness --skill swift-ios -a claude-code`. Or copy the skill folder (skills/swift-ios in ericrisco/rsc-harness) into .claude/skills/swift-ios in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill swift-ios -a codex`. Or copy the skill folder (skills/swift-ios in ericrisco/rsc-harness) into .agents/skills/swift-ios 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 ericrisco/rsc-harness --skill swift-ios -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-ios, .gemini/skills/swift-ios, .github/skills/swift-ios and .opencode/skills/swift-ios in your project.
Going by SKILL.md and its folder, Swift iOS needs a shell for the scripts in its folder and the command-line tools its instructions call (swift, xcodebuild and xcrun). Our summary lists: A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Swift iOS is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k 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 2.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Swift iOS: Expo Brownfield (expo/skills, 2.7k stars), Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars), Simulator Audio E2E (hyochan/react-native-nitro-sound, 961 stars) and Expo UI (arcboxlabs/linkcode, 156 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 167 GitHub stars. The repository holds 227 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.