manifold generates Paperback backups, migrates provider lists, and maintains
your canonical registry. This site documents the CLI only.
Installation
Download a manifold-cli-<os>-<arch>.zip archive and its .sha256 checksum from
GitHub Releases, choosing a
cli-v* release for your platform. Verify the checksum, extract the archive,
and put manifold (or manifold.exe on Windows) on your PATH. Linux binaries
support x64 and arm64; macOS supports arm64; Windows supports x64.
From an installed binary:
manifold --help
manifold --versionSelf-update with upgrade.
To run from source, install Bun, clone the repository, and run from its root:
git clone https://github.com/jfalava/manifold.git
cd manifold
bun install
bun run manifold --helpIn the examples below, replace manifold with bun run manifold when running
from source. The root script runs inside cli/, so relative input/output paths
resolve there, not at the repository root. Use absolute paths when needed.
Command reference
Use manifold <command> --help for the installed version’s flags.
- Login: Manifold, AniList, MyAnimeList — authorize and save sessions in the OS keychain.
- Paperback backups: pas5 create / filter — generate from AniList or the canonical registry; filter an existing archive offline.
- AniList: wipe manga — remove the manga list.
- MangaDex: stale-status — update stale statuses; unfollow-dropped — unfollow dropped titles.
- MyAnimeList: wipe manga — remove the manga list.
- Migrations: mangadex-to-anilist, anilist-to-mangadex, anilist-to-mal.
- Operations: pending — inspect the queue; retry — retry an operation; drain-anilist — apply queued AniList writes locally.
- Registry: import — snapshot AniList list state; mal, mangadex, kagane — backfill provider links.
- Reconciliation: diff — compare providers against registry state.
- Updates: upgrade — update the compiled binary.
Global flags
--help, -h
Print help for the selected command without running it.
manifold pas5 create --help--version, -v
Print the installed CLI version.
manifold --version--wizard
Start the interactive wizard for a command. Default: off.
manifold pas5 create --wizard--completions <bash|zsh|fish|sh>
Print a completion script for the selected shell. Load the output using your shell’s completion setup.
manifold --completions zsh--log-level <level>
Set the minimum log level for this invocation. Accepted values: all, trace,
debug, info, warn, warning, error, fatal, and none.
manifold ops pending --log-level debugPreview a registry backup
manifold login manifold
manifold pas5 create --source registry --limit 10 --tabs none --out ./Paperback-Registry-10.pas5Review the dry-run report, then repeat with --apply to write the file.
--tabs none keeps eligible titles without list state. The registry limit
selects the first ten active rows before eligibility checks, so skipped entries
can produce fewer than ten titles. See pas5 for the full reference.
Configuration
Remote-touching commands resolve credentials in this order: flag →
MANIFOLD_* env → OS keychain login where applicable (from cli/.env, the
process environment, or login manifold / login anilist / login mal).
Manifold authentication
Sign in with GitHub through login manifold. No separate OAuth client registration or API token is required for the default API:
manifold login manifoldThe session is stored in the OS keychain and refreshes on later API use. On a
headless host, use --paste-only and paste the callback URL after authorizing
in another browser.
A stale MANIFOLD_TOKEN overrides a successful keychain login. Remove it
from cli/.env and the process environment to use the saved session. For a
one-off command, an empty process value prevents the dotenv file from supplying it:
MANIFOLD_TOKEN= manifold pas5 create --source registry --limit 10 --tabs none--api-token <token>
Personal API token override for pas5 create, ops, reconcile, registry,
and MAL backup checks. Falls back to MANIFOLD_TOKEN, then the
login manifold keychain session. Explicit tokens do not refresh. Prefer
keychain login; flags may expose secrets in shell history or process arguments.
Example:
manifold ops pending --api-token "$MANIFOLD_TOKEN"--api-origin <url>
Personal API origin for pas5 create, ops, reconcile, registry, and MAL
backup checks. Falls back to MANIFOLD_API_ORIGIN.
- Default:
https://manifold.jfa.dev/api
Example:
manifold reconcile diff --api-origin https://manifold.example/apiAniList authentication
Prefer local OAuth over pasting tokens. Full setup: login anilist.
manifold login anilistRegister a separate authorization-code client with redirect URI
http://127.0.0.1:8767/callback, then set MANIFOLD_ANILIST_CLIENT_ID and
MANIFOLD_ANILIST_CLIENT_SECRET in cli/.env. The access token is stored in
the OS keychain (manifold / anilist-session). On a headless host use
--paste-only and paste the callback URL after authorizing in another browser.
AniList does not issue refresh tokens — re-run login when the session expires.
--anilist-token <token>
Optional AniList access token override for AniList operations, pas5 create --source anilist, migrations, reconciliation, registry import, and draining
AniList writes. Resolve order: flag → MANIFOLD_ANILIST_TOKEN → keychain login.
Example:
manifold login anilist
manifold registry importMyAnimeList authentication
Prefer local OAuth over pasting tokens. Full setup:
login mal. Consumers:
mal wipe manga,
migrate anilist-to-mal.
manifold login malRegister a separate MAL OAuth client with redirect URI
http://127.0.0.1:8766/callback, then set MANIFOLD_MAL_CLIENT_ID in
cli/.env (and MANIFOLD_MAL_CLIENT_SECRET if required). Access and refresh
tokens live in the OS keychain (manifold / mal-session); rotated refresh
tokens are saved automatically. On a headless host use --paste-only and paste
the callback URL after authorizing elsewhere. Do not reuse the deployed API’s
client or refresh token.
--mal-token <token>
Optional MAL access token override for mal wipe manga and
migrate anilist-to-mal. Resolve order: flag → MANIFOLD_MAL_TOKEN → keychain
login. A supplied token does not refresh.
Example:
manifold login mal
manifold mal wipe mangaregistry mal audits active registry entries and backfills verified MAL links
from AniList without importing MAL list state or requiring MAL authentication.
See registry mal.
migrate anilist-to-mangadex, mangadex stale-status, and mangadex unfollow-dropped require
all four MangaDex credentials.
--mangadex-client-id <id>
OAuth client ID for the MangaDex password grant. Falls back to
MANIFOLD_MANGADEX_CLIENT_ID.
Example:
manifold mangadex stale-status --mangadex-client-id "$MANIFOLD_MANGADEX_CLIENT_ID"--mangadex-client-secret <secret>
OAuth client secret for the MangaDex password grant. Falls back to
MANIFOLD_MANGADEX_CLIENT_SECRET.
Example:
manifold mangadex stale-status --mangadex-client-secret "$MANIFOLD_MANGADEX_CLIENT_SECRET"--mangadex-username <username>
MangaDex account username for the password grant. Falls back to
MANIFOLD_MANGADEX_USERNAME.
Example:
manifold mangadex stale-status --mangadex-username "$MANIFOLD_MANGADEX_USERNAME"--mangadex-password <password>
MangaDex account password for the password grant. Falls back to
MANIFOLD_MANGADEX_PASSWORD.
Example:
manifold mangadex stale-status --mangadex-password "$MANIFOLD_MANGADEX_PASSWORD"MangaDex credentials together
Pass all four flags when credentials are not available through the environment:
Example:
manifold mangadex stale-status \
--mangadex-client-id "$MANIFOLD_MANGADEX_CLIENT_ID" \
--mangadex-client-secret "$MANIFOLD_MANGADEX_CLIENT_SECRET" \
--mangadex-username "$MANIFOLD_MANGADEX_USERNAME" \
--mangadex-password "$MANIFOLD_MANGADEX_PASSWORD"AniList writes always run on your machine — AniList blocks Cloudflare Worker egress IPs, which is also why anilist:* ops drain on the device rather than the Worker.
Dry-run defaults
Library, registry, and queued-operation writes are dry-run until --apply.
anilist wipe manga --apply also requires interactive confirmation unless --yes
is present. mal wipe manga --apply requires --backup-paused instead of a
prompt, and refuses to delete while the API’s MAL connection is still active.
Exit codes
Human-readable tables and summaries go to stdout. Non-zero exit means failure — usually an upstream HTTP error (AniList rate limits: expect ~2.5 s spacing and 429 backoff) or a missing token.