Agent skill

Elodin Simulation

by elodin-sys in elodin-sys/elodin

Create and modify physics simulations using the Elodin Python SDK.

Apache-2.0Auto-check passedResearch & Science

Install Elodin Simulation

skills CLI
$ npx skills add elodin-sys/elodin --skill elodin-simulation -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install elodin-sys/elodin elodin-simulation --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/elodin-sys/elodin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/elodin-simulation .claude/skills/elodin-simulation && rm -rf skills-src

Use ~/.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/

Facts

Skill name
elodin-simulation
GitHub stars
547
Token cost
~4.1k tokens
SKILL.md length
1,185 words
Files
3
Skills in repo
14
Repo updated
First seen
Licence
Apache-2.0

At a glance

Create and modify physics simulations using the Elodin Python SDK.

  • Works in 4 steps: Capture a baseline on main → Capture the branch under test → Diff component-by-component (ignoring… → …
  • Editing simulation Python files
  • SKILL.md covers Installation, Simulation Structure, Core Concepts and Spatial Vector Algebra, plus 7 more sections
  • Calls git, nix and just

What it does

Elodin Simulation is an agent skill from elodin-sys/elodin. Create and modify physics simulations using the Elodin Python SDK. Use when writing or editing simulation Python files, defining components or systems, spawning entities, configuring 6DOF physics, setting up visualization or assets (GLB, schematics, skyboxes, terrains), or integrating with SITL/HITL workflows.

Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `api-reference.md` and `examples.md`).

It sits in Research & Science, covering Physical and earth sciences. It works with Python. The repository describes itself as: Elodin simulation and flight software monorepo. The licence is Apache-2.0.

When your agent uses it

  • Editing simulation Python files
  • Defining components
  • Spawning entities
  • Configuring 6DOF physics

Example prompts

  • “/elodin-simulation”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Capture a baseline on main
  2. Capture the branch under test
  3. Diff component-by-component (ignoring timestamps)
  4. Interpret results

What it can do on your machine

Read from SKILL.md and the folder at commit 3bc1d99. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • nix
    • just
    • uv
    • pip
    • python

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.elodin.systems

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Elodin Simulation loads about 4.1k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 1,185 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~82
When it runs · the whole SKILL.md, loaded when a task matches
~4.1k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from elodin-sys/elodin at commit 3bc1d99, republished under its Apache-2.0 licence (© elodin-sys). 1,185 words, ~4,086 tokens.

Download SKILL.mdSave it as .claude/skills/elodin-simulation/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
elodin-simulation
description
Create and modify physics simulations using the Elodin Python SDK. Use when writing or editing simulation Python files, defining components or systems, spawning entities, configuring 6DOF physics, setting up visualization or assets (GLB, schematics, skyboxes, terrains), or integrating with SITL/HITL workflows.

Elodin Simulation

Elodin is a JAX-based simulation platform for aerospace and physical systems. Simulations are Python scripts that define a World, spawn entities with components, compose systems, and run.

Installation

bash
pip install -U elodin          # Released SDK
elodin editor sim.py           # Run with 3D visualization
elodin run sim.py              # Headless execution
python sim.py bench --profile  # Performance profiling

Simulation Structure

Every simulation follows this pattern:

python
import elodin as el
import jax.numpy as jnp

# 1. Create world
w = el.World()

# 2. Spawn entities with archetypes
w.spawn(el.Body(
    world_pos=el.SpatialTransform(linear=jnp.array([0.0, 0.0, 10.0])),
    inertia=el.SpatialInertia(mass=1.0),
), name="ball")

# 3. Define systems
@el.map
def gravity(f: el.Force, inertia: el.Inertia) -> el.Force:
    return f + el.SpatialForce(linear=inertia.mass() * jnp.array([0.0, 0.0, -9.81]))

# 4. Compose and run
sys = el.six_dof(sys=gravity, integrator=el.Integrator.Rk4)
w.run(sys, simulation_rate=120.0)

Core Concepts

Components

Data containers defined with typing.Annotated + el.Component:

python
import typing as ty

