From social-archiver
Use when an agent needs to archive social or web content into Obsidian, post vault notes to the Social Archiver timeline, create or edit Social Archiver vault Markdown directly, generate or inspect AI comments on archived posts, inspect Social Archiver jobs, import Instagram Saved exports, sync Social Archiver data, manage tags on Social Archiver notes, or operate the Obsidian Social Archiver plugin through Obsidian CLI. Triggers on phrases like "archive this link", "save to obsidian", "post to timeline", "add an AI comment", "comment on this archive", "edit social archive markdown", "check archive job", "import instagram saved", "social archiver".
How this skill is triggered — by the user, by Claude, or both
Slash command
/social-archiver:obsidian-social-archiver-cliThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill teaches agents how to drive the Social Archiver Obsidian plugin through the Obsidian CLI, and how to make safe direct Markdown edits in a vault when the task is file-local. CLI commands are namespaced under `social-archiver` and return JSON when `format=json` is passed.
This skill teaches agents how to drive the Social Archiver Obsidian plugin through the Obsidian CLI, and how to make safe direct Markdown edits in a vault when the task is file-local. CLI commands are namespaced under social-archiver and return JSON when format=json is passed.
See references/commands.md for the full command catalog, references/output-schema.md for the response envelope, error codes, and redaction rules, and references/vault-markdown.md for the direct vault Markdown contract.
obsidian binary is on PATH. Verify with obsidian help.If any prerequisite is not met, surface the issue to the user and stop. Do not attempt to log in or alter settings from CLI.
obsidian help lists every CLI command registered by Obsidian and its plugins.obsidian help social-archiver and obsidian help social-archiver:<action> show flag descriptions for a specific command.If the social-archiver commands do not appear in obsidian help, either the plugin is not loaded, the Obsidian version is too old, or the user must restart Obsidian.
Run every command with vault=<vault> first and format=json last (or anywhere — but always include it).
Probe readiness:
obsidian vault=<vault> social-archiver format=json
Confirm ok: true, data.authenticated === true, and the feature flags you need are true.
Always pass format=json. Never parse free-form text output.
For long-running work (archive, profile crawl, import), use the default mode=queue (or equivalent). The command returns a jobId quickly.
Poll to terminal status (token-efficient pattern):
jobs:check every iteration. The plugin's PendingJobOrchestrator already processes queued jobs automatically in the background. jobs:check only triggers a one-shot drive — useful at the very start of a session or if the orchestrator appears stuck.obsidian vault=<vault> social-archiver:job id=<jobId> format=json (defaults to source=local).data.status is completed, failed, or cancelled → stop.Why fire-and-forget on writes? Obsidian 1.12.7 CLI loses handler output when the handler awaits real I/O. Commands that touch the network (jobs:check, sync, profile-crawl, subscribe, import-*, share, post, media) schedule the work and return immediately. Observe outcomes by polling local state with read-only commands (job source=local, jobs, tags, etc.).
Never print, log, or echo authToken, cookie, naverCookie, Authorization headers, BrightData/Perplexity/Gumroad API keys, or share passwords. Strip them from any object you display to the user.
On INSUFFICIENT_CREDITS or PAYWALL_REQUIRED errors, surface the billing fallback message verbatim — it instructs the user to upgrade or restore on the mobile app, or to apply a license key in plugin settings. Do not attempt to purchase anything from CLI. The plugin cannot accept direct payment under store policy.
Use social-archiver:post when the user wants an existing vault note to appear in the local Social Archiver timeline. Pass either path=<vault-path> or active; if the user wants a public share link, use social-archiver:share instead because it posts the note and creates the share URL.
Use social-archiver:ai-comment when the user asks to add analysis, summary, critique, fact-check, translation, reformatting, or a custom AI response as a comment on a specific archived note. Check available desktop AI providers first with social-archiver:ai-providers, then schedule the comment and observe completion with social-archiver:ai-comments path=<vault-path>. AI comments are desktop-only and require at least one authenticated local CLI (claude, gemini, or codex).
For a personal note while archiving a new URL, use social-archiver:archive ... comment=<text>. For adding or editing a non-AI personal note on an existing archive, the current CLI has no dedicated command; do not pretend ai-comment is a manual note editor.
If the user asks for a timeline post or a comment and the operation can be represented as Markdown/frontmatter, the Obsidian CLI is optional. Prefer direct vault edits when the target note is already known, when the user gives a vault path, or when Obsidian CLI is unavailable but filesystem access is available.
Read references/vault-markdown.md before creating or editing files directly. It covers how to resolve archivePath, find notes by vault path, sourceArchiveId, or originalUrl, create platform: post timeline documents, set personal-note comment frontmatter, append parseable ## AI Comments, and preserve platform comments under ## 💬 Comments.
Use the CLI instead of direct Markdown for work that requires network fetches, media download, server sync, share URL creation, billing/auth state, queued jobs, imports, or plugin settings changes.
# Submit (returns jobId immediately)
obsidian vault="Research" social-archiver:archive \
url="https://www.instagram.com/p/example/" \
mode=queue format=json
# read data.jobId from the response, e.g. job-1778840000000
# Poll with exponential backoff (3s, 6s, 12s, 24s, ...). Stop on terminal status.
# The background orchestrator processes the queue automatically — you do NOT
# need to call jobs:check each iteration.
obsidian vault="Research" social-archiver:job \
id="job-1778840000000" format=json
(Only call social-archiver:jobs:check once at session start, or if the orchestrator appears stuck — e.g. a job sits at pending with retryCount=0 for >30s.)
obsidian vault="Research" social-archiver:profile-crawl \
url="https://www.threads.net/@example" \
count=20 range=30d subscribe hour=9 format=json
# Preflight (does not start a job)
obsidian vault="Research" social-archiver:import-instagram \
files="/Users/me/Downloads/instagram_saved.zip" \
preflight format=json
# Start the import
obsidian vault="Research" social-archiver:import-instagram \
files="/Users/me/Downloads/instagram_saved.zip" \
destination=inbox tags="instagram,saved" format=json
# Poll job status
obsidian vault="Research" social-archiver:import-job \
id="<importJobId>" items format=json
obsidian vault="Research" social-archiver:tag-apply \
path="Social Archives/Instagram/2026/05/example.md" \
tag="favorites" action=add format=json
obsidian vault="Research" social-archiver:sync \
target=all syncServer=true format=json
The response lists which sub-targets ran versus were skipped (server pending-job catch-up runs only if the user setting enableServerPendingJobs is enabled).
obsidian vault="Research" social-archiver:post \
path="Notes/My Thoughts.md" format=json
# Or use the active note in the running Obsidian window.
obsidian vault="Research" social-archiver:post active format=json
Use social-archiver:share path="Notes/My Thoughts.md" format=json if the user wants a web share URL in addition to the local timeline post.
# Optional readiness check for local AI CLIs.
obsidian vault="Research" social-archiver:ai-providers format=json
# Schedule comment generation. type=custom requires prompt=<text>.
obsidian vault="Research" social-archiver:ai-comment \
path="Social Archives/X/2026/05/post.md" \
type=summary provider=claude outputLanguage=ko format=json
# Poll lightly until the new comment appears; typical completion is 15-60s.
obsidian vault="Research" social-archiver:ai-comments \
path="Social Archives/X/2026/05/post.md" format=json
For custom comments, pass type=custom prompt="<specific request>". For translation use type=translation language=<target-language>.
The response envelope is { ok: true, ... } or { ok: false, error: { code, message, retryable, details? } }. Retryable codes are safe to retry with backoff. Non-retryable codes mean the agent should stop and report to the user.
Reserved error codes and whether they are retryable (full table in references/output-schema.md):
| Code | Retryable |
|---|---|
CLI_UNAVAILABLE | no |
AUTH_REQUIRED | no |
INVALID_ARGUMENT | no |
UNSUPPORTED_PLATFORM | no |
SERVICE_NOT_READY | yes |
PAYWALL_REQUIRED | no |
INSUFFICIENT_CREDITS | no |
RATE_LIMITED | yes |
JOB_NOT_FOUND | no |
NETWORK_ERROR | yes |
TIMEOUT_ERROR | yes |
CIRCUIT_OPEN | yes |
DOC_ID_STALE | yes |
OPERATION_FAILED | varies (read retryable) |
Always trust the retryable field in the response over the table; the server may override based on context.
references/commands.mdreferences/output-schema.mdreferences/vault-markdown.mdformat=json and implements bounded polling: scripts/social-archiver-cli.mjsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub hyungyunlim/obsidian-social-archiver-skills --plugin social-archiver