Skip to content
Indiana
Dashboard
Docs
Browse docs / Indiana CLI

Indiana CLI

Configure scope, approve access in your browser, list Apps and validate Funnel / Paywall documents from your terminal.

CLI 0.3.5Updated

Current capabilities

Indiana CLI uses your console member identity. Browser approval grants access to a specific App and environment. The public download is 0.3.5 and requires Node.js >=22.

Available commands and limits
CommandPurpose
config / profiles / contextLocal server, profile and Org/App/environment selection
doctor / capabilitiesServer readiness and command coverage
update --check / updateCheck public releases and upgrade the installed CLI
login / whoami / auth status / logoutBrowser login, device authorization status and revocation
projects listRead authorized App names and environments with project.read
funnels validate / funnels diffValidate and compare local Funnel documents
offerings validate / offerings diffLocal Offering hierarchy, publication structure and diffs
coupons / rewards / referral-programsGranted catalog, code and lifecycle management; excludes subscription discount execution
operations list / operations describeFinite operation catalog, required grants and availability
customers / features / productsCustomer and catalog reads and current actions
offerings apply / paywalls apply / funnels applyRemote authoring, publication and revision checks through the Console handlers
paywalls validate / paywalls diffValidate and compare local Paywall documents

Available commands and limits

  • config / profiles / context

    Purpose
    Local server, profile and Org/App/environment selection
  • doctor / capabilities

    Purpose
    Server readiness and command coverage
  • update --check / update

    Purpose
    Check public releases and upgrade the installed CLI
  • login / whoami / auth status / logout

    Purpose
    Browser login, device authorization status and revocation
  • projects list

    Purpose
    Read authorized App names and environments with project.read
  • funnels validate / funnels diff

    Purpose
    Validate and compare local Funnel documents
  • offerings validate / offerings diff

    Purpose
    Local Offering hierarchy, publication structure and diffs
  • coupons / rewards / referral-programs

    Purpose
    Granted catalog, code and lifecycle management; excludes subscription discount execution
  • operations list / operations describe

    Purpose
    Finite operation catalog, required grants and availability
  • customers / features / products

    Purpose
    Customer and catalog reads and current actions
  • offerings apply / paywalls apply / funnels apply

    Purpose
    Remote authoring, publication and revision checks through the Console handlers
  • paywalls validate / paywalls diff

    Purpose
    Validate and compare local Paywall documents
Use operations list --available to find supported operations and operations describe for permissions and inputs. Unavailable operations return CAPABILITY_UNAVAILABLE (exit code 7). Available operations still require account authorization.

Install and configure

Downloads are publicly hosted by Indiana. On macOS/Linux, use curl: dependencies are included, and installation invokes no npm and needs no npm account or sudo. Install Node.js 22 or newer first; the archive does not include a Node.js runtime.

curl supports macOS arm64/x64 and Linux arm64/x64 with glibc/musl. The script detects your platform, verifies SHA-256, and installs to ~/.local/bin/indiana with releases in ~/.local/share/indiana/releases. Add ~/.local/bin to PATH as shown above. Customize locations with absolute INDIANA_BIN_DIR and INDIANA_INSTALL_ROOT paths. Rerun curl to upgrade; unrelated executables are never overwritten. Archives and checksums are listed at https://tinker.cash/downloads/cli/portable.json.

npm is also available; use this option on Windows. It downloads the CLI from our website and dependencies from the public npm registry. No repository access or npm account is required.

From 0.3.3, use update --check to check releases and indiana update to upgrade. Successful interactive commands check the public version at most daily and show an upgrade notice. Checks have a 1.5-second deadline; offline failures leave command results intact. JSON, CI, non-interactive, help and version runs stay silent. Set INDIANA_NO_UPDATE_CHECK=1 to disable automatic checks, or use update --check --json explicitly. Updates verify downloads and the installed version, preserving custom curl directories or the global npm prefix, configuration and credentials. Releases always come from the official website, independently of --server.

If you have 0.3.2 or earlier, run this page's curl or npm install command once to bootstrap 0.3.3. Subsequent releases can be discovered automatically and installed with indiana update. Source or unrecognized installations receive installation guidance.

To uninstall the default curl installation, remove ~/.local/bin/indiana and ~/.local/share/indiana; saved configuration and credentials remain. Uninstall npm installations with npm uninstall -g @indiana/cli. Rerunning the current installation command also upgrades the CLI. npm archive metadata is at https://tinker.cash/downloads/cli/latest.json. Public installation does not expand account permissions: management operations still require login and explicit approval.

