remind CLI#
remind is the command line for Silicon Remind, built only on the public
silicon-remind-client crate. It signs you in with Silicon Accounts, keeps
that sign-in fresh, and gives every Remind action a command. Every command has --help with its
flags and examples, and remind --help shows the whole tree.
Install#
Silicon Apps installs Remind and keeps it up to date; remind never updates itself.
silicon-apps install remind # production
silicon-apps install 'remind>dev' # development releases
remind --help
From source (Rust 1.98 or newer): cargo install silicon-remind-cli, or
cargo run -p silicon-remind-cli -- --help in a checkout.
Sign in#
remind login # Carbon: approve a code
silicon-accounts login --app remind -q | remind login --slt-stdin # Silicon: a short-lived token
remind login status --json
remind logout
A Carbon's remind login prints a code and a link; approve the code on the account site from any
device and remind finishes on its own (the code expires after 10 minutes). A Silicon never sees
a page: it mints a short-lived token for Remind (single use, two minutes) and hands it over.
remind login <slt>, with the token as the only argument, does the same as --slt-stdin. Every
refusal says why and what to do. Signing in and who sees what covers sign-in in
depth: refusal codes, refresh, login status fields.
remind accounts --json # no sign-in, no network
{"app_id":"remind","client_id":"remind","accounts_url":"https://accounts.teamofsilicons.com",
"api_url":"https://api.remind.teamofsilicons.com","version":"0.6.0","api_version":2,
"sign_in":{"carbon":"remind login","silicon":"silicon-accounts login --app remind -q | remind login --slt-stdin",
"status":"remind login status --json"},"docs_url":"https://docs.remind.teamofsilicons.com"}
remind login status --json always exits 0 and prints {"authenticated":false} when nobody is
signed in; signed in, it prints uuid, id, kind, display_name, expires_at,
refresh_expires_at and verified (Remind accepted the token just now), among others.
Where state lives#
remind keeps its settings, sign-ins and test environment keys in {home}/.remind/:
{home} is $SILICON_HOME when set (an empty value is an error), otherwise ~.
SILICON_HOME=/srv/silicons/scout remind login status --json
remind config home /srv/remind-state # an existing directory; later commands use it
remind config show
config home writes a pointer in the default home's .remind/home; it does not move existing
sign-ins or keys. On Unix the directory is mode 0700 and its files 0600. state.json is
replaced atomically, and an exclusive lock on state.lock is held only while state changes or
a sign-in is refreshed, never while waiting for a Carbon to approve a code. Reading never
creates anything: --help, accounts and login status leave a clean home untouched.
One sign-in is kept per Remind origin, and one per test environment when you sign in with
--test. The access token is refreshed when less than a minute is left, single-flight across
processes, and a request Remind refuses with 401 is retried once after a refresh. A state file
from Remind 0.5 or earlier is read without its sign-ins (sign in again) and archived as
state.legacy-<time>.json on the next change; an unreadable state.json is moved aside as
state.corrupt-<time>.json.
Reminders#
A Silicon creates and changes its own reminders:
remind webhook subscribe https://hook.example/remind --secret-stdin < secret.txt
remind create --text 'Review the build' --cron '*/15 * * * *' --timezone Asia/Kolkata
remind create --text 'Release call' --cron '30 16 10 10 *' --kind one-time --timezone UTC
remind list
remind get <reminder_id>
remind edit <reminder_id> --text 'Review the release build'
remind pause <reminder_id> <reminder_id>
remind resume <reminder_id> <reminder_id>
remind executions <reminder_id>
remind archive <reminder_id>
remind list --archived
- Cron has five fields: minute, hour, day of month, month, day of week.
--timezoneis mandatory oncreateand takes an IANA identifier (Asia/Kolkata,UTC); a missing, blank or unknown timezone is refused with what to type instead.editkeeps the stored timezone unless you pass one.- A one-time reminder fires at the first future match, then moves to the archive.
pauseandresumetake 1 to 100 ids and apply all or nothing.- Archived and fired one-time reminders stay readable for 45 days (
list --archived), then go to the deleted-reminders log. - Reminders work without any webhook subscription; they just are not delivered anywhere. See webhook delivery.
Carbons read. A custodian sees the reminders of every Silicon it looks after:
remind silicons # the Silicons you can read, with relation and count
remind list --silicon si:scout
remind executions <reminder_id>
remind webhook list --silicon si:scout # read-only
list --silicon takes a si: id or uuid. Pass next_cursor from one page to --cursor (or
--after for silicons and env list) for the next.
Sharing#
remind share add c:ada # as the Silicon
remind share add si:ledger --silicon si:scout # as si:scout's custodian
remind share list
remind share remove c:ada
remind allow add si:scout # as si:ledger: let si:scout share with me
remind allow list
remind allow remove si:scout
A Silicon's reminders are visible to it, its custodian and its custodian's other Silicons.
Anyone else needs a share. Any Carbon can be granted; a Silicon outside your custodian's
Silicons must first allow you with remind allow add. Removing an allow-list entry also ends
the shares it made possible. See who sees what.
Webhooks#
remind webhook subscribe https://hook.example/remind # asks for an optional signing secret
remind webhook subscribe https://hook.example/remind --secret-stdin < secret.txt
remind webhook subscribe https://hook.example/remind --unsigned
remind webhook list
remind webhook get
remind webhook unsubscribe <subscription_id>
remind webhook disable # ends every subscription
A Silicon may have no subscription, one, or several; each due reminder is posted to every one.
The signing secret is never shown again. Without a terminal, subscribe needs --secret-stdin
or --unsigned.
Test environments#
A test environment is an isolated copy of Remind: create one, then add --test <id> to any
command. Inside it you are still the account you signed in as; only the data is separate.
remind env create release-qa --description 'Manual release checks' # its key is saved here
remind --test <test_id> create --text 'Try it' --cron '* * * * *' --timezone UTC
remind --test <test_id> list
remind --test <test_id> test-info
remind --test <test_id> clean # erase its data; the environment and key stay
remind env use <test_id> # every later command runs there…
remind --production list # …except with --production
remind env exit # back to production
Manage environments from production (no --test): env list, env get, env key (prints the
key and saves it here), env rotate, env delete (recoverable for 30 days), env restore.
Someone who received a key saves it with remind env import <test_id> --key-stdin < key.txt
(checked before saving, no sign-in needed); env forget removes a key and that environment's
own sign-in from this machine only. A test environment holds at most 100 reminders and retires
after 15 days without activity. While one is selected, every command ends with a line on stderr
naming it. The testing guide has the details.
Settings#
| setting | flag | environment | saved with |
|---|---|---|---|
| Remind API origin | --url |
REMIND_URL |
remind config set-url <url> |
| Silicon Accounts origin | --accounts-url |
ACCOUNTS_URL |
remind config set-accounts-url <url> |
| home | SILICON_HOME |
remind config home <directory> |
|
| telemetry | REMIND_TELEMETRY_ENABLED=false |
remind config telemetry on|off |
|
| app id (development only) | REMIND_APP_ID |
The defaults are https://api.remind.teamofsilicons.com and
https://accounts.teamofsilicons.com. Origins must be https; plain http is accepted only for
this machine (localhost, 127.0.0.1, ::1), for local development:
remind config set-url http://127.0.0.1:4181
remind config set-accounts-url http://localhost:9590
remind health --ready
A sign-in keeps the Silicon Accounts origin that issued it: refresh and sign-out go there even
if you change ACCOUNTS_URL later.
Output, errors and exit status#
With --json, every result is one JSON object on stdout; progress and warnings go to stderr as
JSON lines, and suggestions are left out. Without it, results are pretty-printed and suggested
next steps follow on stderr.
Failures go to stderr. With --json they look like this; hint, status, request_id and
retry_after appear when known:
{"error":{"code":"not_reminder_owner","message":"Only si:scout changes this reminder.","hint":"…","status":403,"request_id":"…"}}
| exit | meaning |
|---|---|
| 0 | success (and login status --json, signed in or not) |
| 1 | any other failure: network, conflicts, not found, server errors |
| 2 | invalid arguments or input, refused before anything was sent |
| 3 | not signed in, sign-in refused or ended, or HTTP 401 |
| 4 | signed in but not allowed (HTTP 403) |
| 130 | stopped with Ctrl-C while waiting for a code to be approved |
Reuse --idempotency-key <key> when retrying the exact same create, edit, pause,
resume or report after an uncertain failure, so it is applied once.
Manuals and reports#
remind docs # this guide; also: accounts, api, client, testing, webhooks, releases
remind report 'Steps, expected result, actual result' --pr https://github.com/teamofsilicons/silicon-remind/pull/123
remind report-status <report_id>
report emails the Remind team using your sign-in (--pr is optional); inside a test
environment it is simulated. Never include secrets.
Telemetry#
Operational telemetry is on by default: after a command that used your sign-in, remind sends
one command_completed event (success, duration) through Remind to Space Station. It never
includes arguments, credentials, reminder text or webhook URLs. remind config telemetry off
or REMIND_TELEMETRY_ENABLED=false turns it off, for API request observations too. Events
inside a test environment stay in that environment. See diagnostics.
Command reference#
| command | what it does |
|---|---|
accounts |
Remind's app id and Silicon Accounts origin; offline, no sign-in |
login |
Carbon device sign-in; --open, --label, --force |
login --slt-stdin, login --slt <t>, login <t> |
Silicon sign-in with a short-lived token |
login status |
who is signed in; --offline; with --json always exits 0 |
logout |
end this machine's sign-in |
whoami |
the account as Remind sees it |
create |
--text, --cron, --timezone (all required), --kind recurring|one-time |
list |
--silicon, --archived, --status active|paused|completed, --cursor, --limit |
get <id> |
one reminder |
edit <id> |
at least one of --text, --cron, --timezone, --kind |
pause <id>…, resume <id>… |
1 to 100 reminders, all or nothing |
archive <id> |
archive one of your reminders |
executions <id> |
delivery history; --cursor, --limit |
silicons |
the Silicons you can read; --after, --limit |
share add|list|remove |
share a Silicon's reminders; --silicon for custodians |
allow add|list|remove |
who may share with a Silicon; --silicon for custodians |
webhook subscribe|list|get|unsubscribe|disable |
delivery subscriptions |
env create|list|get|key|rotate|delete|restore |
manage test environments (from production) |
env import|forget|use|exit |
keys and selection on this machine |
test-info, clean |
inside a test environment only |
docs [topic] |
offline manuals |
report <message>, report-status <id> |
bug reports |
config show|set-url|set-accounts-url|home|telemetry |
local settings |
health |
API liveness; --ready checks its database |
Global flags: --url, --accounts-url, --test <id>, --production, --json,
--idempotency-key, -h/--help, -V/--version.