Wind = ty.Annotated[
    jax.Array,
    el.Component("wind", el.ComponentType(el.PrimitiveType.F64, (3,)),
                 metadata={"element_names": "x,y,z"}),
]

Built-in spatial types (WorldPos, WorldVel, Force, Inertia, WorldAccel) already carry component metadata — no ComponentType needed.

Archetypes

Group components into spawnable bundles:

python
@el.dataclass
class Satellite(el.Archetype):
    world_pos: el.WorldPos
    world_vel: el.WorldVel
    inertia: el.Inertia
    reaction_wheels: ReactionWheelCmd

el.Body is the built-in archetype providing WorldPos, WorldVel, Inertia, Force, WorldAccel.

Systems

Three decorator levels — choose the simplest that fits:

DecoratorUse whenGraph queries?
@el.mapSimple per-entity transform, vectorizedNo
@el.map_seqNeed jax.lax.cond short-circuit behaviorNo
@el.systemNeed Query.map, GraphQuery.edge_fold, or multi-queryYes
python
@el.map
def drag(vel: el.WorldVel) -> el.Force:
    return el.SpatialForce(linear=-0.01 * vel.linear())

@el.system
def gravity(graph: el.GraphQuery[GravityEdge],
            q: el.Query[el.WorldPos, el.Inertia]) -> el.Query[el.Force]:
    return graph.edge_fold(q, q, el.Force, el.SpatialForce(), compute_gravity)
System Composition

Chain systems with the pipe operator — order matters:

python
sys = sensors | kalman_filter | control | el.six_dof(sys=effectors)
6DOF Physics

el.six_dof() integrates forces/torques into position and velocity:

python
el.six_dof(
    sys=effectors,                    # Systems computing el.Force
    integrator=el.Integrator.Rk4,     # or Integrator.SemiImplicit
    time_step=1/300.0,                # Optional: override simulation step
)

Inertia is body-frame; all other quantities are world-frame.

Graph Queries

Model relationships (gravity, constraints, springs) between entities:

python
GravityEdge = ty.Annotated[el.Edge, el.Component("gravity_edge")]

w.spawn(el.Archetype(edge=GravityEdge(el.Edge(body_a_id, body_b_id))), name="a_to_b")

@el.system
def gravity(graph: el.GraphQuery[GravityEdge],
            q: el.Query[el.WorldPos, el.Inertia]) -> el.Query[el.Force]:
    return graph.edge_fold(
        left_query=q, right_query=q,
        return_type=el.Force, init_value=el.SpatialForce(),
        fold_fn=lambda acc, pos_a, m_a, pos_b, m_b: acc + compute(pos_a, m_a, pos_b, m_b),
    )

Spatial Vector Algebra

Elodin uses Featherstone spatial vectors. Key types:

TypeShapeRepresents
SpatialTransform(7,)Quaternion (4) + position (3)
SpatialMotion(6,)Angular vel (3) + linear vel (3)
SpatialForce(6,)Torque (3) + force (3)
SpatialInertia(7,)Inertia diagonal (3) + mass (1) + padding (3)

Quaternion operations: Quaternion.from_axis_angle(), q @ vector (rotate), q.inverse(), q.integrate_body(omega).

Visualization

Asset root (assets/)

Simulations load meshes, schematics, skyboxes, themes, and terrains from a single asset root. Paths in KDL (glb path=…, icon path=…) are relative to that root.

Where it lives (resolution order):

  1. $ELODIN_ASSETS — explicit override (absolute or cwd-relative)
  2. <sim_entry_dir>/assets — next to main.py / the sim entrypoint
  3. <cwd>/assets
  4. Nearest ancestor of the sim entry that contains an assets/ directory

Repo examples usually run from the Elodin checkout root and use the shared tree at assets/ (many .glb files live at the root of that tree). For a standalone sim, put an assets/ folder beside main.py, or set ELODIN_ASSETS.

When the sim records with db_path=… or ELODIN_DB_PATH, that tree is ingested once into {db}/assets/ and KDL local paths become db:… for portable replay. See the elodin-db skill and DB Asset Server.

Native folders under the asset root

Only create the subtrees you need. Keys preserve subdirectories; there is no hard schema beyond these conventions:

