Skip to content

Commands

Stable

Generated from capsule-cli/cli-surface.json, the committed command tree capsule-cli emits and mise run cli-surface-check keeps current. To change a description on this page, change the clap annotation it comes from and regenerate — this file is build output.

capsule <COMMAND>

Capsule CLI provides tools for managing your photos and albums:

  • Authentication management
  • Sync local and remote data
  • Check status and list files
  • Manage albums and collections
CommandDescription
capsule authAuthentication commands
capsule cacheKeep a library’s cache within the budget the current connection class allows
capsule cameraFind cameras on the network, import straight from one over PTP/IP, and manage the identity cameras pair with
capsule cullReview a local library: flag assets, filter by flag, sweep rejects to trash
capsule demoRun the offline end-to-end data-plane showcase (real cryptography, no network)
capsule editCorrect an asset’s capture time or location; the original’s value is always kept
capsule federationFollow albums whose home is another server: subscribe with the capability a share invite carried, list what this account follows, and unsubscribe
capsule importImport files into a local Capsule library
capsule labelAdd or remove a label on an asset, a region of one, a stack or an album
capsule libraryManage the local library
capsule listList the assets the sync feed has delivered
capsule matchMatch metadata for current file
capsule peerHand uploads to another device of this account, or upload ones handed to this device
capsule pushUpload a local Capsule library to the server. An asset handed to another device with capsule peer delegate is left to that device while its hand-off is open
capsule regionMark or delete a circle or rectangle region on an asset
capsule repairRepair a local library in place, one signed correction per affected asset
capsule resetReset all local CLI data
capsule restoreDownload originals from the server and verify them byte for byte
capsule server-infoShow how the server signs people in: its identity provider, and whether it accepts passwords, from its public server-info record
capsule shareIssue and revoke view-only share links on the server
capsule showShow what an imported asset’s signed sidecar records: caption, rating, tags, GPS, timestamps
capsule statusShow current status
capsule syncSync local and remote data
capsule trashMove assets to the trash or restore them from it, in the library and on the server
capsule verifyAsk the server whether it durably holds this library’s originals, and keep its signed answer as evidence
capsule auth <COMMAND>

Authentication commands

CommandDescription
capsule auth activityShow the signed-in account’s recent security activity, newest first: sign-ins, sign-outs, revoked sessions, credential changes, enrolled devices and links
capsule auth escrowSet up recovery for a library: bind it to the signed-in account and store its recovery backup under a new recovery secret
capsule auth loginLogin to Capsule
capsule auth logoutLogout from Capsule
capsule auth recoverRecover the signed-in account onto this machine from its recovery backup
capsule auth registerCreate a Capsule account and sign in
capsule auth statusShow authentication status
capsule auth activity [OPTIONS]

Show the signed-in account’s recent security activity, newest first: sign-ins, sign-outs, revoked sessions, credential changes, enrolled devices and links

OptionDescription
--limit <N>The most events to show; the server keeps 90 days and at most 1000.
--jsonPrint the events as one JSON document on stdout.
capsule auth escrow --library <PATH> [OPTIONS]

Set up recovery for a library: bind it to the signed-in account and store its recovery backup under a new recovery secret

OptionDescription
--library <PATH>Required. Path to the Capsule library; it must not hold any assets yet.
--passphrase-stdinRead the library passphrase from stdin instead of prompting.
--replaceReplace the account’s existing recovery backup; the previous recovery secret stops working.
capsule auth login [OPTIONS]

Login to Capsule

OptionDescription
--email <EMAIL>Account email (prompted when omitted).
--password-stdinRead the password from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--oidcSign in through the server’s identity provider in a browser instead of with a password. The server must allow loopback redirects (OIDC_ALLOW_LOOPBACK_REDIRECT=true).
--no-browserWith —oidc, print the sign-in address without opening a browser.
--deviceWith —oidc, sign in from another device: print an address and a code instead of using a browser here.
--jsonPrint the outcome as one JSON document on stdout; prompts, progress and, with —oidc, the sign-in address and code go to stderr.
capsule auth logout [OPTIONS]

Logout from Capsule

OptionDescription
--jsonPrint the outcome as one JSON document on stdout: whether a session was signed out.
capsule auth recover --library <PATH> [OPTIONS]

Recover the signed-in account onto this machine from its recovery backup

