Composewebview Development
parkwoocheol/compose-webview
Builds, tests, and formats ComposeWebView multiplatform library.
A skill your agent uses when building or fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow, Hilt, Room, Retrofit, coroutines, type-safe…
$ npx skills add ericrisco/rsc-harness --skill kotlin-android -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness kotlin-android --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/kotlin-android .claude/skills/kotlin-android && 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 "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .claude/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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/kotlin-androidType 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 kotlin-android -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness kotlin-android --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/kotlin-android .agents/skills/kotlin-android && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .agents/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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 kotlin-android -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness kotlin-android --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/kotlin-android .cursor/skills/kotlin-android && 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 "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .cursor/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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/kotlin-android--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 kotlin-android -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness kotlin-android --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/kotlin-android .gemini/skills/kotlin-android && 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 "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .gemini/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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 kotlin-androidInstalls 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 kotlin-android -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/kotlin-android .github/skills/kotlin-android && 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 "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .github/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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 kotlin-android -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 kotlin-android --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/kotlin-android .opencode/skills/kotlin-android && 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 "kotlin-android" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/kotlin-android into .opencode/skills/kotlin-android/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-android", 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.
kotlin-androidA skill your agent uses when building or fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow, Hilt, Room, Retrofit, coroutines, type-safe…
Kotlin Android is an agent skill from ericrisco/rsc-harness. Use when building or fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow, Hilt, Room, Retrofit, coroutines, type-safe Navigation, and the Gradle/AGP surface. NOT shared Android and iOS UI from one Kotlin codebase (that is compose-multiplatform).
Its SKILL.md is about 2.9k 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/architecture.md`).
It sits in Mobile, covering Android development. It works with Android, Kotlin, Jetpack Compose and Gradle. 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 92fde8f. 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.
From 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.
Kotlin Android loads about 2.9k tokens when it runs, and up to ~6k if it reads all its reference files. Until then it costs about 81 tokens; SKILL.md has 1,003 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 92fde8f, republished under its MIT licence (© ericrisco). 1,003 words, ~2,935 tokens.
.claude/skills/kotlin-android/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.You build production native Android: Kotlin + Jetpack Compose + the UDF layered architecture (UI → domain → data). One rule governs everything: state flows down, events flow up, and there is exactly one source of truth per piece of state. Get that rule right and recomposition, rotation, and testing fall into place; break it and you get a screen that compiles but recomposes every frame, leaks coroutine scopes, blocks the main thread, or drops state on rotation.
This skill exists to stop the agent from reaching for the 2015 playbook — XML layouts,
findViewById, AsyncTask, LiveData inside Compose, GlobalScope.launch, MutableState
exposed straight out of a ViewModel. Emit a buildable, idiomatic module, not a toy.
These are floors verified against current docs (2026-06). Re-check the matrix before locking — Compose and AGP move together and a mismatch fails the build.
| Piece | Floor | Why it matters |
|---|---|---|
| Kotlin (KGP) | 2.2.x | K2 compiler is default & Stable; KGP must align with AGP. |
| AGP | 9.2+ when using Compose | Compose's compileSdk 37 requires AGP ≥ 9.2.0. |
| compileSdk | 37 | Current Compose target. |
| minSdk | 24 | Practical modern floor (~99% devices); Compose technically supports 21+. |
| JDK (build) | 17 | Required by current AGP/Compose toolchain. |
| Compose BOM | 2026.05.01 → Compose 1.11.2 | Pin artifacts via the BOM, never per-artifact versions. |
| Navigation | 2.8+ | Type-safe @Serializable routes land here. |
| Hilt + Room + Retrofit | current | DI / persistence / network. Wire Room & Hilt with KSP, not kapt. |
| Serialization | kotlinx.serialization | Retrofit converter + Navigation route types. |
Three layers. Higher layers depend on lower; never the reverse.
UI layer Composable (stateless) ── reads ──> UiState
│ events up ▲ state down
ViewModel exposes StateFlow<UiState> │
│ calls
domain layer (optional) UseCase — only when logic spans repos or is reused
│ calls
data layer Repository (interface in domain, impl here)
├── Room DAO → Flow (single source of truth)
└── Retrofit → suspend (refreshes the source of truth)UiState, send events. No business logic in a @Composable.Offline-first means Room is the source of truth. The network writes into Room; the UI
observes Room's Flow. WorkManager does background sync. The UI never reads the network
directly.
Each rule has a one-line reason.
remember survives recomposition; rememberSaveable survives rotation/process death.
Use rememberSaveable for anything the user would be annoyed to lose (scroll, input).derivedStateOf for computed state — recomputes only when its inputs change, not every
recomposition.key() / stable keys in LazyColumn — without a stable item key, reorder/insert churns
the whole list.@Composable — composables run on every recomposition.// Bad — logic + I/O in the composable; runs on every recomposition.
@Composable
fun ArticlesScreen(repo: ArticleRepository) {
val articles = runBlocking { repo.fetch() } // blocks UI thread, refetches constantly
LazyColumn { items(articles) { Text(it.title) } }
}
// Good — stateless UI driven by hoisted state; logic in the ViewModel.
@Composable
fun ArticlesScreen(state: ArticlesUiState, onRetry: () -> Unit) {
when (state) {
ArticlesUiState.Loading -> CircularProgressIndicator()
is ArticlesUiState.Error -> ErrorView(state.message, onRetry)
is ArticlesUiState.Success ->
LazyColumn { items(state.articles, key = { it.id }) { Text(it.title) } }
}
}Model the screen as a sealed UiState so impossible states (loading and error) can't
exist. Expose it as StateFlow, never a mutable type.
sealed interface ArticlesUiState {
data object Loading : ArticlesUiState
data class Success(val articles: List<Article>) : ArticlesUiState
data class Error(val message: String) : ArticlesUiState
}
@HiltViewModel
class ArticlesViewModel @Inject constructor(
repository: ArticleRepository,
) : ViewModel() {
val uiState: StateFlow<ArticlesUiState> =
repository.observeArticles()
.map<List<Article>, ArticlesUiState> { ArticlesUiState.Success(it) }
.catch { emit(ArticlesUiState.Error(it.message ?: "Unknown error")) }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = ArticlesUiState.Loading,
)
}Collect it lifecycle-aware so collection pauses below STARTED and you don't burn work
off-screen:
@Composable
fun ArticlesRoute(viewModel: ArticlesViewModel = hiltViewModel()) {
val state by viewModel.uiState.collectAsStateWithLifecycle()
ArticlesScreen(state = state, onRetry = viewModel::refresh)
}WhileSubscribed(5_000) keeps the flow alive 5s past the last collector so a rotation
doesn't restart the upstream pipeline.
The repository interface lives in domain; its implementation lives in data. Retrofit uses
suspend functions and a @Serializable DTO; Room DAOs return Flow. Errors surface as a
sealed result, not raw exceptions thrown into the UI.
interface ArticleRepository {
fun observeArticles(): Flow<List<Article>> // from Room — the source of truth
suspend fun refresh() // network -> Room
}The full wired example — DTO, entity, DAO, Retrofit service, repository impl, mappers, offline-first refresh — is in references/architecture.md. Read it before scaffolding a feature end-to-end.
@HiltAndroidApp on the Application, @Module @InstallIn(SingletonComponent::class) for
bindings, @HiltViewModel + hiltViewModel() for screens. Prefer constructor injection;
reach for @Provides/@Binds only for interfaces and third-party types you don't own.
Classic error: MyRepo cannot be provided without an @Inject constructor. Fix one of:
either add @Inject constructor(...) to the concrete class, or @Binds the interface to its
implementation inside an installed module. See references/gradle-setup.md
for the KSP wiring that makes Hilt generate.
GlobalScope.launch — it outlives every screen and leaks. Use viewModelScope
(UI logic) or a repository-scoped scope.@IoDispatcher CoroutineDispatcher) instead of hardcoding
Dispatchers.IO — otherwise the work isn't testable.flowOn to switch a flow's upstream context, not withContext inside a flow { }
builder (which is a context-preservation violation).Flow for streams, StateFlow for current-value state — don't collect a cold
flow when the UI needs the latest value.Since Navigation 2.8, routes are @Serializable types — the compiler checks your args.
@Serializable data object ArticleList
@Serializable data class ArticleDetail(val id: String)
NavHost(navController, startDestination = ArticleList) {
composable<ArticleList> {
ArticlesRoute(onOpen = { navController.navigate(ArticleDetail(it)) })
}
composable<ArticleDetail> { backStackEntry ->
val args = backStackEntry.toRoute<ArticleDetail>()
ArticleDetailRoute(id = args.id)
}
}No string routes, no manual arguments = listOf(navArgument(...)), no fragile key parsing.
./gradlew :app:assembleDebug lintDebug testDebugUnitTestassembleDebug proves it builds, lintDebug catches Android lint, testDebugUnitTest runs
JVM unit tests. For a fast, SDK-free static gate over the Kotlin/Gradle you just wrote,
run scripts/verify.sh — it greps for banned patterns and missing modern ones without
touching the Android SDK, so it works in CI or a bare checkout.
| Anti-pattern | Why it bites | Do instead |
|---|---|---|
XML layouts + findViewById | Stale; no compile-time view safety; doesn't compose | Jetpack Compose @Composable |
LiveData collected in a Composable | Lifecycle mismatch, extra dependency, not Compose-native | StateFlow + collectAsStateWithLifecycle() |
GlobalScope.launch | Leaks; outlives the screen; uncancellable | viewModelScope / scoped coroutine |
runBlocking / network call on the main thread | ANR, frozen UI | suspend on an injected dispatcher |
Business logic in a @Composable | Runs every recomposition; untestable | Move to ViewModel / use-case |
MutableStateFlow/mutableStateOf exposed publicly | UI can mutate state; breaks single source of truth | private mutable backing + public asStateFlow()/StateFlow |
| God-Activity holding all state | Untestable, rotation-fragile | One ViewModel per screen, hoisted state |
kapt for Room/Hilt | Slow, legacy; K2-incompatible edge cases | KSP |
collectAsState() in Compose | Keeps collecting off-screen, wastes work | collectAsStateWithLifecycle() |
| Reading the network directly in the repository's read path | No offline; UI flickers on every fetch | Room as source of truth; network refreshes it |
commonMain, expect/actual, or an iOS target appears, use
../compose-multiplatform/SKILL.md.kotlin language skill).swift-ios. Dart cross-platform → ../flutter/SKILL.md.
React Native → react-native.assembleDebug/tests → github-actions.libs.versions.toml, root +
module build.gradle.kts, the Compose Kotlin plugin, Hilt/KSP wiring, and common
Gradle/build error fixes.© 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/kotlin-android of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
Kotlin Android 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 |
|---|---|---|---|---|---|---|
| Kotlin Android this skillericrisco/rsc-harness | 156 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Composewebview Developmentparkwoocheol/compose-webview | 103 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Android Developmentdpconde/claude-android-skill | 336 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Claude Android NinjaDrjacky/claude-android-ninja | 124 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Jetpack Composedarriousliu/PiPixiv | 262 | — | ~1.5k | Automated safety check: Pass | Apache-2.0 |
parkwoocheol/compose-webview
Builds, tests, and formats ComposeWebView multiplatform library.
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
Drjacky/claude-android-ninja
Build and migrate Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), Navigation3, and multi-module Gradle.
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.
darriousliu/PiPixiv
Jetpack Compose expert skill for Android UI development. An agent skill from darriousliu/PiPixiv.
ioannisa/KSafe
Required before any reply that touches KSafe (by ksafe(...), ksafe.get/put, :ksafe-compose, :ksafe-biometrics), even a 'can KSafe do X?' question or a one-line change that looks like plain Kotlin.
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.
Works with
Categories
A skill your agent uses when building or fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow, Hilt, Room, Retrofit, coroutines, type-safe…. Kotlin Android is an agent skill from ericrisco/rsc-harness. Use when building or fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow, Hilt, Room, Retrofit, coroutines, type-safe Navigation, and the Gradle/AGP surface.
Kotlin Android fits situations like: fixing a native Android app in Kotlin and Jetpack Compose on the UDF layered architecture — ViewModel/StateFlow; type-safe Navigation; the Gradle/AGP surface.
Run `npx skills add ericrisco/rsc-harness --skill kotlin-android -a claude-code`. Or copy the skill folder (skills/kotlin-android in ericrisco/rsc-harness) into .claude/skills/kotlin-android in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill kotlin-android -a codex`. Or copy the skill folder (skills/kotlin-android in ericrisco/rsc-harness) into .agents/skills/kotlin-android 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 kotlin-android -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/kotlin-android, .gemini/skills/kotlin-android, .github/skills/kotlin-android and .opencode/skills/kotlin-android in your project.
Going by SKILL.md and its folder, Kotlin Android needs a shell for the scripts in its folder. 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.
Kotlin Android is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k 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 3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Kotlin Android: Composewebview Development (parkwoocheol/compose-webview, 103 stars), Android Development (dpconde/claude-android-skill, 336 stars), Claude Android Ninja (Drjacky/claude-android-ninja, 124 stars) and Expo Brownfield Integration (mweinbach/agent-coworker, 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 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 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.