Prompt it when you're there. Loop it when you're not.
Loopable turns the work that keeps coming back into agent workflows, in minutes. Set them up at loop.goodone.si; they run on your machine with Codex or Claude Code, and answer where they were asked.
A review request, a question in #oncall, a morning check: today each one waits until you copy it into your agent, and when you are busy or away, it stops. Hosted agents can take some of it, but they run in a cloud sandbox that cannot reach your internal network, logs, or services.
Loopable watches GitHub, Slack, Lark, email, and the clock, and hands each job to Codex, Claude Code, or Cursor Agent on your own machine. The answer goes back where it was asked, and every run is recorded.
- On its own. A loop says what starts it, what to ask, and where to answer. Nobody has to be there.
- On your machine. The agent reaches what your machine reaches, uses the MCP servers and skills you installed, and runs on the plan you already pay for.
- For your team too. Answer in a team channel or on a shared GitHub account, and the same loop works for everyone.
The story is in docs/narrative.md. The words for the parts — trigger, workflow, loop, runner — are in docs/concepts.md.
-
Sign in at loop.goodone.si with GitHub or Google.
-
Connect your machine. It needs Node 22+ and Codex, Claude Code, or Cursor Agent signed in.
npm install -g loopable-cli loopable runner --token <from the Runners page>
-
Connect GitHub, a Slack bot, or a Lark bot, and turn on a loop.
More machines, folders, and upgrading are in docs/runners.md.
| Comes in from | Loop | Writes back |
|---|---|---|
| Any trigger | Custom loop: pick what starts it, write your own prompt | Anywhere below, or Inbox only |
| Schedule | Do something on a schedule | Inbox, or a Slack, Lark, or GitHub thread |
| GitHub | Review pull requests | A review, as a comment |
| GitHub | Reply to issues | A comment on the issue |
| Slack bot | Do what I ask the Slack bot (@mention or DM) | A reply in the thread |
| Feishu / Lark bot | Do what I ask the Feishu / Lark bot (@mention in a group) | A reply in the thread |
| Do what I ask the WeChat bot | A reply in the chat | |
| Gmail | Custom loop: “An email arrives” | Anywhere, such as an email back to the same inbox |
A loop’s answer can go to any connector that accepts it, so a scheduled check can post to #oncall. To ask an agent something once, use Ask an agent in the inbox.
Loopable is hosted: the app and the dispatcher run on Cloudflare. The dispatcher watches your services, matches a loop, and queues the job. Your runner pulls it over HTTPS, runs the agent on your machine, and Loopable writes the answer back.
| Part | Where | Does |
|---|---|---|
| App | Hosted | The pages, sign-in, the API runners pull from |
| Dispatcher | Hosted | Watches for signals, matches loops, queues jobs, writes back |
| Runner | Your machine | Pulls a job, runs the agent CLI |
Your code, logs, and network access stay on your machine. Connection tokens are encrypted in the service, and the agent never sees them. Everything you set up belongs to your workspace, and nothing reads across workspaces.
TanStack Start (React + Vite), SQLite (libSQL hosted), Tailwind. Tests are Vitest.
pnpm install
pnpm dev # App + Dispatcher + Runner on one machine, ~/.loopable-dev, hot reload
pnpm typecheck
pnpm test
pnpm db:generate # after changing src/server/db/schema.ts
pnpm db:studiopnpm dev is a single local workspace with no sign-in. To try sign-in, workspaces, and joining a runner with a token locally, see docs/hosting.md. pnpm runner --token <from the local Runners page> joins a second runner to pnpm dev, kept apart from your real one in ~/.loopable-dev.
Changes go through a pull request; CI must pass before it merges. Merging to main deploys the service by itself, migrations first. The CLI's version is bumped in a pull request with pnpm bump, then the Release workflow publishes it. All of it, and how to roll back, is in docs/release.md.
| Path | Contents |
|---|---|
src/connectors/ |
One folder per connector: manifest.ts (browser-safe) and runtime.ts (server) |
src/agents/ |
One folder per agent, same split |
src/server/ |
Database, accounts, workspaces, secrets, queue, server functions |
src/dispatcher/ |
Dispatcher process |
src/runner/ |
Runner process |
src/routes/ |
Pages and /api/ |
src/landing/ |
The front page |
src/worker.ts |
The Cloudflare Worker and its dispatcher container |
drizzle/ |
Migrations |
A new connector is a folder plus one line in src/connectors/manifests.ts and src/connectors/runtimes.ts. See docs/connectors.md.