OptionDescription
--library <PATH>Required. Directory for the recovered library; it must not hold a library yet.
--recovery-secret-stdinRead the recovery secret from the first line of stdin instead of prompting.
--passphrase-stdinRead the new library passphrase from the next line of stdin instead of prompting.
capsule auth register [OPTIONS]

Create a Capsule account and sign in

OptionDescription
--email <EMAIL>Account email (prompted when omitted).
--password-stdinRead the password from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
capsule auth status [OPTIONS]

Show authentication status

OptionDescription
--jsonPrint the status as one JSON document on stdout: whether a session is stored, whether its access token is still fresh, and when that token expires.
capsule cache <COMMAND>

Keep a library’s cache within the budget the current connection class allows

CommandDescription
capsule cache budgetShow the cache budget for the current connection class, or change the base budget every class scales from (2 GiB unless set)
capsule cache sweepEvict cached thumbnails, previews and fetched originals, least recently viewed first, until the cache fits the budget the current connection class allows. Pinned representations, device-owned originals and the library’s own media are never evicted
capsule cache budget [OPTIONS]

Show the cache budget for the current connection class, or change the base budget every class scales from (2 GiB unless set)

OptionDescription
--set <BYTES>Store this many bytes as the base budget.
--resetClear the stored base budget, returning to the 2 GiB default.
--jsonPrint the plan as one JSON document on stdout.
capsule cache sweep --library <PATH> [OPTIONS]

Evict cached thumbnails, previews and fetched originals, least recently viewed first, until the cache fits the budget the current connection class allows. Pinned representations, device-owned originals and the library’s own media are never evicted

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--jsonPrint the run as one JSON document on stdout: the plan it ran under and each evicted representation.
capsule camera <COMMAND>

Find cameras on the network, import straight from one over PTP/IP, and manage the identity cameras pair with

CommandDescription
capsule camera discoverList the cameras on the local network that offer PTP/IP, by browsing DNS-SD _ptp._tcp for a bounded window
capsule camera identityShow the identity this client presents to cameras, creating it on first use. A camera that pairs remembers it, so it stays the same across runs
capsule camera importCopy every object off a camera into the library: each is received and hash-checked into a staging area under the library, then imported like a card reader’s files. Nothing on the camera is changed, and an interrupted run resumes where it stopped
capsule camera discover [OPTIONS]

List the cameras on the local network that offer PTP/IP, by browsing DNS-SD _ptp._tcp for a bounded window

OptionDescription
--timeout <SECONDS>How long to listen for cameras, in seconds. Default: 3.
--jsonPrint what answered as one JSON document on stdout: the service type browsed, the window, and each camera’s name, host, address and port.
capsule camera identity [OPTIONS]

Show the identity this client presents to cameras, creating it on first use. A camera that pairs remembers it, so it stays the same across runs

OptionDescription
--name <NAME>Rename the identity; the camera-facing GUID is kept, so paired cameras still recognise this client.
--jsonPrint the identity as one JSON document on stdout: its GUID and name, and whether this run created it.
capsule camera import --library <PATH> [OPTIONS]

Copy every object off a camera into the library: each is received and hash-checked into a staging area under the library, then imported like a card reader’s files. Nothing on the camera is changed, and an interrupted run resumes where it stopped

OptionDescription
--address <HOST[:PORT]>The camera’s address on the network, as HOST or HOST:PORT (port 15740 when omitted); the camera shows it on its Wi-Fi or “Remote/PC connection” screen. Without it, the one camera capsule camera discover finds is used, and none or several refuse the run.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so imports work in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the camera, the identity presented to it, every object received or left on the camera and why, and the import’s report.
capsule cull --library <PATH> [OPTIONS]

Review a local library: flag assets, filter by flag, sweep rejects to trash

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so culling works in scripts and CI where there is no terminal.
--pick <ASSET_ID>Flag an asset as a keeper (repeatable).
--neutral <ASSET_ID>Clear an asset’s flag back to the never-flagged default (repeatable).
--reject <ASSET_ID>Flag an asset for rejection (repeatable).
--filter <FLAG>List the assets carrying one flag instead of only counting them. Values: pick, neutral, reject.
--sweepMove every rejected asset to trash. The only destructive step, and soft per retention — swept assets stay restorable until the window elapses.
--retain-days <DAYS>Retention window, in days, the sweep’s soft delete stamps. Default: 30.
capsule demo [OPTIONS]