text
assets/
  # GLB meshes — flat at root (repo default) or under meshes/ / models/
  f22.glb
  meshes/rocket.glb          # also fine; reference as path="meshes/rocket.glb"
  models/jet.glb             # docs/tests often use models/

  schematics/                # KDL panels / window sub-schematics
    main.kdl                 # conventional active schematic key after ingest
    telemetry.kdl            # window path="telemetry.kdl" → stored under schematics/

  skyboxes/
    manifest.ron             # required for named skybox name="…"
    desert_night.cubemap.ktx2

  color_schemes/             # optional UI themes (not copied into DB by name alone)
    default_dark.json
    default_light.json

  terrains/
    planar/<region>/         # world_mesh region="<region>"
      region.toml            # optional; built-in presets exist
      config.tc              # preprocess output
      data/height/<tile>.bin
      data/albedo/<tile>.bin
    spherical/               # globe-style terrain
FolderPurposeReferenced by
(root) / meshes/ / models/GLB / custom .png iconsglb path="…", icon path="…"
schematics/KDL schematics & window subtreesActive key schematics/main.kdl; window path="…"
skyboxes/Cubemap skyboxesskybox name="…" + manifest.ron
color_schemes/Editor theme JSONtheme scheme=… (local only; built-ins need no files)
terrains/Planar / spherical world_mesh atlasesworld_mesh "death_valley" etc.

Agent tips:

  • Prefer paths relative to the asset root (path="edu-450-v2-drone.glb"), not filesystem paths outside it.
  • Do not invent reserved keys: .elodin-ingested and __index__/ are DB-internal.
  • Procedural meshes (sphere, box, …) and icon builtin=… need no asset files.
  • Custom color-scheme JSON is not persisted into the DB today — only the scheme name travels in KDL.
  • If the editor cannot find a mesh, check cwd / ELODIN_ASSETS before changing KDL.
KDL Schematics

Define 3D objects and camera views in KDL files or inline:

kdl
object_3d ball.world_pos {
    sphere radius=0.2 { color 25 50 255 }
}
object_3d aircraft.world_pos {
    glb path="f22.glb" scale=0.01 rotate="(0, 90, 0)"
}
viewport name=Chase pos="drone.world_pos.translate(-5, -5, 3)" look_at="drone.world_pos"
Panel Layout (Python API)
python
cam = el.Panel.viewport(track_entity=sat_id, fov=45.0, hdr=True, name="3D")
graph = el.Panel.graph(el.GraphEntity(sat_id, *el.Component.index(el.WorldPos)[:4]), name="Position")
w.spawn(el.Panel.vsplit(cam, graph), name="main_view")

SITL/HITL Integration

The reference SITL example is examples/betaflight-sitl/ (Betaflight flight controller in lockstep over UDP, recorded to a portable DB whose assets/ tree makes it replayable anywhere).

Use pre_step/post_step callbacks with StepContext for lockstep synchronization:

python
def post_step(tick: int, ctx: el.StepContext):
    data = ctx.component_batch_operation(reads=["drone.accel", "drone.gyro"])
    motors = flight_controller.step(accel=data["drone.accel"], gyro=data["drone.gyro"])
    ctx.write_component("drone.motor_command", motors)

w.run(sys, simulation_rate=1000.0, post_step=post_step, db_path="sitl_data")

Mark components as externally controlled to prevent simulation overwrite:

python
ThrustCmd = ty.Annotated[jax.Array,
    el.Component("thrust_cmd", el.ComponentType.F64, metadata={"external_control": "true"})]

Shared Constants And Monte Carlo

The Cranelift backend transparently interns baked StableHLO constants over 1 MB. For large immutable lookup tables, aero maps, ephemerides, terrain grids, or other constants, capture the JAX array in the system closure:

python
aero_table = jnp.asarray(aero_grid)

@el.map
def aero_force(v: el.WorldVel, f: el.Force) -> el.Force:
    coeff = aero_table[0, 0]
    return f + el.SpatialForce(linear=-coeff * v.linear())

