Skip to content

Commands ​

Complete reference for every rimo command. For installation see Installation; for the output contract and error format see Output & errors.

Output contract. All commands print JSON to stdout by default; add --pretty for a human-readable table. A few human-facing commands print plain text on success (errors are always JSON): rimo version, rimo upgrade, rimo note ask, and rimo note get with --transcript / --document / --full / --meeting-chat / --document-id.

The examples below show the shape of each response. For every field with its type, description, and whether it is always present, see the Response reference.

Global flags (apply to every command):

FlagDescription
--accountAccount alias to use (overrides active_account in config)
--fieldsFields to include: "" (all), "compact", or "f1,f2"
--excludesComma-separated fields to exclude from output
--dry-runSimulate the command without side effects (writes only)
--prettyHuman-readable tables instead of JSON — see Output & errors

Authentication ​

rimo auth login ​

Authenticate with Rimo through a browser-based login.

Syntax

rimo auth login

(also available as the top-level rimo login.)

Flow

By default, rimo auth login opens your browser:

  1. Opens your default browser to authorize this CLI.
  2. Waits for you to sign in if needed and approve the request.
  3. Stores the access + refresh tokens securely using your OS credential store.
  4. Registers an alias in ~/.config/rimo/config.yaml and sets it active.

--no-browser flow

For machines without a usable browser:

  1. Prints a URL to stderr.
  2. Open the URL on any other device, sign in if needed and approve; the page shows a short code.
  3. Paste the code back into the terminal at the prompt.
  4. Stores tokens and registers the alias as above.

Flags

FlagDescription
--no-browserPrint a URL to open on another device, then paste the displayed code back into the terminal.

Alias generation. Auto-generated from the email and org name:

EmailOrg nameGenerated alias
alice@rimo.app(empty)alice-rimo-personal
alice@rimo.app"Client A"alice-rimo-client-a
bob@gmail.com"Acme Co"bob-gmail-acme-co

Re-logging in to the same (user_id, org_id) keeps the original alias and refreshes the metadata.

Output (stdout, JSON)

json
{
  "status": "logged_in",
  "alias": "alice-rimo-personal",
  "email": "alice@rimo.app",
  "name": "Alice",
  "org": "Personal"
}

Field reference: Login and switch result.


rimo auth logout ​

Revoke the token and remove the account from config + credential store.

Syntax

rimo auth logout [--account <alias|email|org>]

If --account is omitted, the active account is logged out. When no active account is configured, the command lists saved accounts and asks you to specify one with --account.

Behavior

  1. Resolves the input to an exact alias (alias, then email, then org name).
  2. Calls the revoke endpoint (best-effort — failures are logged to stderr but do not abort).
  3. Deletes the token from your OS credential store.
  4. Removes the account from config.yaml. If it was active, the active account is cleared (no auto-promotion).

Output (stdout, JSON)

json
{
  "status": "logged_out",
  "alias": "alice-rimo-personal",
  "active_account": ""
}

Field reference: Logout result.


rimo auth status ​

List all saved accounts and their token status.

Syntax

rimo auth status

Output (stdout, JSON)

json
{
  "active_account": "alice-rimo-personal",
  "accounts": [
    {
      "alias": "alice-rimo-personal",
      "email": "alice@rimo.app",
      "name": "Alice",
      "org": "Personal",
      "active": true,
      "token_status": "valid"
    }
  ]
}

token_status values: valid, expiring_soon, expired, unknown (token expiry could not be determined).

When RIMO_API_KEY or RIMO_TOKEN is set, the response also carries active_credential (and api_key_hint for an API key) to show that the environment variable — not active_account — is what authenticates requests.

Field reference: Auth status.


rimo auth switch ​

Switch the active account.

Syntax

rimo auth switch <alias|email|org-name> [--org <org-name>]

Also available as rimo auth use.

Resolution order

  1. Exact alias match.
  2. email match — errors if the email maps to multiple orgs and --org is not given.
  3. org-name match — orgs belonging to the currently active email are preferred.

Flags

FlagDescription
--orgOrg name to disambiguate when an email is registered under multiple orgs.

Examples

bash
rimo auth switch alice-rimo-personal                       # exact alias
rimo auth switch alice@rimo.app                            # by email (errors if multiple orgs)
rimo auth switch "Client A"                                # by org name
rimo auth switch alice@rimo.app --org "Client B"           # email + org disambiguation

Output (stdout, JSON)