Run the offline end-to-end data-plane showcase (real cryptography, no network)

OptionDescription
--workdir <PATH>Working directory for the demo libraries (a temp dir is used if omitted).
--image <PATH>A real image/file to import (a small synthetic file is used if omitted).
capsule edit <COMMAND>

Correct an asset’s capture time or location; the original’s value is always kept

CommandDescription
capsule edit capture-timeCorrect an asset’s capture time; the original’s capture time is kept beside it
capsule edit locationCorrect an asset’s location, or record that it has none; the original’s location is kept beside it
capsule edit capture-time <TIME> --asset <ASSET> --library <PATH> [OPTIONS]

Correct an asset’s capture time; the original’s capture time is kept beside it

ArgumentDescription
<TIME>Required. The corrected instant, RFC 3339 with an offset (2021-07-04T18:30:00Z).
OptionDescription
--asset <ASSET>Required. The asset: its id, or a prefix of at least 8 hex characters of its content hash.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule edit location --asset <ASSET> --library <PATH> [OPTIONS]

Correct an asset’s location, or record that it has none; the original’s location is kept beside it

OptionDescription
--asset <ASSET>Required. The asset: its id, or a prefix of at least 8 hex characters of its content hash.
--lat <DEGREES>Latitude, in degrees.
--lon <DEGREES>Longitude, in degrees.
--datum <DATUM>The datum the coordinates are in (stored verbatim, never converted): WGS-84 or GCJ-02. Default: WGS-84.
--clearRecord that the asset has no location.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule federation <COMMAND>

Follow albums whose home is another server: subscribe with the capability a share invite carried, list what this account follows, and unsubscribe

CommandDescription
capsule federation assetsList every asset this account’s server pulled for one subscription: each live asset’s id, chain head, timestamp, author and size
capsule federation listList this account’s subscriptions to albums on other servers, live or lapsed
capsule federation metadataFetch one pulled asset’s encrypted metadata blob, byte for byte as this account’s server pulled it, into a file
capsule federation subscribeSubscribe to an album on another server, so this account’s server pulls it. The capability token from the share invite is read from stdin as one line, never from the command line. Posting one for an album already subscribed renews it
capsule federation unsubscribeStop pulling one album from another server for this account. Succeeds whether or not the album was subscribed
capsule federation assets <PEER> <ALBUM_ID> [OPTIONS]

List every asset this account’s server pulled for one subscription: each live asset’s id, chain head, timestamp, author and size

ArgumentDescription
<PEER>Required. The album’s home server.
<ALBUM_ID>Required. The album, as its home server names it.
OptionDescription
--jsonPrint the album as one JSON document on stdout: its peer, album id and assets.
capsule federation list [OPTIONS]

List this account’s subscriptions to albums on other servers, live or lapsed

OptionDescription
--jsonPrint the subscriptions as one JSON document on stdout.
capsule federation metadata <PEER> <ALBUM_ID> <ASSET_ID> --out <PATH> [OPTIONS]

Fetch one pulled asset’s encrypted metadata blob, byte for byte as this account’s server pulled it, into a file

ArgumentDescription
<PEER>Required. The album’s home server.
<ALBUM_ID>Required. The album, as its home server names it.
<ASSET_ID>Required. The asset, as its home server names it.
OptionDescription
--out <PATH>Required. File the blob is written to, replacing any file already there.
--jsonPrint the outcome as one JSON document on stdout: the peer, album and asset, the blob’s size and content hash, and the file it was written to.
capsule federation subscribe --issuer <HOST> [OPTIONS]

Subscribe to an album on another server, so this account’s server pulls it. The capability token from the share invite is read from stdin as one line, never from the command line. Posting one for an album already subscribed renews it

OptionDescription
--issuer <HOST>Required. The album’s home server, which minted the capability (e.g. home.example).
--jsonPrint the subscription as one JSON document on stdout: whether it was created, and its peer, album, scope, jti, issue, expiry and subscription instants and liveness.
capsule federation unsubscribe <PEER> <ALBUM_ID> [OPTIONS]

Stop pulling one album from another server for this account. Succeeds whether or not the album was subscribed