During StableHLO parsing, large dense<"0x..."> blobs are moved into the content-addressed mmap cache. Multiple processes compiling the same constant map the same cache file, so Monte Carlo campaigns avoid paying N copies of the table in resident memory.

For campaign structure and memory reporting, use the native campaign runner:

bash
elodin monte-carlo run examples/monte-carlo/main.py \
  --campaign examples/monte-carlo/campaign.toml \
  --spec examples/monte-carlo/spec.toml \
  --out dbs/monte-carlo-demo

Declare tunable parameters with el.monte_carlo.params_spec(...), read the current row with el.monte_carlo.params(...), and optionally emit scalar outputs with el.monte_carlo.result(...). Each run writes a separate DB path. The runner pins ELODIN_CACHE_DIR for all workers and auto-sizes workers/runtime threads from available CPUs when unset. For SITL campaigns, register external controllers with world.recipe(...); the campaign runner injects worker-slot ports into every process via ELODIN_MONTE_CARLO_* environment variables. Campaign startup reaps pre-existing elodin and elodin-db processes by default to avoid stale editor/database sessions colliding with worker ports; use --keep-existing only when intentionally managing those processes yourself. Per-run stdout/stderr lands in runs/<run_id>/logs/, and the runner injects ELODIN_SIM_SUMMARY_JSON so each run writes a structured timing snapshot. At campaign end, the native runner prints and writes campaign_summary.txt with an aggregated version of the standard elodin simulation summary block plus CPU/RAM/disk rollups. Use --memory-probe only for shared-constant PSS proof runs; it enables expensive /proc/<pid>/smaps sampling and writes memory.json/processes.csv.

Show full SKILL.md (419 more words)Show less

Execution Modes

ModeCommandBackendUse
Editor (GUI)elodin editor sim.pycranelift (default)Development with 3D visualization
Headlesselodin run sim.pycranelift (default)CI/CD, batch processing
JAX backendw.run(sys, backend="jax-cpu")JAXWhen cranelift doesn't support certain JAX ops
GPU backendw.run(sys, backend="jax-gpu")JAX GPULarge parallel workloads
JAX-onlyw.to_jax(sys)JAXRL training, jax.vmap batching
Compiledw.build(sys)cranelift (default)Maximum performance
Real-timew.run(sys, simulation_rate=120.0, generate_real_time=True)cranelift (default)Match wall-clock time
DB-connectedw.run(sys, db_addr="0.0.0.0:2240")cranelift (default)External clients + Editor

Backend selection: The backend parameter defaults to "cranelift" — a pure-Rust StableHLO JIT that runs the entire tick as a single native function call, with no Python in the hot loop. Use "jax-gpu" for high-parallelism workloads that benefit from GPU execution. For tiny worlds, the CPU cranelift backend is usually fastest because kernel launch and device-transfer overhead dominates compute.

Use examples/n-body/main.py as the canonical benchmark. It runs the supported backends (cranelift, jax-cpu, jax-gpu) side-by-side:

bash
nix develop --command ELODIN_BACKEND=jax-gpu elodin run examples/n-body/main.py

To compare backends, run the same command with ELODIN_BACKEND set to each of: cranelift, jax-cpu, jax-gpu.

Earth Gravity Models

python
from elodin.j2 import J2              # Simple oblate Earth
from elodin.egm08 import EGM08        # High-fidelity spherical harmonics

model = EGM08(max_degree=64)          # <2.5ms at degree <=250
force = model.compute_field(x, y, z, mass)

Physics Regression Testing

When changes to the simulation pipeline (Noxpr graph, cranelift-mlir compilation, shape handling, etc.) might alter numeric output, use a database-export diff to detect regressions. The process:

1. Capture a baseline on main
bash
git stash && git checkout main
nix develop
just install

# Run the sim, writing to a dedicated DB path
BALL_DB_PATH=dbs/ball-main uv run examples/ball/main.py bench --ticks 2000

# Export to flat CSVs (--flatten splits vector columns)
elodin-db export --format csv --flatten --output exports/ball-main dbs/ball-main

The BALL_DB_PATH env var is read by examples/ball/main.py and passed to world().run(..., db_path=...). Other examples can be wired the same way.