Set the target service URL and existing Organization/App IDs, then run doctor to check connectivity and login configuration. Select the required Account, Organization, App or Environment grants during login. context use saves your selection; account permissions and approval determine access.

config init creates indiana.config.json without overwriting files. Scope priority is explicit flags, project configuration, then the selected profile. context use updates existing project configuration or otherwise the profile. Configuration may be committed; exclude tokens and SDK keys. Use INDIANA_CLI_CONFIG_DIR to change the user configuration directory.

terminal.shShell
curl -fsSL https://tinker.cash/install.sh | shexport PATH="$HOME/.local/bin:$PATH"indiana --versionindiana --helpindiana capabilities --only-supported --jsonindiana config init --server https://tinker.cashindiana profiles add work --server https://tinker.cashindiana profiles use workindiana context use --org <org-uuid> --app <app-uuid> --env sandboxindiana doctor --json
npm-install.shShell
npm install -g https://tinker.cash/downloads/cli/0.3.5/indiana-cli-0.3.5.tgz
update.shShell
indiana update --checkindiana updateindiana --version

Login and App approval

  • The CLI opens your system browser. Sign in with your console account and approve the OAuth identity request.
  • A second page shows the device request, App, environment and permissions. Check the device label and requested scope before approval.
  • The CLI waits for approval, then saves credentials. Pending requests expire after 10 minutes and management grants after 30 days. Token refresh does not extend the grant.

Login requests only project.read by default. For resource reads, explicitly add --permissions project.read,coupons.read,rewards.read to the login command. Writes require their matching resource grant, such as customers.write, features.write, plans.write or platform.write. Request only what the task needs; an existing grant is never expanded automatically.

Login requires a browser and temporarily listens at http://127.0.0.1:43187/callback. Free this port before retrying if it is occupied.

Sign in with your Console account; the CLI refreshes saved login credentials automatically. Sign in again after account, membership or device access is revoked. Browser cookies, SDK keys and CI service accounts cannot be used to log in.

terminal.shShell
indiana login --profile workindiana whoami --profile work --jsonindiana auth status --profile work --jsonindiana projects list --profile work --json

Credentials and device revocation

Credentials default to the operating system credential store, bound to the management origin, profile, issuer, client, user and session. An unavailable credential store fails explicitly, without automatic file fallback. POSIX users may explicitly choose --credential-store file with 0700 directories and 0600 files. Windows does not support this file mode.

whoami returns the server-verified identity and scope without tokens. With no saved credential, logout succeeds immediately. Otherwise, it verifies revocation of this device's exact server grant before deleting local credentials. Network failure retains credentials and reports incomplete revocation. logout --local only removes local credentials; the server grant may remain valid. Use /cli/sessions on the selected management server to review and revoke individual devices. Revoking one device leaves other devices unchanged.

terminal.shShell
indiana logout --profile work

Call business operations

requiredPermissions in operations describe lists the complete grant dependencies. Customer creation also needs plans.read and features.read; Feature changes need plans.write and balances.read; Product writes also need features.read, customers.read, balances.read and rewards.read. Missing dependencies fail before mutation so defaults and existing references cannot be silently omitted.

customer-create.json contains { "input": { "externalUserId": "user-42", "name": "Alex" } }. An update file contains { "requestId": "<new UUID>", "patch": { "name": "Alex Updated" } }. App/environment come from the approved selection; conflicting values are rejected. Design actions use the current Console DTOs and retain revision, requestId and publication validation.

Use repeatable --query key=value fields, such as features list --query id=<feature-uuid>. --file - reads stdin. call <operationId> --input envelope.json accepts {params,query,body} for a catalogued operation; arbitrary URLs and RPCs are rejected. --input cannot be mixed with the individual input flags.

To change scope, logout and login --permissions with the required resource grants; existing device grants never expand automatically. --out <new-file> saves JSON with 0600 permissions without overwriting files; failure removes this operation’s incomplete output. Failed writes are never retried automatically.

terminal.shShell
indiana operations list --available --jsonindiana operations describe console.customers.post --jsonindiana customers list --jsonindiana customers create --file customer-create.json --jsonindiana customers get <customer-uuid> --jsonindiana customers update <customer-uuid> --file customer-update.json --jsonindiana features list --jsonindiana products list --timeout 30000 --jsonindiana offerings list --jsonindiana paywalls apply --file paywall-operation.json --jsonindiana funnels apply --file funnel-operation.json --json

Read configuration, analysis and financial details

