Official agent skill

Code Interpreter

by aws-samples in aws-samples/sample-strands-agent-with-agentcore

Test and prototype code in a sandboxed environment. An agent skill from aws-samples/sample-strands-agent-with-agentcore.

OfficialMITAuto-check passedDevelopment

Install Code Interpreter

skills CLI
$ npx skills add aws-samples/sample-strands-agent-with-agentcore --skill code-interpreter -a claude-code

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

GitHub CLI
$ gh skill install aws-samples/sample-strands-agent-with-agentcore code-interpreter --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/aws-samples/sample-strands-agent-with-agentcore.git skills-src && mkdir -p .claude/skills && cp -r skills-src/chatbot-app/agentcore/skills/code-interpreter .claude/skills/code-interpreter && 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
code-interpreter
GitHub stars
194
Token cost
~3.6k tokens
SKILL.md length
1,134 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MIT

At a glance

Test and prototype code in a sandboxed environment. An agent skill from aws-samples/sample-strands-agent-with-agentcore.

  • Works in 6 steps: matplotlib.use('Agg') before import… → Use print() for text output — stdout is… → output_filename must match exactly — the… → …
  • Verifying logic
  • SKILL.md covers Available Tools, Tool Parameters, tool_input Examples and When to Use This Skill, plus 6 more sections
  • Calls pip

What it does

Code Interpreter is an agent skill from aws-samples/sample-strands-agent-with-agentcore, published by the product's own GitHub organization. Test and prototype code in a sandboxed environment. Use for debugging, verifying logic, or installing packages.

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development. It works with Python. The repository describes itself as: Reference architecture for agentic AI chatbots with Strands Agents and Amazon Bedrock AgentCore. The licence is MIT.

When your agent uses it

  • Verifying logic
  • Installing packages

Example prompts

  • “/code-interpreter”

Requirements

  • Python 3
  • Node.js

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. matplotlib.use('Agg') before import matplotlib.pyplot — sandbox has no display.
  2. Use print() for text output — stdout is how results are returned.
  3. output_filename must match exactly — the filename in plt.savefig() or wb.save() must match the output_filename parameter.
  4. Use execute_command for shell tasks — ls, pip install, curl, etc.
  5. Use file_operations for file management — read/write/list/remove files explicitly.
  6. Session state persists — variables and files remain across calls. Use this for multi-step workflows.

What it can do on your machine

Read from SKILL.md and the folder at commit 6dd9d13. 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:

    • pip

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

  • Network

    No URLs in SKILL.md. Its commands use pip, which can reach the network depending on how they are called.

    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

Code Interpreter loads about 3.6k tokens when it runs. Until then it costs about 32 tokens; SKILL.md has 1,134 words of instructions outside code blocks.

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

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 aws-samples/sample-strands-agent-with-agentcore at commit 6dd9d13, republished under its MIT licence (© aws-samples). 1,134 words, ~3,553 tokens.