2. Capture the branch under test
bash
git checkout <branch> && git stash pop
nix develop
just install
BALL_DB_PATH=dbs/ball-branch uv run examples/ball/main.py bench --ticks 2000
elodin-db export --format csv --flatten --output exports/ball-branch dbs/ball-branch
3. Diff component-by-component (ignoring timestamps)
bash
# Quick pass/fail for every physics component:
for f in ball.world_pos.csv ball.world_vel.csv ball.force.csv ball.wind.csv ball.world_accel.csv; do
    echo -n "$f: "
    diff <(cut -d',' -f2- exports/ball-main/$f) \
         <(cut -d',' -f2- exports/ball-branch/$f) | wc -l
done

Zero diff lines = bit-for-bit identical physics. Non-zero tells you which component diverged. Inspect the first differing row to find the tick where divergence starts and whether it is a large discrete jump (logic bug) or gradual drift (floating-point).

4. Interpret results
PatternLikely cause
All zerosPhysics preserved -- safe to land
One component diverges at tick 1Compilation or shape bug -- the compiled VMFB computes something different
Gradual drift accumulating over ticksFloating-point evaluation order changed (e.g., different StableHLO structure)
Only wind divergesRandom-key generation changed (seed dtype, PRNG semantics)
Tips
  • Use --ticks 2000 (not 1200) to expose drifts that accumulate.
  • Run all three canonical benchmarks to cover every code path:
    • ball -- single-entity (batch1 path), uses el.Seed (U64) + random.key
    • drone -- multi-entity, uses sensor_tick (U64)
    • cube-sat -- JAX backend (backend="jax-cpu"), covers the non-IREE path
  • If you need to dump the StableHLO MLIR for comparison, set ELODIN_IREE_DUMP_DIR=/tmp/debug before running.
  • Clean up temp databases after: rm -rf dbs/ball-main dbs/ball-branch exports/.

Additional Resources

© elodin-sys, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files in .cursor/skills/elodin-simulation of elodin-sys/elodin.

  • SKILL.md
  • api-reference.md
  • examples.md

Open the folder on GitHubat commit 3bc1d99

Compare with similar skills

Elodin Simulation 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.

Elodin Simulation compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Elodin Simulation this skillelodin-sys/elodin547—~4.1kAutomated safety check: PassApache-2.0
Cantera Ignition DelayK-Dense-AI/scientific-agent-skills48k2 repos~2.2kAutomated safety check: PassMIT
AstropyzLanqing/codex-claude-academic-skills4.6k14 repos~2.9kAutomated safety check: PassBSD-3-Clause
Climate DsHongjian01/ClimWorkflow102—~1.2kAutomated safety check: PassCustom licence
FluidSim CFD Simulationsdavila7/claude-code-templates32k10 repos~2.3kAutomated safety check: PassMIT
Chemgraphargonne-lcf/ChemGraph162—~743Automated safety check: PassApache-2.0

Similar skills

  • Cantera Ignition Delay

    K-Dense-AI/scientific-agent-skills

    Runs Cantera constant-volume or constant-pressure ignition simulations and reports temperature-based ignition delay with mechanism provenance and checks.

    48k GitHub starsUsed in 2 repos~2.2k tokens
    Research & ScienceAuto-check passed
  • Astropy

    zLanqing/codex-claude-academic-skills

    Comprehensive Python library for astronomy and astrophysics.

    4.6k GitHub starsUsed in 14 repos~2.9k tokens
    Research & ScienceAuto-check passed
  • Climate Ds

    Hongjian01/ClimWorkflow

    ClimWorkflow climate-data workflow: map a natural-language climate goal to Plan-Agent / Data-Agent / Coding-Agent roles, then call the 7-tool DAG (optional read-only validate after report).

    102 GitHub stars~1.2k tokensUpdated 20 days ago
    Research & ScienceAuto-check passed
  • FluidSim CFD Simulations

    davila7/claude-code-templates

    Runs computational fluid dynamics simulations with the FluidSim Python framework: 2D and 3D Navier-Stokes, shallow water and stratified flow solvers plus output analysis.

    32k GitHub starsUsed in 10 repos~2.3k tokens
    Research & ScienceAuto-check passed
  • Chemgraph

    argonne-lcf/ChemGraph

    Use ChemGraph Python and CLI workflows, agent-written batch scripts, and attached chemistry MCP tools.

    162 GitHub stars~743 tokensUpdated yesterday
    Research & ScienceAuto-check passed
  • Rowan

    K-Dense-AI/scientific-agent-skills

    Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API.

    48k GitHub starsUsed in 3 repos~4.3k tokens
    Research & ScienceAuto-check passed