json
{
  "status": "switched",
  "alias": "alice-rimo-client-a",
  "email": "alice@rimo.app",
  "name": "Alice",
  "org": "Client A"
}

Field reference: Login and switch result.


Notes ​

What the note commands return depends on your access:

  • rimo note list (default) returns only notes you own.
  • rimo note list --attended returns notes you participated in.
  • rimo note list --team <id> returns a team's notes across all its members (you must be a member of that team). Get team IDs with rimo team list.
  • Notes shared with you by URL only (not via ownership or participation) do not appear in any list, but you can still fetch one directly with rimo note get <id> if you have the ID.
  • rimo note get on a note you cannot access returns a not-found error rather than revealing that the note exists.

rimo note create and rimo note append write: they need a token with the notes:write scope (and, for append, edit access to the note). Every other note command is read-only.

rimo note list ​

List notes.

Syntax

rimo note list [--attended] [--team <id>] [--today] [--week]
               [--since <date>] [--until <date>] [--updated-since <date>]
               [--page-size <int>] [--page-token <string>]

Default mode. Lists notes created by the authenticated user.

--attended mode. Lists notes the authenticated user participated in.

--team mode. Lists a team's notes across all its members. You must be a member of the team; otherwise the request is rejected. --attended cannot be combined with --team or the date filters.

--since / --until filter by meeting time — a note's held_at, or its creation time if it has none. --updated-since filters by when a note was last updated, so you can fetch only what changed since your last run. Dates accept YYYY-MM-DD (read as JST) or an RFC3339 timestamp. --until is exclusive: a note held on the --until date itself is not returned.

--today and --week are shortcuts for the two most common held_at ranges: --today lists notes held today, --week those held in the trailing 7 days (today plus the previous six). Both are evaluated in JST and are exactly equivalent to setting --since/--until by hand, so they cannot be combined with either (or with each other, or with --attended).

All modes are paginated via --page-size and --page-token.

Flags

FlagTypeDefaultDescription
--attendedboolfalseList notes you participated in
--teamstring""List a team's notes across its members (team ID from rimo team list)
--todayboolfalseShortcut for notes held today (JST); conflicts with --since/--until
--weekboolfalseShortcut for notes held in the trailing 7 days (JST); conflicts with --since/--until
--sincestring""Only notes held on or after this date (YYYY-MM-DD or RFC3339)
--untilstring""Only notes held before this date (YYYY-MM-DD or RFC3339)
--updated-sincestring""Only notes updated on or after this date (YYYY-MM-DD or RFC3339)
--page-sizeint0Page size (0 lets the server pick the default)
--page-tokenstring""Cursor from a previous call's next_page_token

Examples

bash
rimo note list
rimo note list --fields id,title,created_at
rimo note list --page-size 50
rimo note list --attended --page-size 50
rimo note list --attended --page-size 50 --page-token "eyJpZCI6..."
rimo note list --today
rimo note list --week
rimo note list --team J9yyjDQLJWqhiSTH0sAT --since 2026-06-01 --until 2026-07-01
rimo note list --team J9yyjDQLJWqhiSTH0sAT --updated-since 2026-06-08

Output (stdout, JSON)

json
{
  "notes": [
    {
      "id": "ZJ7Rk5pSFXgBj2l4iQBV",
      "title": "Weekly sync",
      "state": "ASR_DONE",
      "duration": 584140,
      "locale": "ja-JP",
      "media_type": "audio",
      "held_at": "2026-05-12T09:00:00+09:00",
      "team_id": "J9yyjDQLJWqhiSTH0sAT",
      "share_mode": "nothing",
      "created_at": "2026-05-12T08:30:00+09:00",
      "updated_at": "2026-05-12T10:02:11+09:00"
    }
  ],
  "next_page_token": "eyJpZCI6..."
}

Metadata only — note list never returns the transcript, the document markdown, the tags, or the participants. Use rimo note get with a content flag for those. Field reference: Note.


rimo note get ​

Get a single note. By default, only metadata is output as JSON. Additional flags let you retrieve the transcript or document content.

Syntax

rimo note get <note_id> [flags]

Flags

FlagDescription
--transcriptPrint the transcript as plain text in Speaker: content form.
--documentPrint the primary document as markdown plain text.
--fullPrint transcript followed by the primary document.
--meeting-chatPrint the web meeting chat (Zoom/Meet) as plain text in [HH:MM] sender: text form.
--list-documentsList documents attached to the note (JSON).
--document-id <id>Print a specific document's markdown by ID.
--timestampsWith --transcript or --full, prefix each transcript line with [HH:MM:SS].