ArgumentDescription
<PEER>Required. The album’s home server.
<ALBUM_ID>Required. The album, as its home server names it.
OptionDescription
--jsonPrint the outcome as one JSON document on stdout.
capsule import <PATH>... --library <PATH> [OPTIONS]

Import files into a local Capsule library

ArgumentDescription
<PATH>...Required. Source file or directory to import. Repeatable: a split Takeout export extracted into several folders is imported by naming every part in one run, so a media file and a sidecar that landed in different parts are still paired.
OptionDescription
--provider <PROVIDER>Read the source as an export from this service instead of as a plain directory tree, so its out-of-band metadata (capture time, GPS, captions, favorites, album membership) is folded into the imported assets. Values: takeout.
--library <PATH>Required. Path to the Capsule library.
--moveMove files: delete each source once the server holds it, which needs --push. Without it every source is kept.
--forceRe-import files even if they already exist (duplicate override).
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so imports work in scripts and CI where there is no terminal.
--pushPush the library to the server after importing — sugar for a capsule push run over the same library. The import itself stays offline.
--stagedStage the follow-on push (--push) in tier order, gating the preview and original tiers on the connection class.
--jsonPrint the run as one JSON document on stdout: the totals, including how many originals arrived without derivatives and why, and each file’s outcome. Not combined with --push; run capsule push --json for the push report.
capsule label <COMMAND>

Add or remove a label on an asset, a region of one, a stack or an album

CommandDescription
capsule label addAdd a label, as a signed edit
capsule label removeRemove a label: every add of it this device has seen
capsule label add <LABEL> --library <PATH> [OPTIONS]

Add a label, as a signed edit

ArgumentDescription
<LABEL>Required. The label: 1 to 256 bytes once trimmed.
OptionDescription
--asset <ASSET>Label this asset: its id, or a prefix of at least 8 hex characters of its SHA-256 content hash.
--stack <STACK_ID>Label this stack.
--album <ALBUM_ID>Label this album.
--region <REGION_ID>Label this region of the asset instead of the asset itself.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule label remove <LABEL> --library <PATH> [OPTIONS]

Remove a label: every add of it this device has seen

ArgumentDescription
<LABEL>Required. The label: 1 to 256 bytes once trimmed.
OptionDescription
--asset <ASSET>Label this asset: its id, or a prefix of at least 8 hex characters of its SHA-256 content hash.
--stack <STACK_ID>Label this stack.
--album <ALBUM_ID>Label this album.
--region <REGION_ID>Label this region of the asset instead of the asset itself.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule library <COMMAND>

Manage the local library

CommandDescription
capsule library infoShow library information
capsule library initCreate a new Capsule library
capsule library listList a library’s timeline, albums or stacks, as the TUI’s library browser shows them
capsule library rebuildRebuild the SQLite index from sidecar files
capsule library info <PATH>

Show library information

ArgumentDescription
<PATH>Required. Path to the library.
capsule library init <PATH> [OPTIONS]

Create a new Capsule library

ArgumentDescription
<PATH>Required. Directory for the new library.
OptionDescription
--name <NAME>Human-readable library name. Default: My Library.
capsule library list --library <PATH> [OPTIONS]

List a library’s timeline, albums or stacks, as the TUI’s library browser shows them

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--view <VIEW>Which view to list. Values: timeline, albums, stacks. Default: timeline.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the view as one JSON document on stdout: the timeline’s assets, every album with its labels and assets, or every stack with its labels and members.
capsule library rebuild <PATH>

Rebuild the SQLite index from sidecar files

ArgumentDescription
<PATH>Required. Path to the library.
capsule list [OPTIONS]

List the assets the sync feed has delivered

OptionDescription
--include-deletedInclude assets the server has tombstoned (deleted) as well as live ones.
capsule match <PATH>

Match metadata for current file

ArgumentDescription
<PATH>Required. Path to the file to match metadata for.
capsule peer <COMMAND>

Hand uploads to another device of this account, or upload ones handed to this device