More from elodin-sys/elodin

All 14 skills in this repo
  • Branch Regression

    elodin-sys/elodin

    Compare two git branches (usually the current branch vs main) by running every example on each, capturing exit codes, logs, and editor screenshots, then diffing the results.

    547 GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Elodin Cranelift

    elodin-sys/elodin

    Work with the Cranelift JIT MLIR backend. An agent skill from elodin-sys/elodin.

    547 GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • Elodin DB

    elodin-sys/elodin

    Work with Elodin-DB, the time-series telemetry database. An agent skill from elodin-sys/elodin.

    547 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed
  • Elodin Dev

    elodin-sys/elodin

    Develop and contribute to the Elodin codebase. An agent skill from elodin-sys/elodin.

    547 GitHub stars~896 tokensUpdated yesterday
    Auto-check passed
  • Elodin Editor Dev

    elodin-sys/elodin

    Contribute to the Elodin Editor, the 3D viewer and graphing tool.

    547 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Elodin Headless Capture

    elodin-sys/elodin

    Run the Elodin Editor without a physical display in Gamescope, take screenshots, and record video through PipeWire and GStreamer.

    547 GitHub stars~2.2k tokensUpdated yesterday
    Auto-check: notes

Works with

Questions about Elodin Simulation

What does Elodin Simulation do?

Create and modify physics simulations using the Elodin Python SDK. Elodin Simulation is an agent skill from elodin-sys/elodin. Create and modify physics simulations using the Elodin Python SDK.

When should I use Elodin Simulation?

Elodin Simulation fits situations like: editing simulation Python files; defining components; spawning entities; configuring 6DOF physics.

How do I install Elodin Simulation in Claude Code?

Run `npx skills add elodin-sys/elodin --skill elodin-simulation -a claude-code`. Or copy the skill folder (.cursor/skills/elodin-simulation in elodin-sys/elodin) into .claude/skills/elodin-simulation in your project. Claude Code loads it when a task matches its description.

How do I install Elodin Simulation in Codex?

Run `npx skills add elodin-sys/elodin --skill elodin-simulation -a codex`. Or copy the skill folder (.cursor/skills/elodin-simulation in elodin-sys/elodin) into .agents/skills/elodin-simulation in your project. Codex loads it when a task matches its description.

Can I use Elodin Simulation in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elodin-sys/elodin --skill elodin-simulation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/elodin-simulation, .gemini/skills/elodin-simulation, .github/skills/elodin-simulation and .opencode/skills/elodin-simulation in your project.

What does Elodin Simulation need to run?

Going by SKILL.md and its folder, Elodin Simulation needs the command-line tools its instructions call (git, nix, just, uv, pip and python). Our summary lists: Python 3.

Does Elodin Simulation access the network?

SKILL.md names 1 domain. As links in the text: docs.elodin.systems. This is read from the text; nothing was executed.

Is Elodin Simulation safe to install?

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.

What licence does Elodin Simulation use?

Elodin Simulation is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Elodin Simulation use?

About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Elodin Simulation?

Skills that share tags, products or a category with Elodin Simulation: Cantera Ignition Delay (K-Dense-AI/scientific-agent-skills, 48k stars), Astropy (zLanqing/codex-claude-academic-skills, 4.6k stars), Climate Ds (Hongjian01/ClimWorkflow, 102 stars) and FluidSim CFD Simulations (davila7/claude-code-templates, 32k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Elodin Simulation?

elodin-sys (a GitHub organization) maintains it in elodin-sys/elodin, which has 547 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 7, 2026.

Source: elodin-sys/elodin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.