Download SKILL.mdSave it as .claude/skills/code-interpreter/SKILL.md (or your agent's skills folder).
name
code-interpreter
description
Test and prototype code in a sandboxed environment. Use for debugging, verifying logic, or installing packages.

Code Interpreter

A general-purpose code execution environment powered by AWS Bedrock AgentCore Code Interpreter. Run code, execute shell commands, and manage files in a secure sandbox.

Available Tools

  • execute_code(code, language, output_filename): Execute Python, JavaScript, or TypeScript code.
  • execute_command(command): Execute shell commands.
  • file_operations(operation, paths, content): Read, write, list, or remove files in the mounted session workspace.

Tool Parameters

execute_code
ParameterTypeRequiredDefaultDescription
codestringYesCode to execute. Use print() for text output.
languagestringNo"python""python", "javascript", or "typescript"
output_filenamestringNo""File to publish as a durable session file. Code must save a file with this exact name.
execute_command
ParameterTypeRequiredDescription
commandstringYesShell command to execute (e.g., "ls -la", "pip install requests").
file_operations
ParameterTypeRequiredDescription
operationstringYes"read", "write", "list", or "remove"
pathslistFor read/list/removeFile paths. read: ["file.txt"], list: ["."], remove: ["old.txt"]
contentlistFor writeEntries with path and text: [{"path": "out.txt", "text": "hello"}]

tool_input Examples

execute_code — text output
json
{
  "code": "import pandas as pd\ndf = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]})\nprint(df.describe())",
  "language": "python"
}
execute_code — generate chart
json
{
  "code": "import matplotlib\nmatplotlib.use('Agg')\nimport matplotlib.pyplot as plt\nimport numpy as np\nx = np.linspace(0, 10, 100)\nplt.figure(figsize=(10,6))\nplt.plot(x, np.sin(x))\nplt.title('Sine Wave')\nplt.savefig('sine.png', dpi=300, bbox_inches='tight')\nprint('Done')",
  "language": "python",
  "output_filename": "sine.png"
}
execute_command — install a package
json
{
  "command": "pip install yfinance"
}
execute_command — check environment
json
{
  "command": "python --version && pip list | head -20"
}
file_operations — write a file
json
{
  "operation": "write",
  "content": [{"path": "config.json", "text": "{\"key\": \"value\"}"}]
}
file_operations — list files
json
{
  "operation": "list",
  "paths": ["."]
}
file_operations — read a file
json
{
  "operation": "read",
  "paths": ["output.csv"]
}

When to Use This Skill

Use code-interpreter as a sandbox for testing and prototyping code. For production tasks (creating documents, charts, presentations), prefer specialized skills.

Do NOT use for:

  • Formatting or displaying code examples (respond directly with markdown code blocks)
  • Explaining code or algorithms (respond directly with text)
  • Simple calculations you can do mentally (just provide the answer)
  • Any task that doesn't require actual code execution
TaskRecommended SkillNotes
Create charts/diagramsvisual-designUse this first for production charts
Create Word documentsword-documentsHas template support and styling
Create Excel spreadsheetsexcel-spreadsheetsHas formatting pipeline and validation
Create PowerPointpowerpoint-presentationsHas layout system and design patterns
Test code snippetscode-interpreterDebug, verify logic, check output
Prototype algorithmscode-interpreterExperiment before implementing
Install/test packagescode-interpreterCheck compatibility, test APIs
Debug code logiccode-interpreterIsolate and test specific functions
Verify calculationscode-interpreterQuick math or data checks

Code Interpreter vs Code Agent

Code InterpreterCode Agent
NatureSandboxed execution environmentAutonomous agent (Claude Code)
Best forQuick scripts, data analysis, prototypingMulti-file projects, refactoring, test suites
File persistenceFiles in /mnt/workspace persist across interpreter restartsAll files auto-synced to S3
Session stateVariables persist within one interpreter session; workspace files persist for the chat sessionFiles + conversation persist across sessions
AutonomyYou write the codeAgent plans, writes, runs, and iterates
Use whenYou need to run a specific piece of codeYou need an engineer to solve a problem end-to-end

Workspace Integration

The chat session has a persistent filesystem mounted at /mnt/workspace. Relative file paths used by Code Interpreter tools resolve inside this directory. Files written there are scratch files and remain available when the interpreter session is restarted. They are not user-downloadable artifacts unless output_filename is supplied.

The mount is required. If it cannot be configured or attached, Code Interpreter returns an error instead of starting an isolated non-persistent session.

Create persistent files directly:

json
{
  "tool": "execute_code",
  "code": "from pathlib import Path\nPath('/mnt/workspace/results.json').write_text('{\"ok\": true}')"
}

Use output_filename whenever a generated file must appear in Generated Files or be downloadable by the user. The tool publishes and verifies that file before returning success. Do not create Markdown links to /mnt/workspace or describe raw workspace paths as download links; the application renders the file action.

Uploaded files:

Files uploaded by the user are available in the mounted workspace without manual loading or base64 transfer under /mnt/workspace/inputs. JSON, JSONL, and NDJSON attachments may be represented by a bounded text excerpt in the conversation; use the mounted file when the full dataset is needed.

Use file_operations for scratch-file inspection. Published files are surfaced by the application and should be referenced by their displayed filename.

Environment

  • Languages: Python (recommended, 200+ libraries), JavaScript, TypeScript
  • Shell: Full shell access via execute_command
  • File system: /mnt/workspace persists across Code Interpreter restarts for the chat session
  • Session state: Variables persist within one interpreter session; files persist in the mounted workspace
  • Network: Internet access available (can use requests, urllib, curl)

Supported Languages

  • Python (recommended) — 200+ pre-installed libraries covering data science, ML, visualization, file processing
  • JavaScript — Node.js runtime, useful for JSON manipulation, async operations
  • TypeScript — TypeScript runtime with type checking
Show full SKILL.md (444 more words)Show less

Pre-installed Python Libraries

Data Analysis & Visualization
LibraryCommon Use
pandasDataFrames, CSV/Excel I/O, groupby, pivot
numpyArrays, linear algebra, random, statistics
matplotlibLine, bar, scatter, histogram, subplots
plotlyInteractive charts, 3D plots
bokehInteractive visualization
scipyOptimization, interpolation, signal processing
statsmodelsRegression, time series, hypothesis tests
sympyAlgebra, calculus, equation solving
Machine Learning & AI
LibraryCommon Use
scikit-learnClassification, regression, clustering, pipelines
torch / torchvision / torchaudioDeep learning, computer vision, audio
xgboostHigh-performance gradient boosting
spacy / nltk / textblobNLP, tokenization, NER, sentiment
scikit-imageImage processing, filters, segmentation
Mathematical & Optimization
LibraryCommon Use
cvxpyConvex optimization, portfolio optimization
ortoolsScheduling, routing, constraint programming
pulpLinear programming
z3-solverSAT solving, formal verification
networkx / igraphGraph algorithms, network analysis
File Processing & Documents
LibraryCommon Use
openpyxl / xlrd / XlsxWriterExcel read/write with formatting
python-docxWord document creation/modification
python-pptxPowerPoint creation/modification
PyPDF2 / pdfplumber / reportlabPDF read/write/generate
lxml / beautifulsoup4XML/HTML parsing
markitdownConvert various formats to Markdown
Image & Media
LibraryCommon Use
pillow (PIL)Image resize, crop, filter, conversion
opencv-python (cv2)Computer vision, feature detection
imageio / moviepyImage/video I/O and editing
pydubAudio manipulation
svgwrite / WandSVG creation, ImageMagick
Data Storage & Formats
LibraryCommon Use
duckdbSQL queries on DataFrames and files
SQLAlchemySQL ORM and database abstraction
pyarrowParquet and Arrow format processing
orjson / ujson / PyYAMLFast JSON/YAML parsing
Web & API
LibraryCommon Use
requests / httpxHTTP requests, API calls
beautifulsoup4Web scraping
fastapi / Flask / DjangoWeb frameworks
Utilities
LibraryCommon Use
pydanticData validation, schema definition
FakerTest data generation
richPretty printing, tables
cryptographyEncryption, hashing
qrcodeQR code generation
boto3AWS SDK

For the full list of 200+ libraries with versions, run: execute_command(command="pip list")

Usage Patterns

Pattern 1: Data Analysis
python
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=100),
    'revenue': np.random.normal(1000, 200, 100),
    'costs': np.random.normal(700, 150, 100),
})
df['profit'] = df['revenue'] - df['costs']