CommandDescription
capsule peer acceptTake hand-off files another device of this account sealed for this one, then upload every hand-off this device holds under its own session, deleting each copy once the server holds it. A hand-off that can never succeed is quarantined: kept, not retried, listed by capsule peer status and deleted only by capsule peer discard
capsule peer delegateSeal assets’ uploads for another device of this account to upload later. Each asset is written to a hand-off file the other device takes with capsule peer accept, or with --peer handed over the LAN peering channel to capsule peer accept --listen; this device keeps every original until its own check finds the server holds it
capsule peer discardDelete a quarantined hand-off this device holds for another device. Only a quarantined copy can be discarded; it may be the account’s only copy of the asset, so recover it first if its origin device is lost
capsule peer forget-deleteStop retrying a delete made after a hand-off that capsule peer status keeps reporting as not applied because the library holds neither the asset nor its tombstone. Local only: the server keeps the asset as it holds it. Refused while the library still holds the asset’s chain, since capsule peer status can then send the delete
capsule peer offerSend this library’s assets to another device of this account over the LAN peering channel: dial its capsule peer pull --listen, verify it over mutual TLS as a device of this account, and serve it one backup artifact sealed for that session. The other device skips what it already holds and refuses what it has purged
capsule peer pullTake assets another device of this account sends with capsule peer offer: listen on ADDR, verify the device over mutual TLS, pull its backup artifact and write every asset that is new or a forward update. An asset this device has purged is refused, and the run is refused before listening if the purge record cannot be read
capsule peer statusShow this device’s handed-off assets: take the other device’s acknowledgements, take back uploads that are overdue or whose device was revoked, and release what the server holds. A delete made after a hand-off is held until the server holds the asset, then sent. Also lists every hand-off this device quarantined
capsule peer accept --library <PATH> [OPTIONS]

Take hand-off files another device of this account sealed for this one, then upload every hand-off this device holds under its own session, deleting each copy once the server holds it. A hand-off that can never succeed is quarantined: kept, not retried, listed by capsule peer status and deleted only by capsule peer discard

OptionDescription
--library <PATH>Required. Path to this device’s Capsule library.
--from <FILE>A hand-off file to take (repeatable); without one, only the held hand-offs upload.
--listen <ADDR>Also take hand-offs over the LAN peering channel: listen on ADDR (e.g. 0.0.0.0:7420) for the other device’s capsule peer delegate --peer, verify it over mutual TLS as a device of this account, pull each hand-off it sealed for this device, and acknowledge each over the same channel once it is persisted. Only local-network peers are admitted. The address bound is printed on stderr.
--listen-timeout <SECONDS>Seconds --listen waits for a peer to connect and verify; a verified session is not cut by it, but runs to its end at a minimum transfer rate. Default: 300.
--stagedOpen the tier sessions in ladder order, gating the above-index tiers on the connection class, as capsule push --staged does.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: each hand-off taken with its acknowledgement (and, over the channel, the peer it came from and whether the peer took the acknowledgement), each refused, and what became of each held hand-off (removed, kept, failed and kept, or permanently refused and quarantined), each failure with a stable kind, the server’s code when it gave one, and the detail.
capsule peer delegate --library <PATH> --asset <ASSET_ID> [OPTIONS]

Seal assets’ uploads for another device of this account to upload later. Each asset is written to a hand-off file the other device takes with capsule peer accept, or with --peer handed over the LAN peering channel to capsule peer accept --listen; this device keeps every original until its own check finds the server holds it

OptionDescription
--library <PATH>Required. Path to the Capsule library holding the assets.
--to <DEVICE_ID>The device to hand the uploads to: its id in this account’s device directory. Required with --out; with --peer, the device the channel verifies must be this one.
--asset <ASSET_ID>Required. An asset to hand off (repeatable).
--out <DIR>Directory the hand-off files are written to.
--peer <HOST:PORT>Hand the uploads over the LAN peering channel instead of files: dial the other device’s capsule peer accept --listen at HOST:PORT, verify it over mutual TLS as a device of this account, and serve it each hand-off to pull and acknowledge over the same channel. Only a local-network address is dialed.
--deadline-hours <HOURS>Hours to wait for the server to hold the assets before taking the uploads back. Default: 24.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the delegate, each asset handed off, with its file or whether the delegate acknowledged it over the channel, and its content address, and each that was not, with a stable kind, the server’s code when it gave one, and the detail.
capsule peer discard <HAND_OFF> --library <PATH> [OPTIONS]

Delete a quarantined hand-off this device holds for another device. Only a quarantined copy can be discarded; it may be the account’s only copy of the asset, so recover it first if its origin device is lost