Notes

  • --list-documents / --document-id cannot be combined with --transcript / --document / --full.
  • --list-documents and --document-id are mutually exclusive.
  • --meeting-chat is its own output and cannot be combined with --transcript / --document / --full / --list-documents / --document-id.
  • --timestamps requires --transcript or --full; any other combination is rejected. Without it, transcript output is unchanged.
  • --timestamps shows time elapsed from the start of the recording, so [00:00:11] is 11 seconds in. This differs from --meeting-chat, whose [HH:MM] is the message's wall-clock time.
  • The content flags (--transcript, --document, --full, --meeting-chat, --document-id) print plain text to stdout, not JSON.

Examples

bash
rimo note get note_abc123                          # metadata JSON
rimo note get note_abc123 --transcript             # plain-text transcript
rimo note get note_abc123 --transcript --timestamps # transcript with [HH:MM:SS]
rimo note get note_abc123 --document               # primary document markdown
rimo note get note_abc123 --full                    # transcript + document
rimo note get note_abc123 --meeting-chat           # plain-text Zoom/Meet chat
rimo note get note_abc123 --list-documents         # JSON list of documents
rimo note get note_abc123 --document-id doc_xyz    # specific document markdown
rimo note get note_abc123 --fields id,title        # filter the JSON metadata

Output — default (stdout, JSON)

The note's metadata, wrapped in a note envelope.

json
{
  "note": {
    "id": "ZJ7Rk5pSFXgBj2l4iQBV",
    "title": "Weekly sync",
    "state": "ASR_DONE",
    "duration": 584140,
    "locale": "ja-JP",
    "media_type": "audio",
    "held_at": "2026-05-12T09:00:00+09:00",
    "team_id": "J9yyjDQLJWqhiSTH0sAT",
    "share_mode": "nothing",
    "created_at": "2026-05-12T08:30:00+09:00",
    "updated_at": "2026-05-12T10:02:11+09:00"
  }
}

Field reference: Note.

Output — --list-documents (stdout, JSON)

json
{
  "documents": [
    {
      "id": "v9HNqz6bntLRm9BBaBEM",
      "note_id": "ZJ7Rk5pSFXgBj2l4iQBV",
      "title": "Weekly sync",
      "primary": true,
      "locale": "ja-JP",
      "category": "agenda",
      "template_mode": "minutes",
      "export_markdown": "## Decisions\n\n- ...",
      "created_at": "2026-05-12T08:30:00+09:00",
      "updated_at": "2026-05-12T10:02:11+09:00"
    }
  ]
}

Every document's full export_markdown is included, so the response grows with the note's content. Add --excludes export_markdown when you only need the IDs and titles. Field reference: Document.

Output — content flags (stdout, plain text)

These flags print text, not JSON — see Note content for the exact form of each.

Errors

See Output & errors for the error JSON shape and exit code.


Find notes by semantic similarity (default), or by keyword and attribute filter. Returns JSON in the same {notes, total_count} shape as rimo note list. Use rimo note ask when you want a synthesised answer instead of a list.

Syntax

rimo note search [query] [--mode=semantic|filter] [flags]

In --mode=filter the query is optional: omit it to browse by filters alone (team, date range, participant, tag), newest first.

Flags

FlagDescription
--modesemantic (default) ranks notes by meaning; filter does keyword and/or attribute search with pagination.
--limitMax results for --mode=semantic.
--pagePage number for --mode=filter (1-based, default 1).
--perPage size for --mode=filter (default 10, max 100).
--content-typeLimit --mode=filter to one of: all transcripts headings annotations title document.
--team--mode=filter only: restrict to one or more teams. Repeatable or comma-separated; team IDs come from rimo team list.
--participant--mode=filter only: restrict to notes with these participant user IDs. Repeatable or comma-separated.
--note-tag--mode=filter only: restrict to notes with these tag IDs. Repeatable or comma-separated.
--since--mode=filter only: only notes held on or after this date. YYYY-MM-DD (interpreted as JST) or an RFC3339 timestamp.
--until--mode=filter only: only notes held before this date. Same formats as --since.

Output (stdout, JSON)

JSON {notes: [...], total_count: <int>} on stdout. A Fetch a note: hint — and, in filter mode, a page footer and a copy-pasteable next-page command — is printed to stderr so stdout stays pipe-clean for | jq.

