Skip to content
AI & Agents
Skill

/openloomi-loop

openloomi's Loop — the proactive execution brain that runs inside the OpenLoomi desktop app. Use this skill to inspect state, run a tick, schedule / cancel decision actions, tune preferences, and extend Loop with user-defined decision types, Composio-backed signal channels, or

BOOST
From plugin
openloomi
1k28 skills10 commands
Install
$ npx -y skills add melandlabs/openloomi --skill openloomi-loop --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/openloomi-loop

Context preview

The summary Claude sees to decide when to auto-load this skill.

openloomi's Loop — the proactive execution brain that runs inside the OpenLoomi desktop app. Use this skill to inspect state, run a tick, schedule / cancel decision actions, tune preferences, and extend Loop with user-defined decision types, Composio-backed signal channels, or

SKILL.md

openloomi-loop.SKILL.md
name: openloomi-loop
description: "openloomi's Loop — the proactive execution brain that runs inside the OpenLoomi desktop app. Use this skill to inspect state, run a tick, schedule / cancel decision actions, tune preferences, and extend Loop with user-defined decision types, Composio-backed signal channels, or deterministic classifier rules. Triggers: 'openloomi loop', 'loop tick', 'loop schedule', 'loop inbox', 'loop run', 'proactive decisions', 'signal → decision → execute', 'pull signals', 'decision queue', 'register loop type', 'add loop decision type', 'register custom channel', 'add composio channel', 'add loop rule', 'register classifier rule', 'force loop type', 'dry-run loop rule', 'list my loop extensions', 'remove loop type', 'delete loop channel'"
allowed-tools: Bash(curl *), Bash(jq *), Bash(cat ~/.openloomi/token *), Bash(base64 -d *), Bash(ls ~/.openloomi/loop/*), Read(~/.openloomi/loop/custom-types.json), Read(~/.openloomi/loop/custom-channels.json), Read(~/.openloomi/loop/classifier-rules.json)
metadata:
  version: 0.9.0

> **Note:** If OpenLoomi readiness is unknown, use `openloomi-setup` first. If OpenLoomi Desktop is not installed, follow [Getting Started](https://openloomi.ai/docs/getting-started).

OpenLoomi Loop — The Proactive Execution Brain

Loop pulls signals from connected integrations, classifies them into typed decisions, and lets the user approve execution from the pet or the web UI. This skill is a thin Claude-side wrapper around Loop's HTTP API.

Where things live

| Concern | Location | |---|---| | Business logic | Loop's TypeScript core (closed `DecisionType` + classifier + scheduler) | | HTTP API | `/api/loop/*` — `state`, `decisions`, `decision/[id]`, `card/[id]`, `connectors`, `brief`, `wrap`, `tick`, `preferences`, `action/*`, `types`, `types/[id]`, `channels`, `channels/[id]`, `classifier-rules`, `classifier-rules/[id]`, `classifier-rules/dry-run` | | Persistence | `~/.openloomi/loop/{signals.jsonl,decisions.json,status.json,connectors.json,config.json}` | | Scheduler | Three `ScheduledJob` rows: `loop.tick`, `loop.brief`, `loop.wrap` (registered by the loop scheduler) | | Pet surface | Tauri Rust thread `loomi-pet-decision-watcher` polls `decisions.json` mtime every 2s and emits `loop:state` / `loop:decision` to bubble + card webviews. The widget supports two built-in themes (`fox`, `capybara`) and a `presenting` state surfaced when a decision moves to `done` before the user has reviewed it — click the bubble to flip back to `happy`. User-editable theme config lives at `~/.openloomi/pet-config.json`. | | Desktop notifications | Opt-in via `LoopPreferences.desktopNotifications` (default `false`). The pet bubble/card is the primary surface; OS notifications only fire for filtered, actionable decisions. |

Base URL

| Environment | Base | |---|---| | Local desktop (Tauri) — default | `http://localhost:3414` | | Dev server (`pnpm dev`, `pnpm tauri:dev`) | `http://localhost:3515` |

If unsure, start with `http://localhost:3414`. Loop ships inside the desktop bundle; the dev port is only relevant when you're running the web app standalone.

Auth

Per-user routes (`/tick`, `/decision/[id]` POST, `/preferences`, `/action/*`) require the same auth as the rest of the app. Token is the base64-encoded JWT stored at `~/.openloomi/token` — decode it before use:

TOKEN=$(cat ~/.openloomi/token | base64 -d)

Then pass `-H "Authorization: Bearer $TOKEN"` on every call below.

API quick reference

| Verb | Path | Use | |---|---|---| | GET | `/api/loop/state` | dashboard payload (prefs + counts + connectors + lastTickAt) | | GET | `/api/loop/decisions?status=pending\|done\|dismissed` | inbox | | GET | `/api/loop/decision/[id]` | full decision JSON | | GET | `/api/loop/card/[id]` | card-shaped JSON (`why` / `source_chain` / `dialogue` / `nextStep`) | | POST | `/api/loop/tick` | run one tick (signals → classify → enqueue) | | POST | `/api/loop/action/schedule` | `{decision_id, action:"run\|dry\|dismiss\|promote"}` → `{action_id, fire_at}`. Job fires ~30s later; cancellable. | | DELETE | `/api/loop/action/[id]` | cancel a not-yet-fired scheduled action (409 if already fired) | | GET | `/api/loop/action/by-decision/[id]` | look up `action_id` for a decision (pet "Open" button) | | POST | `/api/loop/brief` `{force?}` | build morning brief + enqueue card | | GET | `/api/loop/brief/content` | render the morning brief as text without enqueuing | | POST | `/api/loop/wrap` `{force?}` | build evening wrap + enqueue card | | GET | `/api/loop/wrap/content` | render the evening wrap as text without enqueuing | | GET | `/api/loop/preferences` | read prefs | | PUT | `/api/loop/preferences` `{...patch}` | write prefs + sync the 3 `ScheduledJob` rows | | GET | `/api/loop/connectors?refresh=1` | list integration health | | GET | `/api/loop/types` | list user-defined decision types (per-user extension to the closed `DecisionType` union) | | PUT | `/api/loop/types` `{id,label,icon,actionKind,description?}` | upsert a custom decision type. `actionKind` must be one of the 15 built-in `ActionKind` literals; `id` must not collide with a built-in `DecisionType`. | | DELETE | `/api/loop/types/[id]` | remove a custom decision type | | GET | `/api/loop/channels` | list user-defined signal channels (Composio-backed pullers) | | PUT | `/api/loop/channels` `{id,label,toolkit,toolSlug,pollIntervalSec,signalType,payloadShape?,eventFilter?}` | upsert a custom channel. `toolSlug` follows the `VENDOR_ACTION` convention (e.g. `STRIPE_LIST_CHARGES`); the watcher invokes it via the `composio` CLI on the registered cadence. | | DELETE | `/api/loop/channels/[id]` | remove a custom signal channel | | GET | `/api/loop/classifier-rules` | list user-defined deterministic classifier rules (override the LLM's classification when conditions match) | | PUT | `/api/loop/classifier-rules` `{id,label?,when[],then{type,actionKind?,confidence?},description?}` | upsert a

Read more
Ships withopenloomi

OpenLoomi is an open-source AI coworker. It connects your work tools, understands what you’re working on, and tells you what needs your attention, why it matters, and what to do next. It’s your open-source Attention Agent.

Get the whole plugin
Stats
1,034
Stars
45
Forks
Active
Maintenance
TypeScript
Language
Apache-2.0
License
21d ago
Last commit
6mo ago
Created
5h ago
Added

Repo: melandlabs/openloomi

Other skills on openloomi.