ArgumentDescription
<HAND_OFF>Required. The quarantined hand-off’s content address, as capsule peer status lists it.
OptionDescription
--library <PATH>Required. Path to this device’s Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the discarded hand-off as one JSON document on stdout: its content address, its asset and the kind it had been quarantined for.
capsule peer forget-delete <ASSET_ID> --library <PATH> [OPTIONS]

Stop retrying a delete made after a hand-off that capsule peer status keeps reporting as not applied because the library holds neither the asset nor its tombstone. Local only: the server keeps the asset as it holds it. Refused while the library still holds the asset’s chain, since capsule peer status can then send the delete

ArgumentDescription
<ASSET_ID>Required. The asset, as capsule peer status lists it.
OptionDescription
--library <PATH>Required. Path to the Capsule library holding the assets.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the asset and how many outbox entries were dropped.
capsule peer offer --library <PATH> --peer <HOST:PORT> [OPTIONS]

Send this library’s assets to another device of this account over the LAN peering channel: dial its capsule peer pull --listen, verify it over mutual TLS as a device of this account, and serve it one backup artifact sealed for that session. The other device skips what it already holds and refuses what it has purged

OptionDescription
--library <PATH>Required. Path to the Capsule library holding the assets.
--peer <HOST:PORT>Required. The other device’s capsule peer pull --listen address. Only a local-network address is dialed.
--to <DEVICE_ID>The device the channel must verify; refused if the device at --peer is another.
--asset <ASSET_ID>An asset to send (repeatable); without one, every asset in the library is sent.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the device the channel verified, the artifact’s content address, size and assets, how many bytes the other device pulled, and each failure with a stable kind and the detail.
capsule peer pull --library <PATH> --listen <ADDR> [OPTIONS]

Take assets another device of this account sends with capsule peer offer: listen on ADDR, verify the device over mutual TLS, pull its backup artifact and write every asset that is new or a forward update. An asset this device has purged is refused, and the run is refused before listening if the purge record cannot be read

OptionDescription
--library <PATH>Required. Path to this device’s Capsule library.
--listen <ADDR>Required. The address to listen on (e.g. 0.0.0.0:7420). Only local-network peers are admitted. The address bound is printed on stderr.
--listen-timeout <SECONDS>Seconds to wait for a peer to connect and verify; a verified session is not cut by it, but runs to its end at a minimum transfer rate. Default: 300.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the peer, each artifact pulled, the assets applied, quarantined (the peer sent stale state), tombstoned (purged here), identical (already held) and incomplete, each failure and each refused connection with a stable kind and the detail.
capsule peer status --library <PATH> [OPTIONS]

Show this device’s handed-off assets: take the other device’s acknowledgements, take back uploads that are overdue or whose device was revoked, and release what the server holds. A delete made after a hand-off is held until the server holds the asset, then sent. Also lists every hand-off this device quarantined

OptionDescription
--library <PATH>Required. Path to the Capsule library holding the assets.
--ack <FILE>An acknowledgement file capsule peer accept wrote (repeatable).
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: each delegation with its state, each refused acknowledgement with a stable kind and the detail, each quarantined hand-off with its file, the stable kind of its refusal, the server’s code when it gave one, and the detail, and each delete made after a hand-off with the records between the hand-off and it (held, sent, failed and kept, or refused and not retried).
capsule push --library <PATH> [OPTIONS]

Upload a local Capsule library to the server. An asset handed to another device with capsule peer delegate is left to that device while its hand-off is open

OptionDescription
--library <PATH>Required. Path to the Capsule library to push.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so pushes work in scripts and CI where there is no terminal.
--dry-runReport what would be uploaded without opening a single upload session.
--forceRe-drive every blob regardless of what the server already holds.
--stagedOpen the tier sessions in ladder order (index → preview → original), gating the above-index tiers on the connection class, instead of opening all eagerly.
--asset <ASSET_ID>Push only this asset (repeatable); every asset in the library when omitted. Retries the assets a run reported failed without re-importing them or re-checking the ones that reached custody.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s outcome (verified, failed with its error, delegated to another device, or planned on a dry run).
--path-cost <COST>What the path costs; on metered or constrained the push is staged and the preview and original tiers wait. Values: unmetered, metered, constrained.
--path-interface <INTERFACE>The interface the path runs over. Values: wired, wifi, cellular, other.
--power <POWER>The power source; low-power holds the preview and original tiers back. Values: external, battery, low-power.
--thermal <STATE>The thermal state; serious holds the preview and original tiers back, critical sends nothing. Values: nominal, fair, serious, critical.
--background-deadline <SECONDS>Run as a background task the OS ends this many seconds from now; under a minute holds the preview and original tiers back.
capsule region <COMMAND>