json
{
  "notes": [
    {
      "id": "wn9K36p46RKJKaktjDvA",
      "title": "Release plan: Q3 launch",
      "owner_name": "Alice Smith",
      "held_at": "2026-04-28T09:21:00Z",
      "created_at": "2026-04-28T09:21:00Z",
      "snippet": {
        "transcripts": ["... the <em>release plan</em> for Q3 ..."],
        "headings": [],
        "annotations": [],
        "document_markdowns": []
      }
    }
  ],
  "total_count": 12
}

A search hit is not a full note: it carries id plus whatever the search index returned. Both modes return title, held_at, and created_at when available; only --mode=filter adds owner_name and snippet. In --mode=filter, total_count counts the whole result set rather than the current page; in --mode=semantic it is the number of notes returned. Field reference: Search result.

Examples

bash
rimo note search "release plan"                                # semantic (default)
rimo note search "release plan" --limit 5
rimo note search "release" --mode=filter --per 5 --content-type transcripts
rimo note search "release" --mode=filter --team T_abc123        # keyword, scoped to a team
rimo note search --mode=filter --team T_abc --since 2026-04-01  # filter-only browse (no query)
rimo note search --mode=filter --since 2026-04-01 --until 2026-07-01
rimo note search "release" --mode=filter | jq '.notes[].id'

Errors

See Output & errors for the error JSON shape and exit code.


rimo note ask ​

Ask a natural-language question and get an AI-synthesised answer drawn from your notes. This is the only command that generates an AI answer.

Syntax

rimo note ask <question>

No flags. The model is fixed server-side.

Output (plain text, streamed)

The release is planned for Q3, with grandfathered pricing for existing
annual contracts until renewal.

Sources:
  - wn9K36p46RKJKaktjDvA  Pricing sync 2026-04-28
  - 3K72YiEy2dEius6xpTHy  Q3 planning offsite

Fetch a note:
  rimo note get wn9K36p46RKJKaktjDvA --document      # markdown
  rimo note get wn9K36p46RKJKaktjDvA --transcript    # speaker: text
  rimo note get wn9K36p46RKJKaktjDvA                 # metadata JSON

The answer streams as the model generates it. The Sources: block is the canonical citation surface. All three blocks go to stdout — see Ask answer.

When to use which

  • rimo note search — when you'd open the returned notes and read them yourself.
  • rimo note ask — when you'd open them to extract a single answer.

Examples

bash
rimo note ask "what did we decide about Q3 pricing?"
rimo note ask "今週の議事録を要約して"

Errors

See Output & errors for the error JSON shape and exit code.


rimo note create ​

Create a note with no recording attached. A primary document is created alongside it for editing, optionally seeded with markdown.

Requires a token with the notes:write scope.

Syntax

rimo note create [markdown] [flags]

Pass the initial markdown as the positional argument, or via --markdown-file (- reads stdin) — not both. Omit it entirely to create an empty note. For multi-line markdown inline, use bash/zsh $'…' quoting (\n = newline); for anything longer, prefer --markdown-file.

Flags

FlagTypeDefaultDescription
--titlestringautoNote title (defaults to an auto-generated timestamp title)
--teamstring""Create the note under this team (ID from rimo team list); defaults to a personal note
--localestringyour settingNote locale, e.g. ja-JP
--markdown-filestring""Read the initial markdown from a file (- for stdin)

Examples

bash
rimo note create                                            # empty, auto-titled note
rimo note create --title "Blog draft"
rimo note create --title "Blog draft" $'# Intro\nNotes go here.'   # multi-line markdown
rimo note create --markdown-file draft.md --team team_abc123
cat draft.md | rimo note create --markdown-file - --title "Blog draft"
rimo note create --title "Blog draft" --dry-run             # preview, no note created
rimo note create --title "Blog draft" --fields id           # just the new IDs

Output (stdout, JSON)

json
{
  "note": { "id": "note_abc123", "title": "Blog draft", "...": "..." },
  "document": { "id": "doc_xyz789", "primary": true, "...": "..." }
}

Keep both IDs — rimo note append takes the note ID and the document ID.

Field reference: Note and Document. With --dry-run the response is a placeholder example plus "dry_run": true — see Dry-run output.

Errors

400 for a malformed body, an unsupported locale, or a disabled channel; 403 if you are not a member of the given team. See Output & errors for the error JSON shape and exit code.


rimo note append ​

Merge markdown into a note's document as a new section, preserving heading and list structure. Appends to the end by default.

