Elixir
streamband/hydra-srt
A skill your agent uses for Elixir/Phoenix development in this repo: implementing features, refactors, debugging, tests, Ecto changes, and production-safe fixes.
A skill your agent uses when writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes…
$ npx skills add ericrisco/rsc-harness --skill elixir -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness elixir --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/elixir .claude/skills/elixir && 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 "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .claude/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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/elixirType 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 elixir -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness elixir --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/elixir .agents/skills/elixir && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .agents/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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 elixir -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness elixir --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/elixir .cursor/skills/elixir && 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 "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .cursor/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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/elixir--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 elixir -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness elixir --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/elixir .gemini/skills/elixir && 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 "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .gemini/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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 elixirInstalls 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 elixir -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/elixir .github/skills/elixir && 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 "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .github/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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 elixir -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 elixir --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/elixir .opencode/skills/elixir && 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 "elixir" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/elixir into .opencode/skills/elixir/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "elixir", 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.
elixirA skill your agent uses when writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes…
Elixir is an agent skill from ericrisco/rsc-harness. Use when writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes misbehave (restart loops, mailbox growth, call timeouts). NOT a Phoenix web app, LiveView, Ecto or channels (that is phoenix).
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/mix-and-releases.md`).
It sits in Development, covering LLM observability and Refactoring. It works with Elixir. 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.
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.
Elixir loads about 2.9k tokens when it runs, and up to ~4.8k if it reads all its reference files. Until then it costs about 78 tokens; SKILL.md has 1,215 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). 1,215 words, ~2,925 tokens.
.claude/skills/elixir/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.You are writing Elixir on the BEAM. The runtime gives you cheap isolated processes, preemptive scheduling, and supervision. The single mental shift that separates idiomatic Elixir from ported imperative code: let it crash and supervise it, do not defend every call. A process that hits an impossible state should die and be restarted clean by its supervisor — that is more correct than a try/rescue that limps on with corrupt state.
Default to pure functions. Most of your code is data transformation and needs no process at all. Reach for a process only when you need state, concurrency, or fault isolation. Target Elixir v1.19.5 (stable, requires Erlang/OTP 28.1+) or v1.20-rc (full type inference, OTP 27+/29). Use the modern stdlib: built-in JSON, set-theoretic type warnings, mix format.
A process is not "an object": spawning one to hold a value you could pass as an argument is the most common beginner mistake, and it adds a serialization bottleneck and a failure mode for nothing.
| Situation | Use | Why |
|---|---|---|
| Pure transform of input -> output | plain function / module | No state, no concurrency: a process only adds overhead and a mailbox |
| Hold mutable state behind an API | GenServer (or Agent for trivial state) | Serializes access, owns a lifecycle, supervisable |
| Run N independent jobs concurrently | Task.async_stream / Task.Supervisor | Bounded fan-out, results collected, crashes isolated |
| Isolate a risky/external boundary | a supervised process | A crash there restarts clean without taking down callers |
| Shared read-heavy cache | :ets table | Concurrent lock-free reads, no single-process bottleneck |
Rule: if two pieces of code never run at the same time and share no mutable state, they are functions, not processes.
Match in function heads, not with if — branches become exhaustive and self-documenting, and a non-match crashes loudly instead of silently falling through.
# Bad - imperative branching, easy to miss a case
def area(shape) do
if shape.type == :circle do
:math.pi() * shape.r * shape.r
else
shape.w * shape.h
end
end
# Good - one clause per shape, unmatched input crashes (which a supervisor handles)
def area(%Circle{r: r}), do: :math.pi() * r * r
def area(%Rect{w: w, h: h}), do: w * hReturn tagged tuples {:ok, value} / {:error, reason} — the caller pattern-matches the outcome; this is the protocol the whole ecosystem speaks.
# Good
def fetch(id) do
case Repo.get(id) do
nil -> {:error, :not_found}
record -> {:ok, record}
end
endChain fallible steps with with — it reads as the happy path and short-circuits on the first non-match, no nested case pyramids.
# Good - any step returning a non-{:ok, _} falls straight to else
with {:ok, user} <- fetch_user(id),
{:ok, acct} <- fetch_account(user),
:ok <- authorize(acct) do
{:ok, acct}
else
{:error, reason} -> {:error, reason}
endUse guards to constrain clauses (when is_integer(n) and n > 0) — keeps validation declarative and lets the compiler reason about types.
Pipe left-to-right for data flowing through transforms — data |> step1() |> step2(). Do not pipe just to avoid an intermediate variable; if a step needs the value in a non-first argument, name it.
There is no mutation. Rebinding x = f(x) makes a new binding; data you passed elsewhere is unchanged. Stop reaching for mutable accumulators — use Enum.reduce/3, comprehensions, or recursion.
Raw spawn/send/receive exists and is fine for a throwaway fire-and-forget where supervision genuinely does not matter, but in production you almost always want an OTP behaviour (GenServer/Task/Agent) so you get child_spec, supervision, and shutdown handling for free.
spawn_link) couples lifetimes: if one dies abnormally, the other gets an exit signal. This is how supervision works.Process.monitor/1) is one-directional and non-fatal: you get a {:DOWN, ...} message but you do not die. Use it when you care that something died but should survive it.Split the client API (runs in the caller) from the server callbacks (run in the GenServer process). Callers never touch state directly.
defmodule Counter do
use GenServer
# --- Client API (caller's process) ---
def start_link(opts) do
GenServer.start_link(__MODULE__, opts[:start] || 0, name: opts[:name] || __MODULE__)
end
@spec increment(GenServer.server()) :: :ok
def increment(server \\ __MODULE__), do: GenServer.cast(server, :increment)
@spec value(GenServer.server()) :: integer()
def value(server \\ __MODULE__), do: GenServer.call(server, :value)
# --- Server callbacks (GenServer's process) ---
@impl true
def init(start), do: {:ok, start, {:continue, :warm_up}}
@impl true
def handle_continue(:warm_up, state) do
# heavy/slow init goes here, AFTER start_link has returned
{:noreply, state}
end
@impl true
def handle_cast(:increment, count), do: {:noreply, count + 1}
@impl true
def handle_call(:value, _from, count), do: {:reply, count, count}
endinit/1. start_link blocks until init returns, so a slow init stalls the whole supervision tree boot. Return {:ok, state, {:continue, term}} and do the work in handle_continue/2.use GenServer auto-defines child_spec/1 — you rarely write one by hand; override only to change :restart or :shutdown.call is synchronous (with a 5s default timeout), cast is fire-and-forget. Use call when the caller needs the result or backpressure; cast when it does not. A flood of casts with no backpressure is the classic mailbox-growth bug — timeouts and backpressure recipes in references/otp-patterns.md.Registry, not a global atom, when you have many dynamic instances — atoms are never garbage-collected (see anti-patterns).The supervision tree starts in lib/<app>/application.ex, wired via the mod: key in mix.exs. mix new <app> --sup scaffolds this.
defmodule MyApp.Application do
use Application
@impl true
def start(_type, _args) do
children = [
{Registry, keys: :unique, name: MyApp.Registry},
{DynamicSupervisor, name: MyApp.WorkerSup, strategy: :one_for_one},
Counter
]
Supervisor.start_link(children, strategy: :one_for_one, name: MyApp.Supervisor)
end
endRestart strategy — how siblings react when one child dies:
| Strategy | On a child crash | Use when |
|---|---|---|
:one_for_one | restart only that child | children are independent (the default, most common) |
:one_for_all | restart all children | children depend on each other and shared state is invalidated |
:rest_for_one | restart that child and the ones started after it | later children depend on earlier ones |
Restart value per child — :permanent (always restart, the default), :transient (restart only on abnormal exit), :temporary (never restart). A pool worker is often :transient; a one-shot job is :temporary.
Let it crash: do not wrap business logic in try/rescue to keep a process alive. Validate inputs at the boundary, then trust the happy path; if an invariant breaks, crashing and restarting from a known-good init state is the recovery mechanism. Reserve rescue for boundaries where you must convert an exception into a tagged tuple for a caller.
For runtime-spawned children (a worker per connection/job) use DynamicSupervisor + Registry for lookup. Full recipe — plus Task, Agent, :ets and how to choose an OTP behaviour — in references/otp-patterns.md.
my_app/
mix.exs # project, deps, application/0 with mod: callback
config/
config.exs # compile-time config (read once, at build)
runtime.exs # runtime config — reads System.get_env at boot
lib/
my_app.ex
my_app/
application.ex # supervision tree
test/config.exs is compile-time; runtime.exs is runtime. Anything coming from the environment of the running release (DB URL, secrets, ports) goes in runtime.exs — it is the only config evaluated inside the built release at boot. Putting secrets in config.exs bakes build-time values into the artifact.mix release produces a self-contained tarball with its own ERTS; no Elixir/Erlang needed on the target. Run it with bin/<app> start.MIX_ENV=prod mix release
_build/prod/rel/my_app/bin/my_app startmix.exs anatomy, deps, environments, env vars, releases and the umbrella decision live in references/mix-and-releases.md.
@spec to public functions. The set-theoretic type system (gradual, sound; v1.18 inferred patterns/calls, v1.19 added protocol + anonymous-fn inference, v1.20 targets full inference) uses them and surfaces warnings at compile time — treat type warnings as bugs, they catch real mismatches before runtime.JSON (JSON.encode!/1, JSON.decode!/1, since v1.18) for basic encoding/decoding — no Jason/Poison dependency needed unless you require their extras.mix format is the canonical formatter; run it and gate CI on mix format --check-formatted.mix compile --warnings-as-errors in CI. Dialyzer and Credo are optional add-ons, not required for correct OTP code.MIX_OS_DEPS_COMPILE_PARTITION_COUNT for parallel dep compilation.| Bad | Why it bites | Do instead |
|---|---|---|
String.to_atom(user_input) | Atoms are never garbage-collected; attacker-controlled input exhausts the atom table and crashes the VM | String.to_existing_atom/1, or keep it a string / map key |
| One god GenServer all calls route through | Serializes everything into one mailbox — a hard concurrency ceiling and a single point of failure | Split by responsibility; use a Registry of per-entity processes or Task for parallel work |
Heavy work inside init/1 | start_link blocks until init returns, stalling the supervision tree boot | {:ok, state, {:continue, msg}} + handle_continue/2 |
try/rescue wrapping all logic | Defeats let-it-crash; the process limps on with corrupt state | Validate at the boundary, trust the path, let the supervisor restart |
| A new process per trivial call | Spawn + mailbox + scheduling overhead for nothing | A plain function; processes are for state/concurrency/isolation |
Unbounded cast into a slow GenServer | Producer outruns consumer, mailbox grows without bound, OOM | Use call for backpressure, or a bounded queue / GenStage |
Run scripts/verify.sh from your mix project root (the directory containing mix.exs). It checks mix format --check-formatted and mix compile --warnings-as-errors, and skips cleanly with exit 0 when Elixir/mix is not installed so it never blocks a toolchain-free CI.
© 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/elixir of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Elixir 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 |
|---|---|---|---|---|---|---|
| Elixir this skillericrisco/rsc-harness | 167 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Elixirstreamband/hydra-srt | 146 | — | ~804 | Automated safety check: Pass | Apache-2.0 | |
| Change CleanupSimon-Initiative/oli-torus | 119 | — | ~3.7k | Automated safety check: Pass | MIT | |
| Elixir AntipatternsGentleman-Programming/Gentleman-Skills | 657 | — | ~2.1k | Automated safety check: Pass | MIT | |
| Elixir Idiomsirahardianto/awesome-agv | 157 | — | ~771 | Automated safety check: Pass | MIT | |
| Refactor React Effectslangfuse/langfuse | 36k | — | ~1.7k | Automated safety check: Pass | Custom licence |
streamband/hydra-srt
A skill your agent uses for Elixir/Phoenix development in this repo: implementing features, refactors, debugging, tests, Ecto changes, and production-safe fixes.
Simon-Initiative/oli-torus
Clean up and harden code introduced by the current branch without drifting into broad refactors.
Gentleman-Programming/Gentleman-Skills
Core catalog of 8 critical Elixir/Phoenix anti-patterns covering error handling, separation of concerns, Ecto queries, and testing.
irahardianto/awesome-agv
Elixir and OTP idioms: pattern matching, with pipelines, GenServer and supervision tree architecture, fault-tolerant concurrency, and ExUnit testing.
langfuse/langfuse
Refactor avoidable React useEffect usage in Langfuse frontend code.
oliver-kriska/claude-elixir-phoenix
Find the root cause of Elixir/Phoenix bugs — crashes, exceptions, stack traces, compile errors, LiveView that won't update, silent failures.
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 writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes…. Elixir is an agent skill from ericrisco/rsc-harness. Use when writing or refactoring Elixir/OTP on the BEAM — GenServers, supervision trees and restart strategies, pattern matching, mix projects and releases — or when processes misbehave (restart loops, mailbox growth, call timeouts).
Elixir fits situations like: refactoring Elixir/OTP on the BEAM — GenServers; supervision trees and restart strategies; pattern matching; mix projects and releases —.
Run `npx skills add ericrisco/rsc-harness --skill elixir -a claude-code`. Or copy the skill folder (skills/elixir in ericrisco/rsc-harness) into .claude/skills/elixir in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill elixir -a codex`. Or copy the skill folder (skills/elixir in ericrisco/rsc-harness) into .agents/skills/elixir 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 elixir -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/elixir, .gemini/skills/elixir, .github/skills/elixir and .opencode/skills/elixir in your project.
Going by SKILL.md and its folder, Elixir needs a shell for the scripts in its folder. Our summary lists: A Bash shell; Docker.
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.
Elixir 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 1.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Elixir: Elixir (streamband/hydra-srt, 146 stars), Change Cleanup (Simon-Initiative/oli-torus, 119 stars), Elixir Antipatterns (Gentleman-Programming/Gentleman-Skills, 657 stars) and Elixir Idioms (irahardianto/awesome-agv, 157 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.