Mark or delete a circle or rectangle region on an asset

CommandDescription
capsule region addMark a circle or rectangle region on an asset, in fractions of the image (display orientation), and print its id
capsule region deleteDelete a region of an asset. Final: another device’s edit of it does not bring it back
capsule region add --asset <ASSET> --library <PATH> [OPTIONS]

Mark a circle or rectangle region on an asset, in fractions of the image (display orientation), and print its id

OptionDescription
--asset <ASSET>Required. The asset: its id, or a prefix of at least 8 hex characters of its content hash.
--circle <CX,CY,R>A circle: centre, a fraction of width and height, and radius, a fraction of the shorter side (min(width, height)).
--rect <X,Y,W,H>A rectangle: top-left corner, width and height, each a fraction of the image.
--label <LABEL>Give the region this label (repeatable).
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule region delete <REGION_ID> --asset <ASSET> --library <PATH> [OPTIONS]

Delete a region of an asset. Final: another device’s edit of it does not bring it back

ArgumentDescription
<REGION_ID>Required. The region.
OptionDescription
--asset <ASSET>Required. The asset: its id, or a prefix of at least 8 hex characters of its content hash.
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint what the edit did as one JSON document on stdout: the target and its labels, capture time or location afterwards.
capsule repair <COMMAND>

Repair a local library in place, one signed correction per affected asset

CommandDescription
capsule repair capture-timeRe-read each original’s EXIF capture time and report every asset whose signed capture timestamp disagrees with it; with —apply, correct each one as a signed metadata update
capsule repair capture-time --library <PATH> [OPTIONS]

Re-read each original’s EXIF capture time and report every asset whose signed capture timestamp disagrees with it; with —apply, correct each one as a signed metadata update

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--applyWrite the corrections. Without this flag the pass only reports what it would change; each correction is an irreversible signed record on the asset’s chain.
--limit <COUNT>Correct at most this many affected assets in one —apply run (the report still covers the whole library); only meaningful with —apply.
capsule reset [OPTIONS]

Reset all local CLI data

OptionDescription
--configReset configuration.
--dataReset data directory.
--cacheReset cache directory.
--allReset all data.
capsule restore --library <PATH> --out <DIR> [OPTIONS]

Download originals from the server and verify them byte for byte

OptionDescription
--library <PATH>Required. Path to the Capsule library whose album keys open the originals.
--out <DIR>Required. Directory the originals are written to, one file per asset named by its id; an interrupted run resumes from what it left there.
--album <ALBUM_ID>Restore only the assets of this album.
--asset <ASSET_ID>Restore only this asset.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so restores work in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s outcome (restored, already present, or failed with its error).
capsule server-info [OPTIONS]

Show how the server signs people in: its identity provider, and whether it accepts passwords, from its public server-info record

OptionDescription
--jsonPrint the record as one JSON document on stdout: the server’s id, whether it has an identity provider (oidc) and whether it refuses passwords (password_disabled).
capsule share <COMMAND>

Issue and revoke view-only share links on the server

CommandDescription
capsule share createIssue a view-only share link for an album or one asset, and print the URL to send
capsule share revokeRevoke a share link, so its URL stops opening
capsule share create --library <PATH> [OPTIONS]

Issue a view-only share link for an album or one asset, and print the URL to send

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--album <ALBUM_ID>Share every asset of this album that is not in trash.
--asset <ASSET_ID>Share this one asset.
--expires-at <TIMESTAMP>When the link stops opening, as an RFC 3339 timestamp (e.g. 2026-12-31T23:59:59Z).
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--protectProtect the link with a passphrase the recipient must enter as well as open the URL.
--link-passphrase-stdinWith —protect, read the link passphrase from stdin instead of prompting (the line after the library passphrase when —passphrase-stdin is also given).
--jsonPrint the issued link as one JSON document on stdout: its opaque id, URL, how many assets it covers, whether it is passphrase-protected, and its expiry.
capsule share revoke <OPAQUE_ID> [OPTIONS]