print("=== Summary Statistics ===")
print(df.describe())
print(f"\nTotal Profit: ${df['profit'].sum():,.2f}")
print(f"Profit Margin: {df['profit'].mean() / df['revenue'].mean() * 100:.1f}%")
Pattern 2: Visualization (with output_filename)
python
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

categories = ['Q1', 'Q2', 'Q3', 'Q4']
values = [120, 150, 180, 210]
axes[0,0].bar(categories, values, color='#2196F3')
axes[0,0].set_title('Quarterly Revenue')

x = np.linspace(0, 10, 50)
axes[0,1].plot(x, np.sin(x), 'b-', linewidth=2)
axes[0,1].set_title('Trend')

sizes = [35, 30, 20, 15]
axes[1,0].pie(sizes, labels=['A','B','C','D'], autopct='%1.1f%%')
axes[1,0].set_title('Market Share')

x = np.random.normal(50, 10, 200)
y = x * 1.5 + np.random.normal(0, 15, 200)
axes[1,1].scatter(x, y, alpha=0.5, c='#FF5722')
axes[1,1].set_title('Correlation')

plt.tight_layout()
plt.savefig('dashboard.png', dpi=300, bbox_inches='tight')
print('Dashboard saved')
Pattern 3: Machine Learning
python
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42
)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred, target_names=iris.target_names))
Pattern 4: SQL with DuckDB
python
import duckdb
import pandas as pd

