Amethyst is an Android client for Nostr, a social network protocol that lets people control their own social activity and connections. People use it to read and publish Nostr content, follow accounts, and exchange encrypted direct messages from Android and other supported platforms. The catalogue add-ons support workflows for developing or operating the client.
Borrowing it
Nothing to install: this file belongs to vitorpamplona/amethyst. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/vitorpamplona/amethyst/main/.claude/skills/amy-expert/SKILL.mdgit clone --depth 1 https://github.com/vitorpamplona/amethystWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/vitorpamplona/amethyst/amy-expert)<a href="https://agentmods.dev/skills/vitorpamplona/amethyst/amy-expert"><img src="https://agentmods.dev/badge/skills/vitorpamplona/amethyst/amy-expert/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/vitorpamplona/amethyst/amy-expert"><img src="https://agentmods.dev/badge/skills/vitorpamplona/amethyst/amy-expert.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 2 findings, up to high
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- high Privilege Escalation · line 175 Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.Fix: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths.
- medium Rogue Agent · line 94 Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.Fix: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent.
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.01543 |
| Opus 5.5 | $0.00000 | $0.00617 |
| Sonnet 5.5 | $0.00000 | $0.00309 |
| Haiku 4.5 | $0.00000 | $0.00154 |
Grade A, and why
amy-expert scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 25d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 80 lines — stays where its author put it; the contents beside it link to each section on GitHub.
amy CLI
cli/ is a non-interactive JVM client over quartz + commons. Its --json output and exit
codes are a public API that the interop harnesses depend on. The long-form contract is
cli/DEVELOPMENT.md ("Public contract", "How to add a command", "Output-shape conventions",
"Testing", "Full on-disk layout"); this skill is the short version plus the traps.
Rules
- Thin assembly layer. No protocol, filter assembly, state machines or encryption in
cli/. Protocol goes toquartz/; business logic tocommons/, extracted fromamethyst/first in its own commit if needed (references/extraction-recipe.md). Acommands/*.ktfile over ~200 lines is a smell.climay depend on:geode(foramy serve), never on:commonsUI,:amethystor:desktopApp. - Output goes through
Output(cli/src/main/kotlin/…/cli/Output.kt).Output.emit(mapOf(...)): the map is the--jsonshape (one line, one object, stable snake_case keys); the default text render comes from the same map and has no contract.return Output.error("code", "detail"): the return value is the exit code (bad_args2,timeout124, anything else 1). Errors go to stderr (error: code: detail, or a JSON object under--json).- Exit codes
0ok,1runtime,2bad args,124await timeout.runCliinMain.ktalso maps a thrownIllegalArgumentExceptionto 2 andAwaitTimeoutto 124. - Never
printlnresults;System.err.printlnis for progress logs only. - Adding a
--jsonkey is safe. Renaming or removing one is breaking: say so in the commit, and updatecli/README.mdand the fixtures undercli/tests/. - Publishes:
RawEventSupport.publishGuard(ack, id)then+ RawEventSupport.ackFields(ack)(published_to+rejected_by: [{relay, reason}]). Don't hand-roll the projection. - Reuse an error code from the canonical list in
cli/DEVELOPMENT.mdbefore minting one.
- Non-interactive. Everything is a flag; a network wait is an explicit
awaitverb with--timeout. The only TTY fallback isPassphraseProvider(after--passphrase-fileand$AMY_PASSPHRASE); don't add more. ~/.amy/is the whole state, reloaded on every run; no in-process caches across runs.~/.amy/shared/events-store/(one event store for all accounts),~/.amy/<account>/(identity.json,state.json,aliases.json,marmot/),~/.amy/current(written byamy use NAME). Account selection is the global--account NAME;--namestays free for subcommands. New persisted state goes throughConfig.kt/stores/FileStores.kt/ a named helper likeAliases.kt.$HOME, notuser.home.DataDir.DEFAULT_ROOT(Config.kt) reads$HOME; JDK 21'suser.homecomes fromgetpwuidand ignores it, which would break harness isolation (HOME=$(mktemp -d) amy --account alice init). JVM tests use theamy.homesystem property seam instead.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 25d ago Changed · -198 lines · -217 tokens per session 15ed426ea003
- 1mo ago Changed · +19 lines 24f8d6eb28ed
- 2mo ago First seen · 259 lines · 217 tokens per session scan A 3cb364436e40
amy-expert is a skill published in the GitHub repository vitorpamplona/amethyst (1,620 stars, last pushed yesterday), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,543 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
amy-expert compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| amy-expertvitorpamplona/amethyst | Skill | 1.6k | yesterday | MIT | A | 0 | Claude Code |
| compose-animationschrisbanes/skills | Skill | 1.1k | yesterday | Apache-2.0 | A | 64 | Claude Code |
| compose-focus-navigationchrisbanes/skills | Skill | 1.1k | yesterday | Apache-2.0 | A | 41 | Claude Code |
| kotlin-androidericrisco/rsc-harness | Skill | 503 | 2d ago | MIT | A | 78 | Claude Code, Codex |
| compose-multiplatformericrisco/rsc-harness | Skill | 503 | 2d ago | MIT | A | 80 | Claude Code, Codex |
| release-kotlin-librarychrisbanes/skills | Skill | 1.1k | yesterday | Apache-2.0 | A | 46 | Claude Code |
| using-chrisbanes-skillschrisbanes/skills | Skill | 1.1k | yesterday | Apache-2.0 | A | 38 | Claude Code |