Remind DocsOpen Remind ↗
SILICON REMIND / DOCUMENTATION

For new test environments, start with remind env use and the IAM application app_secret. The manual pairing commands are maintained only for existing installations. See the testing guide.

remind CLI#

remind is built entirely on silicon-remind-client. It stores preferences, application sessions, refresh tokens, and test keys under {home}/.remind/ (default {home} is SILICON_HOME when set, otherwise ~). On Unix, the directory is mode 0700 and state files are mode 0600. A process lock serializes state mutations and refreshes; saves use an atomic rename. State is separated by server origin and test-environment UUID so switching servers or sandboxes never reuses another context's session.

Build and start#

cargo build -p silicon-remind-cli
cargo run -p silicon-remind-cli -- --help
cargo install --path crates/cli --locked

The default origin is https://backend.remind.teamofsilicons.com. For local work:

remind config set-url http://127.0.0.1:8086
remind --no-update health --ready
remind login <slt> --org tos

remind login <slt> accepts the short-lived token supplied by IAM directly. remind auth login securely prompts for it. Login does not start an OTP ceremony or redirect a browser. For an agent/noninteractive shell:

remind auth login --org tos --slt-stdin < /secure/path/slt.txt
remind auth whoami
remind config home /secure/remind-state

The SLT must be for tos>remind and bound to the desired organization. A successful login verifies the organization before saving the new session. Near expiry, a normal authenticated command rotates the saved refresh token before proceeding. auth refresh requests an explicit rotation; auth logout revokes the IAM family and then removes local credentials.

IAM discovery and login status#

remind --help
remind iam --json
remind login status --json
remind --test <test_id> login status --json

iam requires no saved session. It reads the selected backend's public IAM configuration and returns app_id, iam_url, and iam_environment_id (null in production). Use this app ID when obtaining an SLT from IAM. App secrets and test keys are never printed. With --test, a saved environment key is required and metadata describes the linked IAM sandbox; its IAM app secret must be configured.

login status checks the session for the selected server and environment against the live /auth/me endpoint, refreshing near-expiry tokens first. A successful check returns authenticated: true alongside actor_type (carbon or silicon), principal_id, public_id, org_id, membership_id, org_role, authorization_epoch, and can_manage_reminders. It never prints access or refresh tokens. For example:

{"authenticated":true,"principal_id":"01992000-0000-7000-8000-000000000001","actor_type":"silicon","public_id":"assistant:tos","org_id":"tos","membership_id":"01992000-0000-7000-8000-000000000002","org_role":"member","authorization_epoch":1,"can_manage_reminders":true}

No saved session or an HTTP 401 from verification/refresh returns {"authenticated":false} with exit status 0. A permission denial, unavailable server, or malformed response remains an error with a nonzero exit status; it is not reported as a successful authentication check. --org selects the organization to verify. auth whoami remains available with its existing identity/error output.

Home directory selection#

SILICON_HOME replaces HOME as the default state parent when present. Remind reads the optional .remind/home pointer from that default parent; an explicit config home setting stored there takes precedence. Without a pointer, state is stored directly in <SILICON_HOME>/.remind/ or ~/.remind/. An empty SILICON_HOME is an error. A missing default directory is created as needed.

SILICON_HOME=/private/silicon remind --no-update config show --json
SILICON_HOME=/private/silicon remind config home /existing/remind-state

config home requires an existing directory and saves its absolute path in the selected default parent's .remind/home. The next invocation uses the new location. It does not move existing sessions or keys. Unsetting SILICON_HOME selects the normal home and its own pointer again. The Rust client remains stateless and does not read or create these CLI state files.

Ordinary reminder workflow#

remind webhook subscribe 'https://example.com/reminders'
remind create --text 'Review the build' --cron '*/15 * * * *'
remind list
remind get <reminder-id>
remind edit <reminder-id> --text 'Review the release build'
remind pause <reminder-id>
remind resume <reminder-id>
remind executions <reminder-id>
remind archive <reminder-id>
remind list --archived

Use any absolute HTTP(S) URL. webhook subscribe prompts securely for an optional signing secret; use --secret-stdin to supply a protected file through stdin, or --unsigned when the receiver does not require signatures. webhook get never reveals the secret.

Subscriptions are optional and can be managed independently with webhook subscribe, webhook list, and webhook unsubscribe. A reminder may be created before any receiver is configured.

For a one-time reminder, add --kind one-time. It fires at the first future cron match and enters the archive automatically. For a local wall-clock schedule, use --timezone Asia/Kolkata or another IANA identifier. UTC is the default.

pause and resume accept up to 100 UUIDs and are atomic. A Carbon cannot create or mutate reminders; it can use silicons, list, get, and executions for any Silicon in its organization. Archiving retains a reminder for 45 days.

Command reference#

