Iphone Use
leeguooooo/iphone-use
A skill your agent uses when a task needs a real iPhone — operating iOS apps that have no API (Apple Health, banking, IM apps), exporting on-phone data, tapping/typing/scrolling on the phone, or…
Work the private register (mirroir-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…
$ npx skills add jfarcand/mirroir-mcp --skill carnet -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jfarcand/mirroir-mcp 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/jfarcand/mirroir-mcp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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 jfarcand/mirroir-mcp --skill carnet -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jfarcand/mirroir-mcp carnet --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jfarcand/mirroir-mcp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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 jfarcand/mirroir-mcp --skill carnet -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jfarcand/mirroir-mcp carnet --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jfarcand/mirroir-mcp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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/jfarcand/mirroir-mcp.git --path .claude/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 jfarcand/mirroir-mcp --skill carnet -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jfarcand/mirroir-mcp carnet --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jfarcand/mirroir-mcp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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 jfarcand/mirroir-mcp 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 jfarcand/mirroir-mcp --skill carnet -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jfarcand/mirroir-mcp.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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 jfarcand/mirroir-mcp --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 jfarcand/mirroir-mcp carnet --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jfarcand/mirroir-mcp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/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/jfarcand/mirroir-mcp/tree/main/.claude/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 (mirroir-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…
Carnet is an agent skill from jfarcand/mirroir-mcp. Work the private register (mirroir-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 an issue number 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 2.8k 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 Agent Workflows, covering MCP servers and Mobile testing and debugging. It works with Model Context Protocol and macOS. The repository describes itself as: MCP server for controlling a real iPhone via macOS iPhone Mirroring...and any MacOs app. Screenshot, tap, swipe, type — from any MCP client. The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit c652b78. 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:
ghgitFrom 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 2.8k tokens when it runs. Until then it costs about 93 tokens; SKILL.md has 1,598 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 jfarcand/mirroir-mcp at commit c652b78, republished under its Apache-2.0 licence (© jfarcand). 1,598 words, ~2,814 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 shared by every repo of the product (registre.toml names it) and by many Claude Code sessions at once. Nothing on an issue says a session is on it, so peers collide: the same design was built twice ~35 minutes apart on 2026-08-31, and carnet#197 was found and written up independently by two sessions. 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: .claude/skills/carnet/carnet.sh.
The incident history quoted in this skill (carnet#197, carnet#279, carnet#436, …) happened in
the dravr-* family, where it was built; those numbers are in dravr-ai/dravr-carnet.
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). 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.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. 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.--why is mandatory and is what the next reader sees first.
Add --commit <sha> whenever a commit resolved it: carnet#N in a commit message is
plain text to GitHub and never closes anything cross-repo.create. It reads the tracker from registre.toml, refuses a public
tracker, prefixes the title [<project>] , and always adds the project label. Titles are
[<project>] <Thing> — one shape, no variants, capitalised first word unless it is an
identifier. 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=.claude/skills/carnet/carnet.sh
$C claim 197 # hold it: assign me, label, marker comment, local ledger
$C claim 197 --steal # take it from a live or remote session — user's decision only
$C release 197 --reason "handed to i18Guards"
$C status 197 # 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); --verify to check the tracker
$C create --title "Tier 1e is blind to a symbol move" --label bug --body-file /tmp/body.md --claim
$C close 197 --why "Tier 1e-move greps the old path" --commit 8720f8343
$C label 197 +critical -bugAdd --dry-run to any of them to see the gh calls without making them.
hooks/prompt-status.sh): when a prompt names carnet#N,
registre#N, or a carnet issue URL, one status line per issue lands in your context
before you answer — carnet#197 · held by @jfarcand · session i18Guards (a3f9c2d1) on 1Q84 [running] · feature/i18n-guards · since …. Read it. If it says unclaimed, claim before
editing. If it says [session ended — stale], a plain claim takes it over. 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.hooks/auto-claim.sh): claims those issues for you, on the first
write-shaped tool call after the prompt that named them. 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.
If a live peer holds the issue it blocks that one tool call and names them. 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
prints 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/. Zero calls when nothing
is held.All three are wired in the consumer repo's .claude/settings.json; the snippet is at the top
of each hook file. The auto-claim hook costs one stat when nothing is pending, which is
almost always — it runs before every edit in every session.
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, or a wakeup prompt the session scheduled for itself. 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 now know it:
the prompt hook cannot tell at submit time (Claude Code 2.1.276 sends 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. dravr-platform-7f (2026-09-18) wrote "comment the eight coach_id strings on
carnet#436" into its own wakeup and held #436 for 67 minutes, ChefFamille 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 now 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. They used to arm the claim list, and it went wrong
in both directions:
| what happened | |
|---|---|
| false claim | carnet#279 was claimed 31s after a peer wrote "do not put my point 1 in carnet#325"; #321 two minutes after a peer replied "Not mine."; #261 25s after a peer retracted a diagnosis. Three issues assigned — label, assignee and marker comment — to sessions that were never going to work them. |
| false block | one FYI ("I hold carnet#323, stay off these files") blocked a tool call in six separate sessions, each told "Do not do this work twice" about work it had never started. Two were obstaque sessions — a different product. |
Both vectors now print the status line and arm nothing: knowing who holds #323 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. Taking work a peer hands over is still fine — it is just
explicit now: 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.
| Tracker | registre.toml → tracker (mirroir: jfarcand/mirroir-carnet, PRIVATE) |
| Title prefix | [<project>] — registre.toml → project (mirroir-mcp), else the repo name from origin — never the checkout's basename, which in a worktree is the branch |
| Ledger | ${CLAUDE_CONFIG_DIR:-~/.claude}/carnet-claims/<session-id>.jsonl |
| Tests | .claude/skills/carnet/test.sh — stub gh, every refusal path fires |
register-limitation files its issue through create --label limitation, then writes the
LIMITATION(registre#n): marker.© jfarcand, 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 .claude/skills/carnet of jfarcand/mirroir-mcp.
Open the folder on GitHubat commit c652b78
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 skilljfarcand/mirroir-mcp | 245 | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Iphone Useleeguooooo/iphone-use | 104 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Healthmd CLI DevelopmentCodyBontecou/health-md | 230 | — | ~4.3k | Automated safety check: Pass | AGPL-3.0 | |
| Binggo MCPluovicter-collab/bilibinggo | 495 | — | ~1.2k | Automated safety check: Pass | Proprietary | |
| Cortex Mem MCPsopaco/cortex-mem | 312 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Mps Project ManagementJetBrains/MPS | 1.7k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 |
leeguooooo/iphone-use
A skill your agent uses when a task needs a real iPhone — operating iOS apps that have no API (Apple Health, banking, IM apps), exporting on-phone data, tapping/typing/scrolling on the phone, or…
CodyBontecou/health-md
Develop or debug the standalone Rust Health.md CLI, portable healthmd-mcp server, and iPhone direct service.
luovicter-collab/bilibinggo
Operates the local Binggo (bilibinggo) Bilibili lottery helper console strictly through binggo MCP tools.
sopaco/cortex-mem
Persistent memory enhancement for AI agents. An agent skill from sopaco/cortex-mem.
JetBrains/MPS
Open an MPS project in a running or freshly started MPS instance when MCP tools fail because no project is open (welcome screen), close an open project with mpsmcpcloseproject, or create a new empty…
hetpatel-11/Adobe_Premiere_Pro_MCP
Install, verify, troubleshoot, and operate the Adobe Premiere Pro MCP server.
jfarcand/mirroir-mcp
Register a known gap in the limitation register — file the issue in the private tracker, write the LIMITATION(registren) marker, or ledger a dark-launched feature.
jfarcand/mirroir-mcp
Onboard a consumer web app to mirroir's .mirroir/ dotfile by EXPLORING the running app (chrome-devtools-mcp) — derive real selectors from the accessibility tree, exercise each surface's primary…
Works with
Categories
Work the private register (mirroir-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…. Carnet is an agent skill from jfarcand/mirroir-mcp. Work the private register (mirroir-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: an issue number is mentioned; stop work that an issue tracks; you are about to run gh issue against the tracker.
Run `npx skills add jfarcand/mirroir-mcp --skill carnet -a claude-code`. Or copy the skill folder (.claude/skills/carnet in jfarcand/mirroir-mcp) into .claude/skills/carnet in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jfarcand/mirroir-mcp --skill carnet -a codex`. Or copy the skill folder (.claude/skills/carnet in jfarcand/mirroir-mcp) 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 jfarcand/mirroir-mcp --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 and git). 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 2.8k tokens (SKILL.md is roughly 11k 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: Iphone Use (leeguooooo/iphone-use, 104 stars), Healthmd CLI Development (CodyBontecou/health-md, 230 stars), Binggo MCP (luovicter-collab/bilibinggo, 495 stars) and Cortex Mem MCP (sopaco/cortex-mem, 312 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jfarcand (a GitHub user) maintains it in jfarcand/mirroir-mcp, which has 245 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 5, 2026.
Source: jfarcand/mirroir-mcp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.