Requires edit access to the note and a token with the notes:write scope.

Syntax

rimo note append <note_id> <document_id> [markdown] [flags]

The markdown is required — pass it as the positional argument or via --markdown-file (- reads stdin), not both. For multi-line markdown inline, use bash/zsh $'…' quoting (\n = newline). Find a note's document IDs with rimo note get <note_id> --list-documents.

Flags

FlagTypeDefaultDescription
--positionstringendInsertion position: end (append) or start (prepend)
--markdown-filestring""Read the markdown from a file (- for stdin)

Examples

bash
rimo note append note_abc123 doc_xyz789 $'## Action items\n- Ship the release notes'
rimo note append note_abc123 doc_xyz789 --markdown-file section.md
rimo note append note_abc123 doc_xyz789 --position start "## Summary"
rimo note ask "what did we decide?" | rimo note append note_abc123 doc_xyz789 -
rimo note append note_abc123 doc_xyz789 "## Notes" --dry-run

Output (stdout, JSON)

json
{
  "document": {
    "id": "doc_xyz789",
    "export_markdown": "# Intro\n\n## Action items\n\n- Ship the release notes",
    "...": "..."
  }
}

export_markdown reflects the document after the merge, so you can confirm what landed. Field reference: Document. With --dry-run the response is a placeholder example plus "dry_run": true, not a preview of your merge — see Dry-run output.

Errors

400 for empty markdown or an invalid --position; 403 without edit access; 404 for an unknown note or document; 409 if the note or document is locked. See Output & errors for the error JSON shape and exit code.

rimo note asset list ​

List the file attachments — uploaded files and images embedded in the body — referenced by a note's documents.

Syntax

rimo note asset list <note_id> [--document-id <document_id>]

By default, lists attachments across every document on the note. Pass --document-id to scope the listing to one document instead. Find a note's document IDs with rimo note get <note_id> --list-documents.

Flags

FlagTypeDefaultDescription
--document-idstring""List assets for this document only, instead of every document on the note

Examples

bash
rimo note asset list note_abc123
rimo note asset list note_abc123 --document-id doc_xyz789
rimo note asset list note_abc123 --fields id,name

Output (stdout, JSON)

json
{
  "assets": [
    {
      "id": "b1f0c2d4-5e6a-47b8-9c0d-1e2f3a4b5c6d",
      "name": "2026Q3_pricing.pptx",
      "mime_type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
      "size_bytes": 4194304,
      "uploaded_at": "2026-08-06T15:04:05Z"
    }
  ]
}

Field reference: Asset.

Errors

403 without access to the note; 404 for an unknown note or document. See Output & errors for the error JSON shape and exit code.

rimo note asset upload ​

Upload a local file and insert it into a note's document as an image or file, in one step: create the asset record, upload the file bytes to the signed URL the backend returns, then attach it.

Requires edit access to the note and the notes:write scope.

Syntax

rimo note asset upload <note_id> <file> [flags]

Omit --document-id to attach to the note's primary document (created if it doesn't exist yet). Pass --document-id to attach to one exact document instead (from rimo note get <note_id> --list-documents) — that document must already exist; there is no fallback to the primary document.

The MIME type is always auto-detected from the file extension — there is no override flag. Supported types: images (.jpg, .jpeg, .png, .webp), PDF (.pdf), and Office documents (.doc, .docx, .xls, .xlsx, .ppt, .pptx). A file with any other extension, or no extension, is rejected before any request is made.

Maximum file size: 10MB for images, 100MB for other files. An oversized file is rejected locally, before any request is made; the backend enforces the same limit as the final authority.

Flags

FlagTypeDefaultDescription
--document-idstring""Attach to this document instead of the note's primary document
--namestringfile's base nameAsset name
--altstring""Alt text for an image (omitted — the backend defaults it to the asset's name)
--widthint0Image width in pixels
--heightint0Image height in pixels
--positionstringendInsertion position: start or end

Examples

bash
rimo note asset upload note_abc123 pricing.pptx
rimo note asset upload note_abc123 diagram.png --document-id doc_xyz789
rimo note asset upload note_abc123 report.pdf --position start
rimo note asset upload note_abc123 photo.jpg --alt "Team photo" --width 1200 --height 800
rimo note asset upload note_abc123 pricing.pptx --dry-run   # preview the create-asset request only

Output (stdout, JSON)

json
{
  "asset": { "id": "b1f0c2d4-5e6a-47b8-9c0d-1e2f3a4b5c6d", "name": "pricing.pptx", "...": "..." },
  "document": { "id": "doc_xyz789", "primary": true, "...": "..." }
}

Field reference: Asset and Document. With --dry-run, only the create-asset step is simulated — the upload and attach steps need a real signed URL and asset ID from a real response, which a client-side simulation can't produce. Response is a placeholder example plus "dry_run": true; see Dry-run output.

Errors

400 for an unsupported file type, an oversized file, or an invalid --position; 403 without edit access, or if file uploads are disabled for your organization; 404 for an unknown note, or a --document-id that doesn't belong to (or isn't accessible on) the note; 409 if the note or document is locked. See Output & errors for the error JSON shape and exit code.


