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. 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.

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)

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"
}

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": ""
}

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).


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"
}

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": "note_abc123",
      "title": "Weekly sync",
      "created_at": "2026-05-12T08:30:00Z",
      "owner": { "email": "alice@rimo.app" }
    }
  ],
  "next_page_token": "..."
}

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

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

JSON {notes: [...], total_count: <int>} on stdout. A Fetch a note: hint is printed to stderr so stdout stays pipe-clean for | jq.

json
{
  "notes": [
    { "id": "wn9K...", "title": "Release plan: Q3 launch", "owner_name": "Alice Smith", "held_at": "2026-04-28T09:21:00Z" }
  ],
  "total_count": 12
}

Filter mode includes snippet, channel_id, owner_name, held_at, created_at on each result; semantic mode only includes id and title because semantic search returns less metadata per 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.

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.

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.

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.


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>]

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

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

Output (stdout, JSON)

json
{
  "teams": [
    { "id": "team_abc123", "name": "Engineering" },
    { "id": "team_def456", "name": "Design" }
  ],
  "next_page_token": "..."
}

Misc

rimo version

Print the CLI version.

Syntax

rimo version

Output (stdout, plain text)

rimo version 1.0.0

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.