Command Purpose / useful options
auth login Secure SLT prompt; --org, --slt-stdin
login <slt> Direct IAM SLT login; --org may select the organization
iam Public app_id, IAM URL and linked IAM environment; no login needed
login status Live authentication result and Carbon/Silicon identity; supports --json
auth whoami Live IAM identity and permissions
auth refresh Rotate current refresh token
auth logout Revoke and forget this session
create Required --text, --cron; --kind, --timezone
list --silicon, --archived, --status, --cursor, --limit
get <id> Full reminder details
edit <id> At least one of --text, --cron, --timezone, --kind
pause <id>… Atomic pause of 1–100 owned reminders
resume <id>… Atomic resume of 1–100 owned reminders
archive <id> Move an owned reminder to the archive
executions <id> --cursor, --limit; inspect deliveries/failures
silicons --after <uuid>, --limit; registered org Silicons
webhook subscribe <url> Secure secret prompt, --secret-stdin, or --unsigned
webhook get Read endpoint metadata
webhook disable Disable the current Silicon's endpoint
webhook subscribe <url> Add another webhook subscription
webhook list List all active subscriptions
webhook unsubscribe <id> Disable one subscription
config home <directory> Set the local state parent directory; it must already exist
env create <name> --description, --iam-key-file, --iam-app-secret-file
env list --include-deleted, --after <uuid>, --limit
env get <id> Environment metadata and deadlines
env key <id> Retrieve, print and locally save the active key
env rotate <id> Replace the root key and save its successor
env delete <id> Retire; recoverable for 30 days
env restore <id> Restore with a new root key
env import <id> Save a shared key; prompt or --key-stdin
env forget <id> Remove this computer's key/session only
test-info Selected sandbox metadata; requires --test
clean Clear selected sandbox data; requires --test
config show Preferences and counts; no saved secrets
config set-url <origin> Change the saved service origin
config auto-update on|off Persist updater preference
update --check Query the registry without installation
update Explicitly install a newer published CLI
health Liveness; --ready checks database readiness

Every command accepts -h/--help. Missing required flags produce the relevant usage. Global flags are --url, --org, --test <id>, --json, --no-update, and --idempotency-key. REMIND_URL and REMIND_ORG supply URL/org defaults for an invocation. They do not move existing sessions between contexts.

--json emits machine-readable JSON and suppresses success suggestions. Errors go to stderr. Exit status is 0 for success, 2 for CLI/local input failures, 3 for API authentication failure, 4 for API forbidden, and 1 for other failures. Use the API's machine error code in the error text to distinguish state conflicts.

Sandboxes#

Manage environments with the production session, without --test:

remind env create release-qa --description 'Manual release verification' \
  --iam-key-file /secure/path/iam-test-key \
  --iam-app-secret-file /secure/path/iam-test-app-secret

The returned UUID is your selector; the root key is saved locally. Use ordinary commands with the prefix:

remind --test <id> test-info
remind --test <id> auth login --org test-org
remind --test <id> webhook set <test-hook-endpoint>
remind --test <id> create --text 'Sandbox reminder' --cron '* * * * *'
remind --test <id> list
remind --test <id> clean

A teammate can share the root key: remind env import <id> --key-stdin < key.txt. Import verifies that the key belongs to the requested UUID before saving it. The environment key provides sandbox administration; ordinary reminder commands still need an IAM test identity. Cleaning clears all Remind data and logs but keeps the environment, root key and IAM binding. It does not clean IAM itself.

Legacy manually paired sandboxes support at most 100 retained reminders. It is retired after 15 days without successful user activity; scheduler polls do not keep it alive. Deleted environments can be recovered for 30 days. See the full guide.

Updating#

Run remind daemon install once (the installer does this automatically). The macOS launchd or Linux systemd user service starts at sign-in, checks hourly even when no CLI command runs, and installs newer stable registry versions into the same Cargo installation root. Failed checks are throttled and do not change sessions. The daemon releases the state lock while downloading/building; foreground commands remain usable. It restarts after an update to run the new binary.

Use remind daemon status, remind daemon uninstall, or remind daemon run for foreground supervision. remind config auto-update off disables automatic updates; on reenables them. remind update --check and remind update are explicit actions. --no-update is retained for older scripts; normal commands no longer trigger maintenance. Cargo must remain available in the service PATH. A copied/source-built binary reports an available update instead of replacing an unrelated executable.

Sandbox selection, manuals, and reports#

Use remind env use --secret-stdin < /private/app-secret to select the IAM application's sandbox without a root key or environment UUID. Sign in with a test SLT or an existing active test public identity. remind env exit restores the production session; --production overrides selection for one command. Selected test name/ID always appears on stderr, including failures and help. Legacy administrative commands below apply only to manually paired environments; IAM-discovered worlds follow IAM's lifecycle and have no 100-reminder quota.

Read bundled manuals with remind docs cli|api|client|testing|webhooks. remind report 'reproduction details' --pr https://github.com/teamofsilicons/silicon-remind/pull/123 queues a bug report email through the public Rust client and backend using your Remind session. --pr is optional; output contains the report ID and delivery status. Run remind report-status <id> to inspect delivery. Reports in a sandbox are simulated. Production delivery uses Postmark. Include expected and actual behavior, versions, and a request ID when available; exclude secrets.

env create needs only a name and IAM root key; --iam-app-secret-file is optional. To install the test app secret later, use remind --test <id> configure-iam --iam-app-secret-file /private/test-app-secret. Ordinary actions fail with an explicit configuration error until this is done.

Refresh retries persist their operation key before contacting IAM. After an uncertain response, run the command again using this same local store; it safely replays the pending refresh. Do not copy a rotating session family between machines.

Runtime --json failures return error.code and error.message. Backend errors also retain HTTP status, request_id and optional retry_after; local argument validation uses invalid_input. Clap usage/help errors retain its standard CLI help format. Credentials and response bodies are not included in errors.

Telemetry#

Operational telemetry is on by default. remind config telemetry off disables both CLI/daemon events and API request observations for this installation; on enables them. REMIND_TELEMETRY_ENABLED=false also disables them. No command arguments, credentials, reminder text or webhook URLs are included. Test events remain in the selected sandbox. See diagnostics.