Configuring Horizon
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new…
$ npx skills add Atmosphere/atmosphere --skill carnet -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Atmosphere/atmosphere carnet --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/Atmosphere/atmosphere.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/carnet .claude/skills/carnet && 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 "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .claude/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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/Atmosphere/atmosphere/tree/main/.agents/skills/carnetType 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 Atmosphere/atmosphere --skill carnet -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Atmosphere/atmosphere carnet --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/carnet .agents/skills/carnet && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .agents/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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 Atmosphere/atmosphere --skill carnet -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Atmosphere/atmosphere carnet --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/carnet .cursor/skills/carnet && 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 "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .cursor/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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/Atmosphere/atmosphere.git --path .agents/skills/carnet--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 Atmosphere/atmosphere --skill carnet -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Atmosphere/atmosphere carnet --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/carnet .gemini/skills/carnet && 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 "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .gemini/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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 Atmosphere/atmosphere carnetInstalls 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 Atmosphere/atmosphere --skill carnet -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/carnet .github/skills/carnet && 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 "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .github/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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 Atmosphere/atmosphere --skill carnet -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Atmosphere/atmosphere carnet --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Atmosphere/atmosphere.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/carnet .opencode/skills/carnet && 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 "carnet" agent skill from https://github.com/Atmosphere/atmosphere/tree/main/.agents/skills/carnet into .opencode/skills/carnet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "carnet", 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.
carnetWork the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new…
Carnet is an agent skill from Atmosphere/atmosphere. Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new issues in the one canonical shape. Use whenever a carnetN or registreN issue is mentioned, when you start or stop work that an issue tracks, or when you are about to run gh issue against the tracker.
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files (for example `carnet.sh`, `hooks/auto-claim.sh` and `hooks/prompt-status.sh`).
It sits in Backend & APIs. The repository describes itself as: Portable AI agent runtime for the JVM. One @Agent class runs on Spring AI, LangChain4j, Anthropic, or 9 more behind one SPI. Token streaming, tool calls, human approvals, and… The licence is Apache-2.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 13671cf. 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 script files (Shell), which the agent can run.
Shell commands in SKILL.md call:
ghgitjqFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
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.
Carnet loads about 4k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 2,327 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); files beside SKILL.md are not scanned.
The full file from Atmosphere/atmosphere at commit 13671cf, republished under its Apache-2.0 licence (© Atmosphere). 2,327 words, ~3,976 tokens.
.claude/skills/carnet/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.The register is Atmosphere/atmosphere-carnet, named by registre.toml. It is private
because this repo is public and an entry states precisely where a defence or a capability is
incomplete. Many Claude Code sessions work it at once, and nothing on a GitHub issue says a
session is on it, so peers collide: two sessions pick up the same issue and build the same fix
twice, or find the same gap and write it up twice. A claim fixes that. It is three native
GitHub facts that move together:
| Carrier | Meaning |
|---|---|
| assignee | the human accountable (gh login) |
label in-progress | a live session holds the issue |
newest carnet-claim marker comment | which session — id, name, user, host, pid, repo, branch, time |
One script does everything: .agents/skills/carnet/carnet.sh (also reachable through the
.claude/skills/carnet link). Never run gh issue against the tracker by hand — the script is
the one path that keeps the three carriers consistent and the title shape uniform.
claim <n>
yourself when the number never appeared in a prompt (you found the issue by searching, or
you are picking up work mid-session), and when the hook tells you it could NOT claim an
issue — gh logged out, the tracker unreachable: it is not held, and peers see it unclaimed.
Not after the commit: a claim made after the work is done protects nobody.--steal on your own judgement — stealing is the user's call, and the stolen-from session
is warned on the issue. A claim whose session has ended is not a refusal: release and
close exit 1 on it and say so, and a plain claim takes it over.release <n> when you abandon or hand
off; close <n> --why "…" --commit <sha> when the work landed. Both drop the label and
the assignee and post a marker. If another session took the issue over, release posts
nothing and only drops it from this session's ledger. A session that ends still holding
claims is released by the SessionEnd hook, so a forgotten release is not fatal — but do
not rely on it.claim,
release, close and status exit 1 and change nothing: the newest marker is the only
record of who holds the issue, and deciding without it is how two sessions end up on one.--why is mandatory and is what the next reader sees first.
Add --commit <sha> whenever a commit resolved it: the tracker is a different repository,
so carnet#N in a commit message is plain text to GitHub and never closes anything there.
--commit posts the commit's URL on origin.create. It reads the tracker from registre.toml, refuses a tracker that
is not private (or whose visibility it cannot read), prefixes the title with the project —
[atmosphere] — unless the title already starts with [, and always adds the
atmosphere label. Titles are [<project>] <Thing> — one shape, no variants, capitalised
first word unless it is an identifier. The body says where it is (file + symbol), what is
incomplete, and what the fix looks like. The limitation label goes only on an issue that a
LIMITATION(registre#n) marker in source will point at; plain findings get the project
label alone.C=.agents/skills/carnet/carnet.sh
$C claim 12 # hold it: assign me, label, marker comment, local ledger
$C claim 12 --steal # take it from a live or remote session — the user's decision only
$C release 12 --reason "handed to the transport session"
$C status 12 # who holds it, is that session alive, which branch
$C status # every in-progress issue in the tracker
$C mine # what this session holds (no API call, works with gh logged out); --verify to check the tracker
$C create --title "<Thing that is incomplete>" --label bug --body-file /tmp/body.md --claim
$C close 12 --why "<what resolved it>" --commit <sha>
$C label 12 +critical -bug
$C tracker # the register this checkout files into (no API call)Add --dry-run to any of them to see the gh calls without making them.
Read the thread before you implement — comments carry requirements the body does not:
gh api "repos/$($C tracker)/issues/12/comments" --paginate -q '.[].body'. The script reaches
the tracker through gh api (REST) only, because gh issue is GraphQL and a cloud session's
agent proxy refuses every GraphQL query outside a pinned set of PR-review operations.
hooks/prompt-status.sh): when a prompt names carnet#N,
registre#N, or this register's own name or issue URL (atmosphere-carnet#N,
Atmosphere/atmosphere-carnet#N, …/Atmosphere/atmosphere-carnet/issues/N), one status
line per issue lands in your context before you answer — carnet#12 · held by @alice · session Wiring (a3f9c2d1) on build-host [running] · feature/wiring · since …. Read it. If
it says unclaimed, claim before editing. If it says [session ended — stale], a plain
claim takes it over. Another register's issue — dravr-carnet#31, llm-registre#5, its
URL — is not this register's and arms nothing: the numbers overlap. A peer message or a
background task result gets the status line plus a note saying it armed nothing — see
A peer naming an issue is not assigning it below. Lines are cached for a minute under the
tracker's name, so a checkout that files into another register never reads this one's, and
a cached line naming your own session is never served to you.hooks/auto-claim.sh): claims those issues for you, on the first
write-shaped tool call after the prompt that named them, and tells you what it claimed.
Reading is not working — a question about an issue never reaches a write tool and never
claims. A Bash call counts as an edit only when the command looks like one (a redirect
into a file, sed -i, mv, git commit, …), because a session that edits through bash
would otherwise never claim; what sits inside quotes is data, so jq 'select(.n > 5)' or
grep -n '<version>' is still a read. If a live peer holds the issue it blocks that one
tool call and names them — and names anything it claimed for you in the same step. A claim
that fails blocks nothing: you are told carnet: could NOT claim …, and the hook tries again
on your next edits (three attempts within the hour). Whether you hold an issue already is the
newest claim marker's to say, never the ledger's: a claim cut off half-way — by the hook's
timeout, or a failed marker POST — is in the ledger and still not held, and the next attempt
finishes it. Subagents share the session's id, so one hook run at a time works the list; a
write made meanwhile goes through and leaves it to that run. Before claiming it asks the transcript
who wrote the prompt that named the issue: a /loop or ScheduleWakeup re-fire is text
the model wrote for itself, and a peer message or task result is text no human wrote, so a
list armed by any of those claims nothing and tells you carnet: NOT claimed — carnet#N came from a scheduled wakeup … instead. Take it deliberately if it is yours:
carnet.sh claim <n>.hooks/session-end-release.sh): releases everything this session still
holds, from its ledger under $CLAUDE_CONFIG_DIR/carnet-claims/ — each claim in the register
its ledger line names — and drops its pending list. Zero calls when nothing is held.All three are wired in .claude/settings.json; the exact entry is at the top of each hook
file, and test.sh fails when one is missing or when the PreToolUse wiring would swallow the
hook's exit code. They act on the checkout the session started in ($CLAUDE_PROJECT_DIR), not
on wherever it has cd'd since. What the PreToolUse hook tells you arrives as hook context
(additionalContext): Claude Code does not show the model a PreToolUse hook's plain output. The
auto-claim hook costs one stat when nothing is pending, which is almost always — it runs
before every edit in every session, and a list nobody consumed is removed at session end, or
by any session once it is an hour old.
What it deliberately does not do. It never claims from a prompt alone, so asking about an issue is free. It never steals. It forgets a pending list an hour old, so an issue mentioned long ago is not claimed by an unrelated edit. It never claims from a peer message, a background task result, a wakeup prompt the session scheduled for itself, or terminal output pasted into the prompt. And it never blocks twice for the same issue: a permanent block would deadlock a session over an issue that was only mentioned in passing.
A wakeup you write is not an assignment you received. When you schedule a wakeup
(/loop, ScheduleWakeup), the prompt that comes back is yours, and the hooks know it: the
prompt hook cannot tell at submit time (as of Claude Code 2.1.276 the payload carries no
source yet, and the transcript entry is written after the hook runs), so it records the
prompt id, and the claim hook reads that entry — promptSource: "system", isMeta: true,
scheduledTaskId — before claiming. Without that, a session that wrote "comment on carnet#N"
into its own wakeup would hold #N for as long as it ran, the user never having typed the
number. Do not put issue numbers into a wakeup prompt as a to-do list for yourself; and if you
are told a claim was refused because the prompt was a wakeup, that is the hook working.
Sessions message each other, and many of them are working on something else entirely — another repo, another product, a goal that has nothing to do with the register. When one of those is asked a question, the whole correct answer is to answer it. Do not claim the issue the sender mentioned, do not assign it to yourself, do not comment on it, do not start fixing it. If the message does not concern you, one line saying so is a complete reply.
That is enforced, not just asked for. A peer message arrives in the prompt hook as
<cross-session-message from="…">, and a background result as <task-notification> — both
byte-identical to something the user typed. Arming the claim list from them goes wrong in both
directions:
| what goes wrong | |
|---|---|
| false claim | a peer writes "do not put this in carnet#N", or replies "not mine", and the recipient's next edit claims #N — label, assignee and marker comment all assigned to a session that was never going to work it. |
| false block | one FYI ("I hold carnet#N, stay off these files") blocks a tool call in every session it reaches, each told "Do not do this work twice" about work it never started — some of them in another repo entirely. |
Both vectors print the status line and arm nothing: knowing who holds #N is exactly what you
need in order to answer the sender, and a peer cannot redirect your session's claim onto an
issue it happened to mention. The same goes for a peer's terminal output the user pastes: if
the prompt carries transcript glyphs (⏺ ⎿ ✻ ✢ ⏵ ❯ ───) anywhere, nothing arms. Taking work a
peer hands over is still fine — it is just explicit: carnet.sh claim <n>.
When you are the sender, say which of the three you mean, in the first line:
| Intent | Write it as |
|---|---|
| FYI, no action | FYI only — I hold carnet#N and am editing <files>. Nothing for you to do; ignore if you are in another repo. |
| A question | Question, no action on the issue: <question>. carnet#N is mine and stays mine. |
| A real handoff | Handing off carnet#N — I have released it. If you take it, claim it first. |
The first line is all the recipient's human sees as a preview, and it is what stops an unrelated session from adopting your work out of helpfulness.
Claude Code writes sessions/<pid>.json under the config dir for every running session and
removes it on exit. A claim on this host is running when that file exists with the same
session id and the pid answers kill -0; otherwise it ended and claim takes it over
with a "took over" line. A claim from another host cannot be checked, so it is refused
without --steal. Outside Claude Code (session=manual) a claim is advisory: it records the
human, and nothing auto-releases it. It is that human's alone — every shell outside Claude Code
records the same manual session, so a manual claim counts as the caller's own only when it
also names the caller's gh login.
| Tracker | registre.toml → tracker = Atmosphere/atmosphere-carnet (PRIVATE); REGISTRE_TRACKER overrides it, as it does for the limitation gates |
| Title prefix + label | the repo name from origin — [atmosphere] and atmosphere — never the checkout's basename, which in a worktree is the branch or agent name |
| Ledger | ${CLAUDE_CONFIG_DIR:-~/.claude}/carnet-claims/<session-id>.jsonl; every line names its tracker. Subagents share their session's ledger, so every change to it holds <session-id>.jsonl.lock (a directory naming its holder's pid) while it is written. The lock is broken only when that process is gone; a live holder is waited on for CARNET_LOCK_WAIT seconds (30 unless set, 5 from the hooks), and a mkdir the directory refuses fails at once — an error either way, never a hang. carnet-claims/ is kept at 0700: its cache holds private titles |
| Status cache | ${CLAUDE_CONFIG_DIR:-~/.claude}/carnet-claims/cache/<tracker>/<n>, one minute |
| Tests | .agents/skills/carnet/test.sh — stub gh, every refusal path fires; CI runs it from .github/workflows/carnet.yml |
.registre/limitation-gates.sh, run
at pre-push and by .github/workflows/limitation-register.yml) ban deferral prose unless
the line carries a LIMITATION(registre#n) marker naming the limited item and pointing at
an issue in this tracker. File that issue with create --label limitation first — it prints
the marker line to fill in — then write the marker..agents/skills/bilan/) reads this skill's ledger: a claim still held, or an issue
filed this session and still open (unless it is a registered limitation), caps the session's
completion score at 6.© Atmosphere, 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
SKILL.md and 5 other files in .agents/skills/carnet of Atmosphere/atmosphere.
Open the folder on GitHubat commit 13671cf
Carnet 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 |
|---|---|---|---|---|---|---|
| Carnet this skillAtmosphere/atmosphere | 3.8k | — | ~4k | Automated safety check: Pass | Apache-2.0 | |
| Configuring Horizoncoollabsio/coolify | 63k | 4 repos | ~898 | Automated safety check: Pass | MIT | |
| Nestjs Best Practicesrolling-scopes/rsschool-app | 10k | 6 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Sub2API AdminWei-Shaw/sub2api | 43k | 1 repos | ~717 | Automated safety check: Pass | LGPL-3.0 | |
| Firecrawl Build Onboardingfirecrawl/firecrawl | 189k | 1 repos | ~1.4k | Automated safety check: Notes | ISC | |
| Fortify Developmentcoollabsio/coolify | 63k | 4 repos | ~1.9k | Automated safety check: Pass | MIT |
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
rolling-scopes/rsschool-app
NestJS best practices and architecture patterns for building production-ready applications.
Wei-Shaw/sub2api
Manages a Sub2API deployment from the command line: accounts, redeem and invitation codes, groups, proxies, imports, exports and raw admin API calls.
firecrawl/firecrawl
Gets Firecrawl working in a project: signs you in through the browser, saves FIRECRAWL_API_KEY to .env and picks the first SDK or REST path.
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
NangoHQ/nango
A skill your agent uses when creating new agent skills or improving existing ones - ensures skills are discoverable, scannable, and effective through proper structure, discovery optimization, and…
Atmosphere/atmosphere
Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.
Atmosphere/atmosphere
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.
Atmosphere/atmosphere
Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more.
Atmosphere/atmosphere
Run the pre-release end-to-end sweep of every user-facing surface — the 33 samples under samples/ (booted from their packaged artifacts and driven in a real browser via chrome-devtools MCP), the…
Atmosphere/atmosphere
Write well-formatted notes to the atmosphere-vault Obsidian knowledge base.
Atmosphere/atmosphere
A skill your agent uses when setting up the shared atmosphere-vault Obsidian vault on a new machine or for a new team member.
Categories
Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new…. Carnet is an agent skill from Atmosphere/atmosphere. Work the private register (Atmosphere/atmosphere-carnet) from a session — claim an issue before touching it so peers see who holds it and which session, release or close it when done, file new issues in the one canonical shape.
Carnet fits situations like: registreN issue is mentioned; stop work that an issue tracks; you are about to run gh issue against the tracker.
Run `npx skills add Atmosphere/atmosphere --skill carnet -a claude-code`. Or copy the skill folder (.agents/skills/carnet in Atmosphere/atmosphere) into .claude/skills/carnet in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Atmosphere/atmosphere --skill carnet -a codex`. Or copy the skill folder (.agents/skills/carnet in Atmosphere/atmosphere) into .agents/skills/carnet 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 Atmosphere/atmosphere --skill carnet -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/carnet, .gemini/skills/carnet, .github/skills/carnet and .opencode/skills/carnet in your project.
Going by SKILL.md and its folder, Carnet needs a shell for the scripts in its folder and the command-line tools its instructions call (gh, git and jq). Our summary lists: A Bash shell.
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. 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. Review the folder before installing.
Carnet 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.
About 4k 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.
Skills that share tags, products or a category with Carnet: Configuring Horizon (coollabsio/coolify, 63k stars), Nestjs Best Practices (rolling-scopes/rsschool-app, 10k stars), Sub2API Admin (Wei-Shaw/sub2api, 43k stars) and Firecrawl Build Onboarding (firecrawl/firecrawl, 189k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Atmosphere (a GitHub organization) maintains it in Atmosphere/atmosphere, which has 3,819 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 6, 2026.
Source: Atmosphere/atmosphere on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.