Revoke a share link, so its URL stops opening

ArgumentDescription
<OPAQUE_ID>Required. The link’s opaque id: the 32 hex characters after /s/ in its URL.
OptionDescription
--jsonPrint the outcome as one JSON document on stdout: the revoked link’s opaque id.
capsule show <ASSET> --library <PATH> [OPTIONS]

Show what an imported asset’s signed sidecar records: caption, rating, tags, GPS, timestamps

ArgumentDescription
<ASSET>Required. The asset to show: its id, or a prefix of at least 8 hex characters of its SHA-256 content hash — the same digest shasum -a 256 prints for the source file.
OptionDescription
--library <PATH>Required. Path to the Capsule library.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the asset as one JSON document on stdout: every sidecar field, null where unset, and its provenance history record by record.
capsule status

Show current status

capsule sync [OPTIONS] <COMMAND>

Sync local and remote data

OptionDescription
--forceDiscard the saved cursor and re-drain the feed from the start. The per-album anti-rewind floor still applies, so this cannot resurrect stale entries.
--dry-runPerform a dry run without making changes.
--library <PATH>The library to re-announce from when the server has rebuilt this library’s index: with it, a sync that meets a stale cursor runs capsule sync reannounce itself.
--passphrase-stdinRead the library passphrase from stdin instead of prompting (with --library).
--jsonPrint the run as one JSON document on stdout: how many changes were applied across how many albums and pages, whether the server had rebuilt the index, and the re-announce report when --library ran one.
CommandDescription
capsule sync reannounceGive the server back the signed manifests this library holds and its feed no longer lists, after it rebuilt this library’s index. Manifests only: no bytes are uploaded
capsule sync reannounce --library <PATH> [OPTIONS]

Give the server back the signed manifests this library holds and its feed no longer lists, after it rebuilt this library’s index. Manifests only: no bytes are uploaded

OptionDescription
--library <PATH>Required. Path to the Capsule library whose manifests are re-announced.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--dry-runReport what would be re-announced without sending anything.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s answer (restored, already indexed, missing blobs, refused, or planned on a dry run).
capsule trash <COMMAND>

Move assets to the trash or restore them from it, in the library and on the server

CommandDescription
capsule trash deleteMove assets to the trash: sign a delete carrying a retention window and send it to the server. Soft: each asset stays restorable until its window elapses
capsule trash restoreRestore assets from the trash: sign a trash-restore and send it to the server. An asset whose retention window has closed cannot be restored, and is not retried
capsule trash delete --library <PATH> --asset <ASSET_ID> [OPTIONS]

Move assets to the trash: sign a delete carrying a retention window and send it to the server. Soft: each asset stays restorable until its window elapses

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--asset <ASSET_ID>Required. The asset to move to the trash (repeatable).
--retain-days <DAYS>Retention window, in days, a fresh delete signs. An asset already in the trash (for example by capsule cull --sweep) is resent with the window it was deleted with; --json reports that window as retention_until. Default: 30.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s outcome (applied, or failed with a stable kind and the server’s code).
capsule trash restore --library <PATH> --asset <ASSET_ID> [OPTIONS]

Restore assets from the trash: sign a trash-restore and send it to the server. An asset whose retention window has closed cannot be restored, and is not retried

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--asset <ASSET_ID>Required. The asset to restore (repeatable).
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s outcome (applied, or failed with a stable kind such as retention_elapsed, the server’s code and the retention floor).
capsule verify --library <PATH> [OPTIONS]

Ask the server whether it durably holds this library’s originals, and keep its signed answer as evidence

OptionDescription
--library <PATH>Required. Path to the Capsule library.
--asset <ASSET_ID>Verify only this asset (repeatable); every asset in the library when omitted.
--signedAsk for the server’s signed verdict, check it under the server’s attestation key, and keep it in the library beside each asset’s custody receipts.
--deepHave the server re-hash the stored bytes rather than only check they are present; spends the account’s deep-verify budget.
--passphrase-stdinRead the library passphrase from stdin instead of prompting, so the command works in scripts and CI where there is no terminal.
--jsonPrint the run as one JSON document on stdout: the totals and each asset’s verdict (durable, not durable, or failed with its error).