Skip to content

Notifications

Jimothy turns run events into notifications and fans them out to channels. Every event (except per-step successes) also lands in the in-app inbox.

Event Label in the editor Title example
run.started Run started Run #42 started
run.succeeded Run succeeded Run #42 succeeded (body includes duration and cost)
run.failed Run failed Run #42 failed (body includes the error)
run.cancelled Run cancelled Run #42 cancelled
step.succeeded Step succeeded Implement finished · run #42
step.failed Step failed Implement failed · run #42
approval.required Approval needed Approval needed · run #42 (body: step name and approval message)
trigger.error Trigger errors Trigger "Linear: ENG" failed (body: the error)

The body starts with the issue key and title (or the pipeline name). run.started fires once per run, not again on retries. step.failed fires when a step finally fails (after retries and loops).

Open Notifications → Add channel and pick a type. Every channel has:

Field Notes
Name
URL Not for Desktop. The webhook or topic URL.
Bearer token ntfy and Custom webhook only. Optional.
Events Chips for the eight events. New channels start with Run succeeded, Run failed, Approval needed and Trigger errors.
Pipelines Restrict to some pipelines. None selected = all pipelines. Events not tied to a run (trigger errors) go to every channel that subscribes to them.

Send test (in the editor or the paper-plane button on the list) sends Jimothy test notification through the channel and shows the error if it fails. The toggle on each channel turns it on and off.

URLs and tokens are stored encrypted. Delivery has a 15 second timeout; failed deliveries are dropped silently (use Send test to debug).

Native OS notifications. A Desktop notifications channel exists by default (Run succeeded, Run failed, Approval needed, Trigger errors). Clicking a notification brings Jimothy to the front and opens the run. Informational notifications (like Run started) are silent.

  1. Create a Slack app (or use an existing one), enable Incoming Webhooks, and add a webhook to a channel.
  2. Paste the URL (https://hooks.slack.com/services/…) into URL.

Messages use Block Kit: a bold title with an emoji (ℹ️ info, ✅ success, ✋ warning/approval, ❌ error), the body, and a context line with links to the issue and any PRs.

In the Discord channel: Edit Channel → Integrations → Webhooks → New Webhook → Copy Webhook URL (https://discord.com/api/webhooks/…). Messages are embeds coloured by severity, titled with the event, linking to the issue, with PR links in the description.

Create an incoming webhook for the channel with a Teams Workflows template for webhook requests (or a legacy incoming webhook connector) and paste its URL (https://…webhook.office.com/… or the Workflows URL). Messages are Adaptive Cards (v1.4) with the title, body, and an Open URL button per link.

ntfy pushes notifications to the ntfy app on your phone.

  1. Install the ntfy app (iOS/Android) and subscribe to a topic with a hard-to-guess name, e.g. jimothy-7f3k2q.
  2. In Jimothy, set URL to the topic URL: https://ntfy.sh/jimothy-7f3k2q (or your self-hosted server).
  3. If your topic is protected, put an access token in Bearer token.

Jimothy POSTs the body as plain text (with PR links on extra lines) and sets ntfy headers:

Header Value
Title The notification title (RFC 2047-encoded if it contains non-ASCII characters)
Priority high for errors and approval.required, else default
Tags white_check_mark (success), x (error), raised_hand (warning/approval), factory (info)
Click The issue URL, when the run has one — tapping the notification opens it
Authorization Bearer <token>, if set

To open the run itself from your phone, set up Remote access; see Approvals from your phone.

Receives a JSON POST for every subscribed event, with Authorization: Bearer <token> if a token is set:

{
"event": "run.succeeded",
"title": "Run #42 succeeded",
"body": "ENG-123 · Add rate limiting\n18m 4s · $1.37",
"severity": "success",
"at": "2026-09-28T14:03:11.412Z",
"run": {
"id": "run_0mfz2k1a9c3e5d7",
"number": 42,
"status": "succeeded",
"pipeline": "Feature: Plan → Build → Review → PR",
"issue": { "key": "ENG-123", "title": "Add rate limiting", "url": "https://linear.app/acme/issue/ENG-123" },
"branch": "jimothy/eng-123",
"costUsd": 1.37,
"links": [{ "label": "PR #57", "url": "https://github.com/acme/web-app/pull/57" }]
}
}

severity is info, success, warning or error. run is omitted for trigger errors. Step and approval events also carry stepId. Any non-2xx response counts as a failure.

Every event except Step succeeded is added to the inbox (the newest 300 are kept).

  • Sidebar → Inbox opens a drawer with all items, a coloured dot per severity, and an unread count badge in the sidebar. Click an item to mark it read and open its run. Mark all read and the trash button (Clear) act on everything.
  • Notifications → Recent activity shows the latest 50 items, with Mark all read.
  • On narrow screens (and over remote access), a bell in the top bar opens the inbox, with a dot when there are unread items.

Closing the main window doesn’t quit Jimothy: it keeps running in the system tray, so triggers keep polling and runs keep going. Use Quit in the tray menu to exit.

The tray menu shows:

  • Open Jimothy
  • N active runs, followed by up to five active runs (#42 ENG-123 — running); click one to open it
  • N awaiting approval, followed by up to five runs waiting (✋ #41 ENG-120)
  • New run…
  • Quit

The tray tooltip reads Jimothy — 2 active, 1 awaiting approval. On macOS the menu-bar title shows the active count and ✋N for approvals. On macOS and Linux the dock/launcher badge shows the number of runs awaiting approval.