terminal.shShell
indiana growth features list --query limit=25 --jsonindiana growth features get checkout_enabled --jsonindiana growth features revisions list --query parentId=checkout_enabled --jsonindiana growth experiments list --jsonindiana growth metrics fact-metrics list --jsonindiana growth insights reports get <report-uuid> --jsonindiana snapshots list --query parentId=<experiment-uuid> --jsonindiana snapshots get <snapshot-uuid> --jsonindiana snapshots status <snapshot-uuid> --jsonindiana snapshots run --file snapshot.json --jsonindiana snapshots cancel <snapshot-uuid> --jsonindiana operations describe console.growth.read.get --query resource=reports --jsonindiana customers invoices get <customer-uuid> <invoice-uuid> --jsonindiana customers invoices refunds get <customer-uuid> <invoice-uuid> --jsonindiana customers credit-statement get <customer-uuid> --query from=2026-10-01T00:00:00Z --query to=2026-10-02T00:00:00Z --jsonindiana customers entities get <customer-uuid> --jsonindiana customers seats get <customer-uuid> --jsonindiana overview list --query from=2026-10-01 --query to=2026-10-02 --jsonindiana events list --query name=payment.failed --json

Snapshots use the dedicated snapshots group: list/get reads records, status <id> reads computation and query progress, run --file snapshot.json starts a computation, and cancel <id> cancels it. snapshot.json contains { "experimentId": "<experiment-uuid>" }, with optional phase, endDate or dimension from the existing API. status accepts --query sql=1 for authorized query details. Original App, environment and permission checks apply.

GrowthBook configuration requires App platform.read. Snapshots, Dashboards, Reports, Saved Queries and Safe Rollout results also require platform.read and analytics.read in the selected environment. Use operations describe --query resource=... for exact requirements. Private objects retain their visibility restrictions.

GrowthBook reads return {resource,rows,ids,nextCursor}, defaulting to 25 rows with a maximum of 100. Use the pagination and filters below.

Filters and pagination
QueryParameters
GrowthBookContinue with --query after=<nextCursor>, preserving the cursor unchanged. Use ids[n] to get rows[n], including composite identities.
parentIdFilter Feature revisions/history/references, Experiment Snapshots/Dashboards/Reports, or Safe Rollout Snapshots.
InvoiceContinue with after.
Credit statementReturn snapshotAt, afterAt, afterId and afterPosition together for the next page.
Overview / eventsDates use UTC with a maximum range of 90 days. Event continuation requires both before and after.

Filters and pagination

  • GrowthBook

    Parameters
    Continue with --query after=<nextCursor>, preserving the cursor unchanged. Use ids[n] to get rows[n], including composite identities.
  • parentId

    Parameters
    Filter Feature revisions/history/references, Experiment Snapshots/Dashboards/Reports, or Safe Rollout Snapshots.
  • Invoice

    Parameters
    Continue with after.
  • Credit statement

    Parameters
    Return snapshotAt, afterAt, afterId and afterPosition together for the next page.
  • Overview / events

    Parameters
    Dates use UTC with a maximum range of 90 days. Event continuation requires both before and after.

Validate and compare design documents

Use current editable Funnel/Paywall documents and canonical Offering fields (lookupKey/displayName/items/metadata). Input must be valid UTF-8 and JSON, at most 1,000,000 bytes. draft allows incomplete drafts; publish checks publication structure. validate accepts --file - for stdin. Obsolete formats are rejected.

Validation reports validation=local and serverChecks=not_run. Structural validity does not authorize publication: tenant access, fixed references, providers and current state still require server checks. diff emits JSON Pointers, change kinds and stable SHA-256 hashes without document values. It shows up to 100 changes with total / truncated fields.

terminal.shShell
indiana funnels validate --file funnel.json --mode publish --jsonindiana paywalls validate --file paywall.json --mode draft --jsonindiana offerings validate --file offering.json --mode publish --jsonindiana funnels diff --against before.json --file after.json --jsonindiana paywalls diff --against before.json --file after.json --json

Edit screen sources

The Paywall, Popup and Page source-editing commands below are not yet included in public downloads. They require compatible CLI and service versions.

Pull into a new directory. screen.json holds structure, copy and actions; edit localized HTML and shared CSS under html/<node-id>/. indiana.source.json retains the target, App/environment and pull baseline. Use a local editor or AI agent, check and review the changes, then submit a draft or import them into the Web code editor for review.