orders = pd.DataFrame({
    'order_id': range(1, 101),
    'customer': [f'Customer_{i%20}' for i in range(100)],
    'amount': [round(50 + i * 3.5, 2) for i in range(100)],
})

result = duckdb.sql("""
    SELECT customer, COUNT(*) as cnt, ROUND(SUM(amount), 2) as total
    FROM orders GROUP BY customer
    HAVING COUNT(*) >= 3 ORDER BY total DESC LIMIT 10
""").df()
print(result.to_string(index=False))
Pattern 5: Fetch Data from Web
python
import requests
import pandas as pd

response = requests.get("https://api.example.com/data")
data = response.json()
df = pd.DataFrame(data)
print(df.head())
Pattern 6: Multi-step Workflow (session state persists)
Call 1: execute_code → load and clean data, store in variable `df`
Call 2: execute_code → analyze `df`, generate chart, save as PNG
Call 3: execute_code → export results to CSV
Call 4: file_operations(operation="read") → download the CSV

Variables (df) and files persist across calls in the same session.

Important Rules

  1. matplotlib.use('Agg') before import matplotlib.pyplot — sandbox has no display.
  2. Use print() for text output — stdout is how results are returned.
  3. output_filename must match exactly — the filename in plt.savefig() or wb.save() must match the output_filename parameter.
  4. Use execute_command for shell tasks — ls, pip install, curl, etc.
  5. Use file_operations for file management — read/write/list/remove files explicitly.
  6. Session state persists — variables and files remain across calls. Use this for multi-step workflows.

Common Mistakes to Avoid

  • Forgetting matplotlib.use('Agg') before import matplotlib.pyplot as plt
  • Using plt.show() instead of plt.savefig() — there is no display
  • Typo in output_filename — must match the file saved by the code exactly
  • Using execute_code for shell tasks — use execute_command instead
  • Writing binary files via file_operations — use execute_code to generate binary files, then download with output_filename

© aws-samples, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in chatbot-app/agentcore/skills/code-interpreter of aws-samples/sample-strands-agent-with-agentcore.

Open the folder on GitHubat commit 6dd9d13

Compare with similar skills

Code Interpreter 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.

Code Interpreter compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Code Interpreter this skillaws-samples/sample-strands-agent-with-agentcore194—~3.6kAutomated safety check: PassMIT
Releasedata-prep-kit/data-prep-kit965—~2.5kAutomated safety check: PassApache-2.0
Veomni ReviewByteDance-Seed/VeOmni2.2k—~1.7kAutomated safety check: PassApache-2.0
Browserless JavaScript Runnertaxueseek/argo184—~400Automated safety check: PassMIT
Flowfile Codegen Parity CampaignEdwardvaneechoud/Flowfile370—~7.5kAutomated safety check: PassMIT
Python Code Reviewerzhnnky329/MathModeling-skills1.1k—~688Automated safety check: PassMIT

Similar skills

  • Release

    data-prep-kit/data-prep-kit

    Guide and automate release management for data-prep-kit. An agent skill from data-prep-kit/data-prep-kit.

    965 GitHub stars~2.5k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Veomni Review

    ByteDance-Seed/VeOmni

    Pre-PR code review gate. An agent skill from ByteDance-Seed/VeOmni.

    2.2k GitHub stars~1.7k tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • Runs web-page JavaScript without a browser, in a V8 sandbox with a browser-environment shim, for scripts that only probe the environment and compute a result.

    184 GitHub stars~400 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Flowfile Codegen Parity Campaign

    Edwardvaneechoud/Flowfile

    Runbook for closing gaps between a Flowfile visual flow's results and its exported Polars or FlowFrame Python code, measured by tests rather than by eye.

    370 GitHub stars~7.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Python Code Reviewer

    zhnnky329/MathModeling-skills

    Review, run, debug, and verify approved Python modeling code against its code plan, data contract, method decision, risk conditions, and experiment outputs, saving one compact JSON review.

    1.1k GitHub stars~688 tokensUpdated 13 days ago
    DevelopmentAuto-check passed
  • Memory Optimization

    benchflow-ai/skillsbench

    Optimize Python code for reduced memory usage and improved memory efficiency.

    1.8k GitHub stars~1.5k tokensUpdated 2 mo ago
    DevelopmentAuto-check passed