Teams ​

rimo team list ​

List teams in your organization. The returned team IDs can be passed to rimo note list --team <id> to list a team's notes across all its members.

Syntax

rimo team list [--page-size <int>] [--page-token <string>] [--include-organization]

Flags

FlagTypeDefaultDescription
--page-sizeint0Page size (0 lets the server pick the default, currently 20)
--page-tokenstring""Cursor from a previous call's next_page_token
--include-organizationboolfalseAlso return your organization's own folder (see below)

Examples

bash
rimo team list
rimo team list --page-size 5
rimo team list --page-size 5 --page-token "eyJpZCI6..."
rimo team list --fields id,name
rimo team list --include-organization

Output (stdout, JSON)

json
{
  "teams": [
    {
      "id": "04EFtBS4DT4pWnZV7jBU",
      "name": "Engineering",
      "category": "team",
      "is_private_channel": false,
      "member_ids": ["1F9ikNPMAMZXiVNyujFPIDKJujW2", "AZ2zlcmEGKMeD30Fn4tAiuzd3U63"],
      "parent_id": "Dt788f7DnXb6azxNJMcO",
      "created_at": "2023-11-09T04:49:09.50961Z",
      "updated_at": "2024-06-24T01:53:51.906584Z"
    }
  ],
  "next_page_token": "eyJpZCI6..."
}

A team's name is the folder name you see in the Rimo app. Field reference: Team.

Your organization's own folder

Alongside its team folders, an organization has a folder of its own — notes live in it like any other folder, and its id is the organization's id. It is left out by default; --include-organization returns it, with "category": "organization" to tell it apart from a team folder.

It is added to the first page only, so that page carries one row more than --page-size and later pages are unaffected.


Misc ​

rimo version ​

Print the CLI version.

Syntax

rimo version

Output (stdout, plain text)

rimo version 1.0.0

rimo mcp ​

Run the Rimo MCP server on stdio, so an MCP client (Claude Code, Cursor, Claude Desktop, …) can read your notes through tools instead of shell commands.

Syntax

rimo mcp

Output

None — this is a long-running server that speaks the Model Context Protocol on stdin/stdout, not a data command. Do not run it by hand; configure it in your MCP client. See What you can do with MCP and the Rimo in Coding Tools.


rimo upgrade ​

Upgrade the installed binary to the latest release.

rimo upgrade always installs the latest release — there is no flag to pin or downgrade to an older version. The release archive is downloaded over HTTPS and its checksum is verified against the release's checksums.txt before the running binary is replaced; no login is required.

Syntax

rimo upgrade [--check] [--use-sudo]

Flags

FlagDescription
--checkReport whether an update is available; do not download or install.
--use-sudoRetry via sudo install -m 0755 if the install path is not writable. Opt-in.

Output (stdout, plain text)

One of:

Already on the latest version (v1.0.0).
Update available: v1.0.0 → v1.1.0. Run: rimo upgrade
Upgraded rimo from v1.0.0 → v1.1.0.

Progress messages go to stderr, so a script capturing stdout sees only the final status line.

Examples

bash
rimo upgrade --check                   # is there a newer release?
rimo upgrade                           # latest
sudo rimo upgrade --use-sudo           # retry under sudo for root-owned install dirs

Errors

See Output & errors for the error JSON shape and exit code.

Startup update notice

Every invocation runs a non-blocking background version check. If a newer release is available, a single line is written to stderr (never stdout):

rimo: update available v1.0.0 → v1.1.0 (run: rimo upgrade)

The notice is suppressed when the binary is a local dev build, when RIMO_NO_UPDATE_CHECK is set, when CI is set, or for the upgrade, version, and --help invocations. The result is cached for 24 hours.