Pull uses platform.read; push uses platform.write and the original native authoring checks. Check/diff run offline. Push enforces the original revision and preserves files on conflict; library targets create a private template copy. Commands do not publish, watch files or start a local preview server.

terminal.shShell
indiana code pull paywall/<uuid> --out ./templateindiana code pull funnel/<uuid>/screen/<screen-id> --out ./popupindiana code pull template/<uuid> --out ./private-templateindiana code check ./template --jsonindiana code diff ./template --jsonindiana code push ./template --json

Script output and troubleshooting

--json writes one JSON result to stdout; login progress goes to stderr. Handle error.code/message and record status/requestId when provided. Extended fields such as retryable, recovery and retryAfterSeconds are not yet included in public downloads. --non-interactive does not start a new browser login. --timeout is the per-request deadline: 1–60000 ms, default 10000.

Management-specific error codes
codeMeaning and handling
INVALID_SERVER_RESPONSEThe response does not match the contract; retain diagnostics and recover the original write outcome.
RESPONSE_TOO_LARGEThe result exceeds the management response budget; narrow the query or paginate.
AMBIGUOUS_AUTHENTICATIONThe request mixes Bearer and browser session cookies; use the identity required by the endpoint.
BROWSER_REQUIREDThis approval operation requires a browser member session.
INVALID_REDIRECT_URIThe OAuth callback is not allowed; check the client registration.
AUTHORIZATION_UNAVAILABLEThe authorization request is unavailable; check its input, approval state and expiry.
UNREGISTERED_CLIENTThe OAuth client is unregistered or unavailable; ask the administrator to check configuration.
MANAGEMENT_OPERATION_FAILEDThe management operation failed; retain requestId and read the original write outcome.

Management-specific error codes

  • INVALID_SERVER_RESPONSE

    Meaning and handling
    The response does not match the contract; retain diagnostics and recover the original write outcome.
  • RESPONSE_TOO_LARGE

    Meaning and handling
    The result exceeds the management response budget; narrow the query or paginate.
  • AMBIGUOUS_AUTHENTICATION

    Meaning and handling
    The request mixes Bearer and browser session cookies; use the identity required by the endpoint.
  • BROWSER_REQUIRED

    Meaning and handling
    This approval operation requires a browser member session.
  • INVALID_REDIRECT_URI

    Meaning and handling
    The OAuth callback is not allowed; check the client registration.
  • AUTHORIZATION_UNAVAILABLE

    Meaning and handling
    The authorization request is unavailable; check its input, approval state and expiry.
  • UNREGISTERED_CLIENT

    Meaning and handling
    The OAuth client is unregistered or unavailable; ask the administrator to check configuration.
  • MANAGEMENT_OPERATION_FAILED

    Meaning and handling
    The management operation failed; retain requestId and read the original write outcome.

For connection failures, run doctor --json and inspect host, stage and troubleshooting hints when available in your CLI version. TIMEOUT/NETWORK_ERROR can leave the result unknown: recover the original write, or check auth status after a login failure. The CLI does not resend writes automatically. See Requests & errors for recovery rules.

If your network requires a proxy, check HTTP_PROXY, HTTPS_PROXY and NO_PROXY. On Node.js 22.21+ within 22.x or Node.js 24+, NODE_USE_ENV_PROXY=1 indiana doctor --json enables environment proxies for that invocation; it does not create a proxy or set its address. HTTP 407 indicates proxy authentication, while unclassified proxy tunnel failures can remain unknown. The CLI does not change shell configuration automatically.

Related:Common errors and recovery

Exit codes
ValueMeaning
0Success
2Invalid arguments, configuration, file or document
3Missing login, denied grant, failed refresh or expired session
4Permission, origin binding or redirect constraint failed
5Configuration/resource revision conflict or occupied write lock
6Service, network or response protocol error
7Runtime, management API or authorization not ready

Exit codes

  • 0

    Meaning
    Success
  • 2

    Meaning
    Invalid arguments, configuration, file or document
  • 3

    Meaning
    Missing login, denied grant, failed refresh or expired session
  • 4

    Meaning
    Permission, origin binding or redirect constraint failed
  • 5

    Meaning
    Configuration/resource revision conflict or occupied write lock
  • 6

    Meaning
    Service, network or response protocol error
  • 7

    Meaning
    Runtime, management API or authorization not ready
  • If doctor reports ready=false, use its output to check the service origin and OAuth configuration before login.
  • For an expired or revoked grant, or changed membership, inspect auth status and sign in for a new approval under your current permissions.
  • When changing servers, create a profile for that origin. Saved tokens cannot be carried to another service.