More from aws-samples/sample-strands-agent-with-agentcore

All 24 skills in this repo
  • Doc Coauthoring

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Guide users through a structured workflow for co-authoring documentation.

    194 GitHub starsUsed in 39 repos~3.2k tokens
    Auto-check passed
  • Research Agent

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Deep research with structured reports and charts. An agent skill from aws-samples/sample-strands-agent-with-agentcore.

    194 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • Workspace

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Read and write files in the shared session workspace. An agent skill from aws-samples/sample-strands-agent-with-agentcore.

    194 GitHub stars~721 tokensUpdated yesterday
    Auto-check passed
  • Code Agent

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Autonomous coding agent. An agent skill from aws-samples/sample-strands-agent-with-agentcore.

    194 GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • Delegate Work

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Delegate one independent, context-heavy task to an isolated asynchronous analyst or reviewer.

    194 GitHub stars~610 tokensUpdated yesterday
    Auto-check passed
  • Excalidraw

    aws-samples/sample-strands-agent-with-agentcore

    Official

    Create hand-drawn style diagrams and flowcharts using Excalidraw

    194 GitHub stars~2.4k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Code Interpreter

What does Code Interpreter do?

Test and prototype code in a sandboxed environment. An agent skill from aws-samples/sample-strands-agent-with-agentcore. Code Interpreter is an agent skill from aws-samples/sample-strands-agent-with-agentcore, published by the product's own GitHub organization. Test and prototype code in a sandboxed environment.

When should I use Code Interpreter?

Code Interpreter fits situations like: verifying logic; installing packages.

How do I install Code Interpreter in Claude Code?

Run `npx skills add aws-samples/sample-strands-agent-with-agentcore --skill code-interpreter -a claude-code`. Or copy the skill folder (chatbot-app/agentcore/skills/code-interpreter in aws-samples/sample-strands-agent-with-agentcore) into .claude/skills/code-interpreter in your project. Claude Code loads it when a task matches its description.

How do I install Code Interpreter in Codex?

Run `npx skills add aws-samples/sample-strands-agent-with-agentcore --skill code-interpreter -a codex`. Or copy the skill folder (chatbot-app/agentcore/skills/code-interpreter in aws-samples/sample-strands-agent-with-agentcore) into .agents/skills/code-interpreter in your project. Codex loads it when a task matches its description.

Can I use Code Interpreter 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 aws-samples/sample-strands-agent-with-agentcore --skill code-interpreter -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/code-interpreter, .gemini/skills/code-interpreter, .github/skills/code-interpreter and .opencode/skills/code-interpreter in your project.

What does Code Interpreter need to run?

Going by SKILL.md and its folder, Code Interpreter needs the command-line tools its instructions call (pip). Our summary lists: Python 3; Node.js.

Does Code Interpreter access the network?

SKILL.md contains no URLs. Its commands use pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Code Interpreter 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 Code Interpreter use?

Code Interpreter is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Code Interpreter use?

About 3.6k tokens (SKILL.md is roughly 14k 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 Code Interpreter?

Skills that share tags, products or a category with Code Interpreter: Release (data-prep-kit/data-prep-kit, 965 stars), Veomni Review (ByteDance-Seed/VeOmni, 2.2k stars), Browserless JavaScript Runner (taxueseek/argo, 184 stars) and Flowfile Codegen Parity Campaign (Edwardvaneechoud/Flowfile, 370 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Code Interpreter?

aws-samples (a GitHub organization, an official publisher) maintains it in aws-samples/sample-strands-agent-with-agentcore, which has 194 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 6, 2026.

Source: aws-samples/sample-strands-agent-with-agentcore on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.