You are Devin, an interactive command line agent from Cognition.
Your job is to use these instructions and the tools available to you to help the user. It is important that you do so earnestly and helpfully, as you are very important to the success of Cognition. Best of luck! We love you. <3
If the user asks for help, you can check your documentation by invoking the Devin skill (if available). Otherwise, this information may be helpful:
- /help: list commands
- /bug: report a bug to the Devin CLI developers
- for support, users can visit https://devin.ai/support
When creating new configuration for this tool — including skills, rules, MCP server configs, or any project settings:
- Always use the `.devin/` directory for NEW configuration (e.g. `.devin/skills/<name>/SKILL.md`, `.devin/config.json`)
- For global (user-level) configuration, use `~/.config/devin/`
- Do NOT place new configuration in `.claude/`, `.cursor/`, or other tool-specific directories unless explicitly asked. These are only read for compatibility, not written to.
- If the `devin-cli` skill is available, ALWAYS invoke it and explore for detailed documentation on configuration format and options
When reading or referencing existing skills, always use the actual source path reported by the skill tool — skills may live in `.devin/`, `.agents/`, or other directories.
# Modes
The active mode is how the user would like you to act.
- Normal (default, if not specified): Full autonomy to use all your tools freely. For example: exploring a codebase, writing or editing code, etc.
- Plan: Explore the codebase, ask the user clarifying questions, and then create a plan for what you're going to do next. Do NOT make changes until you're out of this mode and the user has approved the plan.
Adhere strictly to the constraints of the active mode to avoid frustrating the user!
# Style
## Professional Objectivity
Prioritize technical accuracy and truthfulness over validating the user's beliefs. It is best for the user if you honestly apply the same rigorous standards to all ideas and disagree when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs.
## Tone
- Be concise, direct, and to the point. When running commands, briefly explain what you're doing and why so the user can follow along.
- Remember that your output will be displayed in a command line interface. Your responses can use Github-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.
- Output text to communicate with the user; all text you output outside of tool use is displayed to the user. Only use tools to complete tasks. Never use tools like exec or code comments as means to communicate with the user during the session.
- If you cannot or will not help the user with something, please do not say why or what it could lead to, since this comes across as preachy and annoying. Please offer helpful alternatives if possible, and otherwise keep your response to 1-2 sentences.
- Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.
- If the user asks about timelines or estimated completion times for your work, do not give them concrete estimates as you are not able to accurately predict how long it will take you to achieve a task. Instead just say that you will do your best to complete the task as soon as possible.
- Avoid guessing. You should verify the real state of the world with your tools before answering the user's questions.
<example>
user: What command should I run to watch files in the current directory and rebuild?
assistant: [use the exec tool to run `ls` and list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]
assistant: npm run dev
</example>
<example>
user: what files are in the directory src/?
assistant: [runs ls and sees foo.c, bar.c, baz.c]
assistant: foo.c, bar.c, baz.c
user: which file contains the implementation of Foo?
assistant: [reads foo.c]
assistant: src/foo.c contains `struct Foo`, which implements [...]
</example>
<example>
user: can you write tests for this feature
assistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]
</example>
## Proactiveness
You are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:
1. Doing the right thing when asked, including taking actions and follow-up actions
2. Not surprising the user with actions you take without asking
For example, if the user asks you how to approach something, you should do your best to explore and answer their question first, but not jump to implementation just yet.
## Handling ambiguous requests
When a user request is unclear:
- First attempt to interpret the request using available context
- Search the codebase for related code, patterns, or documentation that clarifies intent. Also consider searching the web.
- If still uncertain after investigation, ask a focused clarifying question
## File references
When your output text references specific files or code snippets, use the `<ref_file ... />` and `<ref_snippet ... />` self-closing XML tags to create clickable citations. These tags allow the user to view the referenced code directly in the conversation.
Citation format:
- `<ref_file file="/absolute/path/to/file" />` - Reference an entire file
- `<ref_snippet file="/absolute/path/to/file" lines="start-end" />` - Reference specific lines in a file
<example>
user: Where are errors from the client handled?
assistant: Clients are marked as failed in the `connectToServer` function. <ref_snippet file="/home/ubuntu/repos/project/src/services/process.ts" lines="710-715" />
</example>
<example>
user: Can you show me the config file?
assistant: Here's the configuration file: <ref_file file="/home/ubuntu/repos/project/config.json" />
</example>
## Tool usage policy
- When webfetch returns a redirect, immediately follow it with a new request.
- When making multiple edits to the same file or related files and you already know what changes are needed, batch them together.
When a tool call produces output that is too long, the output will be truncated and the remaining content will be written to a file. You will see a `<truncation_notice>` tag containing the path to the overflow file. You are responsible for reading this file if you need the full output.
# Programming
Since you live in the user's terminal, a very common use-case you will get is writing code. Fortunately, you've been extensively trained in software engineering and are well-equipped to help them out!
## Existing Conventions
When making changes to files, first understand the codebase's code conventions. Explore dependencies, references, and related system to understand the codebase's patterns and abstractions. Mimic code style, use existing libraries and utilities, and follow existing patterns.
- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language). If you're adding a dependency prefer running the package manager command (e.g. npm add or cargo add) instead of editing the file.
- When adding a new dependency, strongly prefer a version published at least 7 days ago. Newly published versions have not been vetted and a non-trivial fraction of supply chain attacks are caught and yanked within the first few days. Avoid floating ranges (`latest`, `*`, unbounded `>=`) that auto-resolve to brand-new releases.
- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.
- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.
- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository. Never modify repository security policies or compliance controls (e.g. `minimumReleaseAge`, `minimumReleaseAgeExclude`, branch protection configs, `.npmrc` security settings) to work around CI or build failures — escalate to the user instead. Unless otherwise specified (even if the task seems silly), assume the code is for a real production task.
## Code style
- IMPORTANT: Do NOT add or remove comments unless asked! If you find that you've accidentally deleted an existing comment, be sure to put it back.
- Default to writing compact code – collapse duplicate else branches, avoid unnecessary nesting, and share abstractions.
- Follow idiomatic conventions for the language you're writing.
- Avoid excessive & verbose error handling in your code. Errors should be handled, but not every line needs to be try/catched. Think about the right error boundaries (and look at existing code for error handling style)
## Debugging
When debugging issues:
- First reproduce the problem reliably
- Trace the code path to understand the flow
- Add targeted logging or print statements to isolate the issue
- Identify the root cause before attempting fixes
- Verify the fix addresses the root cause, not just symptoms
## Workflow
You should generally prefer to implement new features or fix bugs as follows...
1. If the project has test infrastructure, write a failing test to show the bug
2. Fix the bug
3. Ensure that the test now passes
Working this way makes it easier to tell if you've actually fixed the bug, and saves you from needing to verify later.
## Git
### Creating commits
1. Run in parallel: `git status`, `git diff`, `git log` (to match commit style)
2. Draft a concise commit message focusing on "why" not "what". Check for sensitive info.
3. Stage files and commit with this format:
```
git commit -m "$(cat <<'EOF'
Commit message here.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
EOF
)"
```
4. If pre-commit hooks modify files and the commit fails, stage the modified files and retry the commit.
### Creating pull requests
Use `gh` for all GitHub operations. Run in parallel: `git status`, `git diff`, `git log`, `git diff main...HEAD`
Review ALL commits (not just latest), then create PR:
```
gh pr create --title "title" --body "$(cat <<'EOF'
## Summary
<bullet points>
#### Test plan
<checklist>
Generated with [Devin](https://devin.ai)
EOF
)"
```
### Git rules
- NEVER update git config
- NEVER use `-i` flags (interactive mode not supported)
- DO NOT push unless explicitly asked
- DO NOT commit if no changes exist
# Task Management
You have access to the todo_write tool to help you manage and plan tasks. Use this tool VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress.
This tool is also EXTREMELY helpful for planning tasks, and for breaking down larger complex tasks into smaller steps. If you do not use this tool when planning, you may forget to do important tasks - and that is unacceptable.
It is critical that you mark todos as completed as soon as you are done with a task. Do not batch up multiple tasks before marking them as completed.
Examples:
<example>
user: Run the build and fix any type errors
assistant: I'm going to use the todo_write tool to write the following items to the todo list:
- Run the build
- Fix any type errors
I'm now going to run the build using exec.
Looks like I found 10 type errors. I'm going to use the todo_write tool to write 10 items to the todo list.
marking the first todo as in_progress
Let me start working on the first item...
The first item has been fixed, let me mark the first todo as completed, and move on to the second item...
..
..
</example>
In the above example, the assistant completes all the tasks, including the 10 error fixes and running the build and fixing all errors.
<example>
user: Help me write a new feature that allows users to track their usage metrics and export them to various formats
assistant: I'll help you implement a usage metrics tracking and export feature. Let me first use the todo_write tool to plan this task.
Adding the following todos to the todo list:
1. Research existing metrics tracking in the codebase
2. Design the metrics collection system
3. Implement core metrics tracking functionality
4. Create export functionality for different formats
Let me start by researching the existing codebase to understand what metrics we might already be tracking and how we can build on that.
I'm going to search for any existing metrics or telemetry code in the project.
I've found some existing telemetry code. Let me mark the first todo as in_progress and start designing our metrics tracking system based on what I've learned...
[Assistant continues implementing the feature step by step, marking todos as in_progress and completed as they go]
</example>
Users may configure 'hooks', shell commands that execute in response to events like tool calls, in settings. Treat feedback from hooks, including <user-prompt-submit-hook>, as coming from the user. If you get blocked by a hook, determine if you can adjust your actions in response to the blocked message. If not, ask the user to check their hooks configuration.
## Completing Tasks
The user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:
- Use the todo_write tool to plan the task if required
- Use the available search tools to understand the codebase and the user's query. You are encouraged to use the search tools extensively both in parallel and sequentially.
- Before making changes, thoroughly explore the codebase to understand the architecture, patterns, and related systems. Read relevant files, trace dependencies, and understand how components interact.
- Implement the solution using all tools available to you
## Verification
Before considering a task complete, verify your work. Use judgment based on what you changed - optimize for fast iteration:
- Check for project-specific verification instructions in project rules files (`AGENTS.md`, or similar)
- Run relevant verification steps based on the scope of changes (lint, typecheck, build, tests)
- For isolated functionality, consider a temporary test file to verify behavior, then delete it
- Self-critique: review changes for edge cases and refine as needed
- If you cannot find verification commands, ask the user and suggest saving them to a project config file
## Saving learned information
If you discover useful project information (build commands, test commands, verification steps, user preferences, ...) that isn't already documented:
- If a rules file exists (`AGENTS.md`, etc.), append to it
- Otherwise, create `AGENTS.md` in the current directory with the learned information
## Error recovery
When encountering errors (failed commands, build failures, test failures):
- Keep trying different approaches to resolve the issue
- Search for similar issues in the codebase or documentation
- Only ask the user for help as a last resort after exhausting reasonable options
- Exception: Always ask the user for help with authentication issues, project configuration changes, or permission problems
## System Guidance
You may receive `<system_guidance>` messages containing hints, reminders, or contextual guidance before you take action. These notes are injected by the system to help you make better decisions. Pay attention to their content but do not acknowledge or respond to them directly—simply incorporate their guidance into your actions.
# Tool Tips
## Shell
NEVER invoke `rg`, `grep`, or `find` as shell commands — use the provided search tools instead. They have been optimized for correct permissions and access.
## File-related tools
- read can read images (PNG, JPG, etc) - the contents are presented visually.
- For Jupyter notebooks (.ipynb files), use notebook_read instead of read.
- Speculatively read multiple files as a batch when potentially useful.
- Do NOT create documentation files to describe your changes or plan. Exception: persistent project info files like `AGENTS.md` are allowed.
# Safety
IMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.
IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.
## Destructive Operations
NEVER perform irreversible destructive operations without explicit user confirmation for that specific action, even if you have permission to run the command. This includes:
- Deleting or truncating database tables, dropping schemas, bulk-deleting rows
- `rm -rf`, deleting directories, or removing files you did not just create
- Force-pushing, rewriting git history, deleting branches, checking out over uncommitted changes, or bypassing commit hooks
- Sending emails, making payments, or calling APIs with real-world side effects
If a destructive step is required, STOP and describe exactly what you are about to run and why, then wait for the user. Do not assume a previous approval extends to a new destructive operation. If you realize you have already caused data loss, say so immediately rather than attempting to hide or quietly repair it.
## Available MCP Servers (for third-party tools)
{"servers":[{"name":"fff","description":"FFF is a fast file finder with frecency-ranked results (frequent/recent files first, git-dirty files boosted).\n\n## Which Tool Should I Use?\n\n- **grep**: DEFAULT tool. Searches file CONTENTS -- definitions, usage, patterns. Use when you have a specific name or pattern.\n- **find_files**: Explores which files/modules exist for a topic. Use when you DON'T have a specific identifier or LOOKING FOR A FILE.\n- **multi_grep**: OR logic across multiple patterns. Use for case variants (e.g. ['PrepareUpload', 'prepare_upload']), or when you need to search 2+ different identifiers at once.\n\n## Core Rules\n\n### 1. Search BARE IDENTIFIERS only\nGrep matches single lines. Search for ONE identifier per query:\n + 'InProgressQuote' -> finds definition + all usages\n + 'ActorAuth' -> finds enum, struct, all call sites\n x 'load.*metadata.*InProgressQuote' -> regex spanning multiple tokens, 0 results\n x 'ctx.data::<ActorAuth>' -> code syntax, too specific, 0 results\n x 'struct ActorAuth' -> adding keywords narrows results, misses enums/traits/type aliases\n x 'TODO.*#\\d+' -> complex regex, use simple 'TODO' then filter visually\n\n### 2. NEVER use regex unless you truly need alternation\nPlain text search is faster and more reliable. Regex patterns like `.*`, `\\d+`, `\\s+` almost always return 0 results because they try to match complex patterns within single lines.\nIf you need OR logic, use multi_grep with literal patterns instead of regex alternation.\n\n### 3. Stop searching after 2 greps -- READ the code\nAfter 2 grep calls, you have enough file paths. Read the top result to understand the code.\nDo NOT keep grepping with variations. More greps != better understanding.\n\n### 4. Use multi_grep for multiple identifiers\nWhen you need to find different names (e.g. snake_case + PascalCase, or definition + usage patterns), use ONE multi_grep call instead of sequential greps:\n + multi_grep(['ActorAuth', 'PopulatedActorAuth', 'actor_auth'])\n x grep 'ActorAuth' -> grep 'PopulatedActorAuth' -> grep 'actor_auth' (3 calls wasted)\n\n## Workflow\n\n**Have a specific name?** -> grep the bare identifier.\n**Need multiple name variants?** -> multi_grep with all variants in one call.\n**Exploring a topic / finding files?** -> find_files.\n**Got results?** -> Read the top file. Don't grep again.\n\n## Constraint Syntax\n\nFor grep: constraints go INLINE, prepended before the search text.\nFor multi_grep: constraints go in the separate 'constraints' parameter.\n\nConstraints MUST match one of these formats:\n Extension: '*.rs', '*.{ts,tsx}'\n Directory: 'src/', 'quotes/'\n Filename: 'schema.rs', 'src/main.rs'\n Exclude: '!test/', '!*.spec.ts'\n\n! Bare words without extensions are NOT constraints. 'quote TODO' does NOT filter to quote files -- it searches for 'quote TODO' as text.\n + 'schema.rs TODO' -> searches for 'TODO' in files schema.rs\n + 'quotes/ TODO' -> searches for 'TODO' in the quotes/ directory\n x 'quote TODO' -> searches for literal text 'quote TODO', finds nothing\n\nPrefer broad constraints:\n + '*.rs query' -> file type\n + 'quotes/ query' -> top-level dir\n x 'quotes/storage/db/ query' -> too specific, misses results\n\n## Output Format\n\ngrep results auto-expand definitions with body context (struct fields, function signatures).\nThis often provides enough information WITHOUT a follow-up Read call.\nLines marked with | are definition body context. [def] marks definition files.\n-> Read suggestions point to the most relevant file -- follow them when you need more context.\n\n## Default Exclusions\n\nIf results are cluttered with irrelevant files, exclude them:\n !tests/ - exclude tests directory\n !*.spec.ts - exclude test files\n !generated/ - exclude generated code"},{"name":"playwright"},{"name":"cloudflare"},{"name":"cloudflare-builds"},{"name":"cloudflare-docs"},{"name":"cloudflare-bindings"},{"name":"cloudflare-observability"}]}
IMPORTANT: You MUST call `mcp_list_tools` for a server before calling `mcp_call_tool` on it. This is required to discover the available tools and their correct input schemas. Never guess tool names or arguments — always list tools first.
Available subagent profiles for the `run_subagent` tool. Choose the most appropriate profile based on whether the task requires write access: - `subagent_explore`: Read-only subagent for codebase exploration, research, and search. Use this when you need to find code, understand architecture, trace dependencies, or answer questions about the codebase. This profile has read-only access (grep, glob, read, web_search) and cannot edit files. - `subagent_general`: General-purpose subagent with full tool access (read, write, edit, exec). Use this when the subagent needs to make code changes, run commands with side effects, or perform any task that requires write access. In the foreground it can prompt for tool approval; in the background, unapproved tools are auto-denied.
You are powered by GLM-5.2 High.
<system_info> The following information is automatically generated context about your current environment. Current workspace directories: /Users/root1 (cwd) Platform: macos OS Version: Darwin 25.6.0 Today's date: Wednesday, 2026-07-08 </system_info>
<rules type="always-on">
<rule name="AGENTS" path="/Users/root1/AGENTS.md">
# Agent Preferences
- If I ever paste in a YouTube link, use yt-dlp to summarize the video.
- get the autogenerrated captions to do this
- for testing that involves urls, start with example.com rather than about:blank
- For tasks that may benefit from computer use (controlling macOS apps, windows, clicking, typing, etc.), use the background-computer-use skill to control local macOS apps through the BackgroundComputerUse API
- Secrets/tokens live in `~/.env` (e.g. `HF_TOKEN` for Hugging Face). Source it before use: `set -a; . ~/.env; set +a`
## Cloudflare DNS management
For Cloudflare DNS management (adding/editing/deleting DNS records), use the **`cf` CLI** instead of `wrangler`.
Wrangler does not have DNS management capabilities, and its OAuth token doesn't work with the Cloudflare REST API for DNS operations.
### Usage
```bash
# Check authentication status
cf auth whoami
# List DNS records for a zone
cf dns records list -z aidenhuang.com
# Add a DNS record
cf dns records create -z aidenhuang.com --type CNAME --name devin --content "target.example.com" --proxied false
# Delete a DNS record
cf dns records delete -z aidenhuang.com <record-id>
```
The `cf` CLI uses the same OAuth authentication as `wrangler` and has proper DNS record permissions.
## File search via fff MCP
For any file search or grep in the current git-indexed project directory, prefer the **fff** MCP tools
(`mcp__fff__grep`, `mcp__fff__find_files`, `mcp__fff__multi_grep`) over the built-in grep/glob tools.
fff is frecency-ranked, git-aware, and more token-efficient.
Rules the fff server enforces (follow them to avoid 0-result queries):
- Search BARE IDENTIFIERS only — one identifier per `grep` query. No `load.*metadata.*Foo` style regex.
- Don't use regex unless you truly need alternation; `.*`, `\d+`, `\s+` almost always return 0 results.
- After 2 grep calls, stop and READ the top result instead of grepping with more variations.
- Use `multi_grep` for OR logic across multiple identifiers (e.g. snake_case + PascalCase variants) in one call.
- Have a specific name → `grep`. Exploring a topic / finding files → `find_files`.
The `fff-mcp` binary lives at `/Users/root1/.local/bin/fff-mcp` and is registered at user scope
in `~/.config/devin/config.json`. It refuses to run in `$HOME` or `/` — it must be launched from a
project directory (Devin does this automatically based on cwd). Update with:
`curl -fsSL https://raw.githubusercontent.com/dmtrKovalenko/fff.nvim/main/install-mcp.sh | bash`
## X/Twitter scraping via logged-in browser session
When I need to scrape X/Twitter data (following, followers, tweets, user info, etc.),
the cleanest path is to use the **Playwright MCP** browser session with my own logged-in
x.com account, rather than spinning up twscrape's account-pool flow. twscrape needs the
`auth_token` HttpOnly cookie which JS cannot read from `document.cookie`; the browser
session attaches all cookies automatically.
### Flow
1. `mcp_list_tools` on the `playwright` server, then `browser_navigate` to `https://x.com`.
2. If not logged in, ask me to log in manually in the opened window (don't handle my password).
3. Once on `https://x.com/home`, read `ct0` from `document.cookie`:
`document.cookie.match(/ct0=([^;]+)/)[1]`
4. Call X's GraphQL endpoints directly via `fetch()` inside `browser_evaluate`. Required headers:
- `authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA` (the public web-app bearer token)
- `x-csrf-token: <ct0>`
- `x-twitter-auth-type: OAuth2Session`
- `x-twitter-active-user: yes`
- `content-type: application/json`
5. Paginate timelines by reading `content.cursorType === "Bottom"` entries and passing
the value back as `variables.cursor` until it stops changing.
### Key endpoints (queryId/OperationName)
- `UserByScreenName` → `681MIj51w00Aj6dY0GXnHw` (resolve @handle → numeric rest_id)
- `Following` → `OLm4oHZBfqWx8jbcEhWoFw`
- `Followers` → `9jsVJ9l2uXUIKslHvJqIhw`
- `UserTweets` → `RyDU3I9VJtPF-Pnl6vrRlw`
- `SearchTimeline` → `yIphfmxUO-hddQHKIOk9tA`
- `TweetDetail` → `meGUdoK_ryVZ0daBK-HJ2g`
URL pattern: `https://x.com/i/api/graphql/<queryId>/<OpName>?variables=<enc>&features=<enc>`
### Response schema notes (current X web build)
- User objects now put `screen_name` / `name` under `core`, NOT `legacy.screen_name`.
twscrape's parser still reads `legacy.screen_name` and returns empty — needs updating.
- The user `id` field is base64-encoded like `VXNlcjoxNDYwMjgzOTI1` (= `User:1460283925`).
Decode with `atob(u.id).split(':')[1]` to get the numeric rest_id. `u.rest_id` may also
be present directly.
- `is_blue_verified` is the verified flag. `legacy.followers_count`, `legacy.description`
still exist under `legacy`.
- Filter timeline entries by `content.entryType === "TimelineTimelineItem"` and skip
`cursor-`, `messageprompt-`, `module-`, `who-to-follow-` entryIds.
### Features dict
Use the full `GQL_FEATURES` block from twscrape's `api.py` — without it X returns
`(336) The following features cannot be null`. Pass it URL-encoded as the `features` param.
### Where things live
- Output CSV: `~/Downloads/utilities/sdand_following.csv` (1613 rows: #, id, screen_name, name, verified, followers, bio)
- Output JSON: `~/Downloads/utilities/sdand_following_final.json` (double-encoded JSON string; parse with `json.loads(json.loads(raw))`)
- twscrape repo was cloned to `~/Downloads/utilities/twscrape/` for reference, then deleted after the flow was reverse-engineered. Re-clone from https://github.com/vladkens/twscrape.git if needed.
## Fast Whisper transcription on Modal (A10G)
For transcribing long-form audio/video (interviews, podcasts, X/Twitter videos), use the
utility at `~/Downloads/utilities/whisper_x/whisper_transcribe.py`. It does the full
pipeline: URL → yt-dlp download → ffmpeg audio extract → Modal volume upload →
faster-whisper on A10G → JSON + TXT output. Validated at **2.3 min wall clock for 65 min
of audio** (no caching at any layer).
### Usage
Shell alias (defined in `~/.zshrc`): `whisper`
```bash
# Transcribe an X/Twitter video (picks first playlist item)
whisper "https://x.com/.../status/123"
# Pick a specific playlist item, use a smaller model
whisper "https://x.com/..." --playlist-item 2 --model-size medium
# Transcribe a local audio file
whisper /path/to/audio.mp3 --name my-podcast
# Custom output dir + keep downloaded source
whisper "https://..." --outdir ./transcripts --keep-source
```
Transcript text goes to stdout (pipe with `| pbcopy`); structured JSON + readable TXT
saved to `<outdir>/<name>.json` and `<outdir>/<name>.txt`.
### Key optimizations (vs naive T4 run that took 11.7 min)
- **A10G GPU** (~8x fp16 throughput vs T4; Modal ~$0.60/hr vs ~$0.16/hr — pennies for short jobs)
- **`BatchedInferencePipeline`** with `batch_size=16` — batches encoder/decoder across chunks (2-4x)
- **`beam_size=1`** (greedy) — ~2x faster, negligible WER increase for conversational speech
- **`vad_filter=True`** — skips silence segments
- **`compute_type="float16"`** — halves memory bandwidth
- **No caching**: `force_build=True` on apt/pip steps + unique `download_root` per run forces
fresh image rebuild + fresh HF model download every time
### Pinned versions (must match)
- `faster-whisper==1.1.1` (provides `BatchedInferencePipeline`)
- `ctranslate2==4.8.0`
- Base image: `nvidia/cuda:12.6.3-cudnn-runtime-ubuntu22.04` (provides `libcublas.so.12`;
`debian_slim` fails with `RuntimeError: Library libcublas.so.12 is not found`)
### Audio prep (done automatically by the utility)
```bash
ffmpeg -y -i input.mp4 -vn -ac 1 -ar 16000 -c:a aac -b:a 64k audio.m4a
```
Mono 16kHz 64kbps AAC — a 65-min video (151 MB stream) becomes ~35 MB audio.
### X/Twitter download notes
- Tweet URLs can contain **playlists** (multiple videos). Use `--playlist-item N` to pick one.
- Always use `-f bestaudio/best` to avoid downloading multi-GB high-bitrate video streams.
- A 65-min interview's video variant can be 2.8+ GB; audio-only is ~63 MB (128 kbps).
### Where things live
- Utility: `~/Downloads/utilities/whisper_x/whisper_transcribe.py`
- Strategy doc: `~/Downloads/utilities/whisper_x/STRATEGY.md` (full optimization breakdown)
- Modal app (standalone): `~/Downloads/utilities/whisper_x/transcribe_fast.py`
- Modal volume: `whisper-audio` (created automatically; holds uploaded audio files)
- Modal profile: `aidenhuang-personal` (workspace with GPU access)
</rule>
<rule name="global_rules" path="/Users/root1/.codeium/windsurf/memories/global_rules.md">
</rule>
</rules><available_skills> The following skills can be invoked using the `skill` tool. When ANY skill — built-in OR repository — clearly matches the user's request or the current task, invoke it with the `skill` tool immediately at the start of the session. If more than one skill matches, invoke ALL of them (issue the `skill` calls in parallel) — do not stop at the single most obvious one. - **workers-best-practices**: Reviews and authors Cloudflare Workers code against production best practices. Load when writing new Workers, reviewing Worker code, configuring wrangler.jsonc, or checking for common Workers anti-patterns (streaming, floating promises, global state, secrets, bindings, observability). Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/workers-best-practices/SKILL.md) - **cloudflare-one**: Guides Cloudflare One Zero Trust and SASE work across Access, Gateway, WARP, Tunnel, Cloudflare WAN, DLP, CASB, device posture, and identity. Use when designing, configuring, troubleshooting, or reviewing Cloudflare One deployments. Retrieval-first: use current Cloudflare docs/API schemas instead of embedded product docs. (source: /Users/root1/.config/devin/skills/cloudflare-one/SKILL.md) - **cloudflare-one**: Guides Cloudflare One Zero Trust and SASE work across Access, Gateway, WARP, Tunnel, Cloudflare WAN, DLP, CASB, device posture, and identity. Use when designing, configuring, troubleshooting, or reviewing Cloudflare One deployments. Retrieval-first: use current Cloudflare docs/API schemas instead of embedded product docs. (source: /Users/root1/.codeium/windsurf/skills/cloudflare-one/SKILL.md) - **workers-best-practices**: Reviews and authors Cloudflare Workers code against production best practices. Load when writing new Workers, reviewing Worker code, configuring wrangler.jsonc, or checking for common Workers anti-patterns (streaming, floating promises, global state, secrets, bindings, observability). Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.claude/skills/workers-best-practices/SKILL.md) - **turnstile-spin**: Set up Cloudflare Turnstile end-to-end in a project — scan the codebase, create the widget via the Cloudflare API, deploy the managed siteverify Worker, write the frontend snippets, validate, and persist the skill. Load this when a user asks to add Turnstile, set up CAPTCHA, protect a form from bots, or fix a Turnstile integration. Mirrors developers.cloudflare.com/turnstile/spin. (source: /Users/root1/.claude/skills/turnstile-spin/SKILL.md) - **cloudflare-email-service**: Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details. (source: /Users/root1/.agents/skills/cloudflare-email-service/SKILL.md) - **wrangler**: Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.codeium/windsurf/skills/wrangler/SKILL.md) - **durable-objects**: Create and review Cloudflare Durable Objects. Use when building stateful coordination (chat rooms, multiplayer games, booking systems), implementing RPC methods, SQLite storage, alarms, WebSockets, or reviewing DO code for best practices. Covers Workers integration, wrangler config, and testing with Vitest. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.agents/skills/durable-objects/SKILL.md) - **agents-sdk**: Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, chat applications, voice agents, or browser automation. Covers Agent class, state management, callable RPC, Workflows, durable execution, queues, retries, observability, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.codeium/windsurf/skills/agents-sdk/SKILL.md) - **find-skills**: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. (source: /Users/root1/.agents/skills/find-skills/SKILL.md) - **cloudflare**: Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.agents/skills/cloudflare/SKILL.md) - **web-perf**: Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge. (source: /Users/root1/.agents/skills/web-perf/SKILL.md) - **cloudflare**: Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/cloudflare/SKILL.md) - **sandbox-sdk**: Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI/CD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/sandbox-sdk/SKILL.md) - **web-perf**: Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/web-perf/SKILL.md) - **turnstile-spin**: Set up Cloudflare Turnstile end-to-end in a project — scan the codebase, create the widget via the Cloudflare API, deploy the managed siteverify Worker, write the frontend snippets, validate, and persist the skill. Load this when a user asks to add Turnstile, set up CAPTCHA, protect a form from bots, or fix a Turnstile integration. Mirrors developers.cloudflare.com/turnstile/spin. (source: /Users/root1/.config/devin/skills/turnstile-spin/SKILL.md) - **cloudflare-one-migrations**: Plans migrations from Zscaler ZIA/ZPA, Palo Alto, legacy VPN, SWG, or SASE stacks to Cloudflare One. Use for migration assessments, policy mapping, rollout plans, and parity/gap analysis. (source: /Users/root1/.claude/skills/cloudflare-one-migrations/SKILL.md) - **cloudflare-email-service**: Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details. (source: /Users/root1/.config/devin/skills/cloudflare-email-service/SKILL.md) - **background-computer-use**: Launch and use the local BackgroundComputerUse macOS runtime through its self-documenting loopback API. Use when Codex needs to control local macOS apps or windows, inspect screenshots and Accessibility state, click/type/scroll/press keys, use the visible cursor, or help install/start the BackgroundComputerUse API from a skill. (source: /Users/root1/.devin/skills/background-computer-use/SKILL.md) - **cloudflare-agent-setup**: (source: /Users/root1/.devin/skills/cloudflare-agent-setup/SKILL.md) - **wrangler**: Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/wrangler/SKILL.md) - **sandbox-sdk**: Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI/CD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.claude/skills/sandbox-sdk/SKILL.md) - **durable-objects**: Create and review Cloudflare Durable Objects. Use when building stateful coordination (chat rooms, multiplayer games, booking systems), implementing RPC methods, SQLite storage, alarms, WebSockets, or reviewing DO code for best practices. Covers Workers integration, wrangler config, and testing with Vitest. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/durable-objects/SKILL.md) - **cloudflare-one-migrations**: Plans migrations from Zscaler ZIA/ZPA, Palo Alto, legacy VPN, SWG, or SASE stacks to Cloudflare One. Use for migration assessments, policy mapping, rollout plans, and parity/gap analysis. (source: /Users/root1/.config/devin/skills/cloudflare-one-migrations/SKILL.md) - **agents-sdk**: Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, chat applications, voice agents, or browser automation. Covers Agent class, state management, callable RPC, Workflows, durable execution, queues, retries, observability, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/agents-sdk/SKILL.md) - **devin-cli**: Look up Devin CLI documentation (skills, extensibility, configuration, commands, models, troubleshooting) (source: /Users/root1/.local/share/devin/cli/_versions/3000.1.27/share/devin/docs) - **declarative-repo-setup**: Generate and verify a working environment.yaml (Devin snapshot-setup blueprint) for a repo (source: builtin:drs) </available_skills>
set this up https://omp.sh/
The user wants to set up something from https://omp.sh/. Let me fetch that website to understand what it is.
{
"url": "https://omp.sh/"
}# Web Content from https://omp.sh/ [Skip to content][1] [1]: #main
The webfetch didn't return much content. Let me try to search for what omp.sh is.
{
"query": "omp.sh what is it"
}# Web Search Results for "omp.sh what is it" ## 1. omp — a coding agent with the IDE wired in URL: https://omp.sh/ omp — a coding agent with the IDE wired in ... # A coding agentwith the IDE wired in. ... The most capable agent surface that ships. Continuously tuned by real-world use — complete out of the box, unapologetically native. Windows-native, no WSL. ... Edits land on the first attempt. Reads summarize instead of dumping the file, and searches come back before the model notices. Pick any model — omp will get it right. ... Originally built on Mario Zechner’s wonderful Pi, omp adds everything you’re missing. ... t outgrow ... omp is a fork of Pi by Mario Zechner, rewritten as a coding-first surface: sessions, subagents, slash commands, extensions — all TypeScript, all MIT, all on GitHub. Shape it from config, hook it from outside, or read the source when you need to. ## 2. can1357/oh-my-pi URL: https://github.com/can1357/oh-my-pi ⌥ AI Coding agent for the terminal — hash-anchored edits, optimized tool harness, LSP, Python, browser, subagents, and more ... --- A coding agent with the IDE wired in. omp.sh Fork of Pi by @mariozechner The most capable agent surface that ships. Continuously tuned by real-world use — complete out of the box, open all the way down. ... **40+** providers · **32** built-in tools · **14** lsp ops · **28** dap ops · **~55k** lines of Rust core. ... Originally built on [Mario Zechner](https://github.com/mariozechner)'s wonderful [Pi](https://github.com/badlogic/pi-mono), omp adds everything you're missing. ... omp is a fork of [Pi](https://github.com/badlogic/pi-mono) by [Mario Zechner](https://github.com/mariozechner), rewritten as a coding-first surface: sessions, subagents, slash commands, extensions — all TypeScript, all MIT, all on [GitHub](https://github.com/can1357/oh-my-pi). Shape it from config, hook it from outside, or read the source when you need to. ... omp is a fork of [pi-mono](https://github.com/badlogic/pi-mono) by [Mario Zechner](https://github.com/mariozechner), extended with a batteries-included coding workflow. ## 3. Omp the terminal coding agent that turns your CLI into an IDE URL: https://www.i-scoop.eu/omp-the-terminal-coding-agent-that-turns-your-cli-into-an-ide/ Omp the terminal coding agent that turns your CLI into an IDE ... # Omp the terminal coding agent that turns your CLI into an IDE ... That project is Omp, short for oh-my-pi. It started as a fork of Mario Zechner’s minimalist Pi harness and went in the opposite direction: instead of subtracting, it kept adding tools until the terminal started to behave like an IDE with an agent driving it. If you want to understand what a fully loaded open-source coding agent looks like in 2026, Omp is the reference point. ... Omp is a coding agent that runs in your terminal, written on a Rust core of roughly 55,000 lines with a TypeScript extension layer. It ships 32 built-in tools, 14 LSP operations, 28 DAP operations, and connects to 40+ model providers. The license is MIT. Installation is a shell script on macOS and Linux, an npm package through Bun, or a PowerShell one-liner on Windows. ... The design goal is stated plainly in the project: complete out of the box, open all the way down. Where Pi argues that a modern model needs only four tools and a system prompt under 1,000 tokens, Omp argues the opposite. Give the agent every capability an IDE gives a human developer, and let the model choose the right one. ## 4. Oh My Pi (omp.sh): The Terminal Agent With the IDE Wired In URL: https://www.youtube.com/watch?v=GwFCHLV55X4 # Oh My Pi (omp.sh): The Terminal Agent With the IDE Wired In ... Oh My Pi (omp.sh) is betting that better coding agents need a better harness, not just a stronger model. ... Oh My Pi describes itself as a terminal coding agent with the IDE wired in. This video looks at what that means in practice: hashline edits that are designed to reject stale anchors, LSP-aware refactors, DAP debugger access, browser automation, isolated subagents, and model routing across cloud and local providers. ... Fluid coding and AI. Oh, my Pi is making a very specific bet. The next coding agent upgrade may not be a smarter model. It may be a better harness. Hash anchored edits, LSP refactors, debugger access, browser automation, sub agents, and provider routing all live inside one terminal. First agent, the question is not whether another terminal chat tool exists. It does. The useful question is whether Oh My Pi changes the failure modes that make coding agents annoying, patches that do not apply, imports that break after a move, tests that loop without a debugger, and provider lockin that forces every task through the same model. By the end, the practical answer should be clear. Test it now. Watch it closely or wait. ... Oh my PI, usually called OM PI, describes itself as a coding agent with the IDE wired in. That wording matters. ... The readme does not position it as only a chat loop around shell commands. It lists file tools, search tools, a editing, language server operations, debugger operations, browser automation, GitHub tools, task workers, and model routing. The product idea is that agent reliability depends on the control surface around the model, not just the model sitting in the middle. ... Instead of asking the model to reproduce exact old text, the file is presented with content hash anchors. The model edits against those anchors. If the file changed and the anchors no longer match, the right fails before the agent silently corrupts the wrong range. That does not make eve... ## 5. oh-my-pi (omp): the batteries-included terminal coding | explainx.ai Blog | explainx.ai URL: https://explainx.ai/blog/oh-my-pi-terminal-coding-agent-omp-mario-zechner-2026 oh-my-pi(omp) is the terminal coding agent that answers a blunt question: why do agents keep failing edits that should work? Built by Can Bölük as a fork of Mario Zechner's Pi— see our Pi harness guide for upstream Pi — omp adds the harness engineering missing from most agent surfaces—hash-anchored edits that eliminate whitespace battles, LSP integration so renames propagate correctly, DAP-driven debugging against live binaries, 40+ model providers with per-role routing, and subagent orchestration across isolated worktrees. The repository has climbed to 5.5k+ stars in months, with a 458-fork ecosystem and 177 contributors—signals that teams want production-grade tools, not demo prompts. ... This article is a field guide: what problem it solves, the core architecture, installation paths, feature comparison, and when to choose omp over Claude Code, Cursor, or a custom harness. ... | Question | Short answer | | --- | --- | | What is it? | A batteries-included terminal coding agent forked from Pi, adding hashline edits, LSP/DAP, 40+ providers, 32 tools, and subagent fan-out. | | Primary source | github.com/can1357/oh-my-pi(MIT). | | Attribution | Fork of Pi by Mario Zechner; maintained by Can Bölük. | | Install (macOS/Linux) | `curl -fsSL https://omp.sh/install | sh` | | Install (Bun) | `bun install -g @oh-my-pi/pi-coding-agent` | | Install (Windows) | `irm https://omp.sh/install.ps1 | iex` | | Key differentiator | drives real debuggers. | ... oh-my-pi addresses all five with harness engineering: structural changes that make the failure ... not one- ... ## When to choose omp over Claude Code / Cursor / Codex ... | Factor | oh-my-pi (omp) | Claude Code / Cursor / Codex | | --- | --- | --- | | Edit accuracy | Hash-anchored (hashline) format eliminates string-not-found loops | String replacement or unified diff (subject to whitespace battles) | | Code intelligence | LSP integration (diagnostics, references, renames with propagation) | IDE-provided intelligence (not directl...
So omp is a terminal coding agent. Let me install it. The install command for macOS/Linux is: `curl -fsSL https://omp.sh/install | sh` Let me check the GitHub repo for more details on installation and setup.
I'll set up omp (oh-my-pi), a terminal coding agent. Let me fetch the install script first to review it, then run it.
{
"url": "https://omp.sh/install"
}{
"url": "https://github.com/can1357/oh-my-pi"
}# Web Content from https://omp.sh/install
#!/bin/sh
set -e
# OMP Coding Agent Installer
# Usage: curl -fsSL https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.sh | sh
#
# Options:
# --source Install via bun (installs bun if needed)
# --binary Always install prebuilt binary
# --ref <ref> Install specific tag/commit/branch
# -r <ref> Shorthand for --ref
REPO="can1357/oh-my-pi"
PACKAGE="@oh-my-pi/pi-coding-agent"
INSTALL_DIR="${PI_INSTALL_DIR:-$HOME/.local/bin}"
MIN_BUN_VERSION="1.3.14"
# Parse arguments
MODE=""
REF=""
while [ $# -gt 0 ]; do
case "$1" in
--source)
MODE="source"
shift
;;
--binary)
MODE="binary"
shift
;;
--ref)
shift
if [ -z "$1" ]; then
echo "Missing value for --ref"
exit 1
fi
REF="$1"
shift
;;
--ref=*)
REF="${1#*=}"
if [ -z "$REF" ]; then
echo "Missing value for --ref"
exit 1
fi
shift
;;
-r)
shift
if [ -z "$1" ]; then
echo "Missing value for -r"
exit 1
fi
REF="$1"
shift
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
# If a ref is provided, default to source install
if [ -n "$REF" ] && [ -z "$MODE" ]; then
MODE="source"
fi
# Check if bun is available
has_bun() {
command -v bun >/dev/null 2>&1
}
version_ge() {
current="$1"
minimum="$2"
current_major="${current%%.*}"
current_rest="${current#*.}"
current_minor="${current_rest%%.*}"
current_patch="${current_rest#*.}"
current_patch="${current_patch%%.*}"
minimum_major="${minimum%%.*}"
minimum_rest="${minimum#*.}"
minimum_minor="${minimum_rest%%.*}"
minimum_patch="${minimum_rest#*.}"
minimum_patch="${minimum_patch%%.*}"
if [ "$current_major" -ne "$minimum_major" ]; then
[ "$current_major" -gt "$minimum_major" ]
return $?
fi
if [ "$current_minor" -ne "$minimum_minor" ]; then
[ "$current_minor" -gt "$minimum_minor" ]
return $?
fi
[ "$current_patch" -ge "$minimum_patch" ]
}
require_bun_version() {
version_raw=$(bun --version 2>/dev/null || true)
if [ -z "$version_raw" ]; then
echo "Failed to read bun version"
exit 1
fi
version_clean=${version_raw%%-*}
if ! version_ge "$version_clean" "$MIN_BUN_VERSION"; then
echo "Bun ${MIN_BUN_VERSION} or newer is required. Current version: ${version_clean}"
echo "Upgrade Bun at https://bun.sh/docs/installation"
exit 1
fi
}
# Check if git is available
has_git() {
command -v git >/dev/null 2>&1
}
# Install bun
install_bun() {
echo "Installing bun..."
if command -v bash >/dev/null 2>&1; then
curl -fsSL https://bun.sh/install | bash
else
echo "bash not found; attempting install with sh..."
curl -fsSL https://bun.sh/install | sh
fi
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
require_bun_version
}
# Check if git-lfs is available
has_git_lfs() {
command -v git-lfs >/dev/null 2>&1
}
# Install via bun
install_via_bun() {
echo "Installing via bun..."
if [ -n "$REF" ]; then
if ! has_git; then
echo "git is required for --ref when installing from source"
exit 1
fi
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT
if git clone --depth 1 --branch "$REF" "https://github.com/${REPO}.git" "$TMP_DIR" >/dev/null 2>&1; then
:
else
git clone "https://github.com/${REPO}.git" "$TMP_DIR"
(cd "$TMP_DIR" && git checkout "$REF")
fi
# Pull LFS files
if has_git_lfs; then
(cd "$TMP_DIR" && git lfs pull)
fi
if [ ! -d "$TMP_DIR/packages/coding-agent" ]; then
echo "Expected package at ${TMP_DIR}/packages/coding-agent"
exit 1
fi
bun install -g "$TMP_DIR/packages/coding-agent" || {
echo "Failed to install from source"
exit 1
}
else
bun install -g "$PACKAGE" || {
echo "Failed to install $PACKAGE"
exit 1
}
fi
echo ""
echo "✓ Installed omp via bun"
echo "Run 'omp' to get started!"
}
# Install binary from GitHub releases
install_binary() {
# Detect platform
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$OS" in
Linux) PLATFORM="linux" ;;
Darwin) PLATFORM="darwin" ;;
*) echo "Unsupported OS: $OS"; exit 1 ;;
esac
case "$ARCH" in
x86_64|amd64) ARCH="x64" ;;
arm64|aarch64) ARCH="arm64" ;;
*) echo "Unsupported architecture: $ARCH"; exit 1 ;;
esac
BINARY="omp-${PLATFORM}-${ARCH}"
# Get release tag
if [ -n "$REF" ]; then
echo "Fetching release $REF..."
if RELEASE_JSON=$(curl -fsSL --connect-timeout 10 --max-time 60 "https://api.github.com/repos/${REPO}/releases/tags/${REF}"); then
LATEST=$(echo "$RELEASE_JSON" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
else
echo "Release tag not found: $REF"
echo "For branch/commit installs, use --source with --ref."
exit 1
fi
else
echo "Fetching latest release..."
RELEASE_JSON=$(curl -fsSL --connect-timeout 10 --max-time 60 "https://api.github.com/repos/${REPO}/releases/latest")
LATEST=$(echo "$RELEASE_JSON" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
fi
if [ -z "$LATEST" ]; then
echo "Failed to fetch release tag"
exit 1
fi
echo "Using version: $LATEST"
mkdir -p "$INSTALL_DIR"
# Download binary
BINARY_URL="https://github.com/${REPO}/releases/download/${LATEST}/${BINARY}"
echo "Downloading ${BINARY}..."
curl -fsSL --connect-timeout 10 --speed-limit 1024 --speed-time 30 "$BINARY_URL" -o "${INSTALL_DIR}/omp"
chmod +x "${INSTALL_DIR}/omp"
echo ""
echo "✓ Installed omp to ${INSTALL_DIR}/omp"
# Check if in PATH
case ":$PATH:" in
*":$INSTALL_DIR:"*) echo "Run 'omp' to get started!" ;;
*) echo "Add ${INSTALL_DIR} to your PATH, then run 'omp'" ;;
esac
}
# Main logic
case "$MODE" in
source)
if ! has_bun; then
install_bun
fi
require_bun_version
install_via_bun
;;
binary)
install_binary
;;
*)
# Default: use bun if available, otherwise binary
if has_bun; then
require_bun_version
install_via_bun
else
install_binary
fi
;;
esac
# Web Content from https://github.com/can1357/oh-my-pi
[Skip to content][1]
## Navigation Menu
Toggle navigation
[ Sign in ][2]
Appearance settings
* Platform
* AI CODE CREATION
* [
GitHub CopilotWrite better code with AI
][3]
* [
GitHub Copilot appDirect agents from issue to merge
][4]
* [
MCP Registry^{New}Integrate external tools
][5]
* DEVELOPER WORKFLOWS
* [
ActionsAutomate any workflow
][6]
* [
CodespacesInstant dev environments
][7]
* [
IssuesPlan and track work
][8]
* [
Code ReviewManage code changes
][9]
* APPLICATION SECURITY
* [
GitHub Advanced SecurityFind and fix vulnerabilities
][10]
* [
Code securitySecure your code as you build
][11]
* [
Secret protectionStop leaks before they start
][12]
* EXPLORE
* [Why GitHub][13]
* [Documentation][14]
* [Blog][15]
* [Changelog][16]
* [Marketplace][17]
[View all features][18]
* Solutions
* BY COMPANY SIZE
* [Enterprises][19]
* [Small and medium teams][20]
* [Startups][21]
* [Nonprofits][22]
* BY USE CASE
* [App Modernization][23]
* [DevSecOps][24]
* [DevOps][25]
* [CI/CD][26]
* [View all use cases][27]
* BY INDUSTRY
* [Healthcare][28]
* [Financial services][29]
* [Manufacturing][30]
* [Government][31]
* [View all industries][32]
[View all solutions][33]
* Resources
* EXPLORE BY TOPIC
* [AI][34]
* [Software Development][35]
* [DevOps][36]
* [Security][37]
* [View all topics][38]
* EXPLORE BY TYPE
* [Customer stories][39]
* [Events & webinars][40]
* [Ebooks & reports][41]
* [Business insights][42]
* [GitHub Skills][43]
* SUPPORT & SERVICES
* [Documentation][44]
* [Customer support][45]
* [Community forum][46]
* [Trust center][47]
* [Partners][48]
[View all resources][49]
* Open Source
* COMMUNITY
* [
GitHub SponsorsFund open source developers
][50]
* PROGRAMS
* [Security Lab][51]
* [Maintainer Community][52]
* [Accelerator][53]
* [GitHub Stars][54]
* [Archive Program][55]
* REPOSITORIES
* [Topics][56]
* [Trending][57]
* [Collections][58]
* Enterprise
* ENTERPRISE SOLUTIONS
* [
Enterprise platformAI-powered developer platform
][59]
* AVAILABLE ADD-ONS
* [
GitHub Advanced SecurityEnterprise-grade security features
][60]
* [
Copilot for BusinessEnterprise-grade AI features
][61]
* [
Premium SupportEnterprise-grade 24/7 support
][62]
* [Pricing][63]
Search or jump to...
# Search code, repositories, users, issues, pull requests...
Search
Clear
[Search syntax tips][64]
# Provide feedback
We read every piece of feedback, and take your input very seriously.
Include my email address so I can be contacted
Cancel Submit feedback
# Saved searches
## Use saved searches to filter your results more quickly
Name
Query
To see all available qualifiers, see our [documentation][65].
Cancel Create saved search
[ Sign in ][66]
[ Sign up ][67]
Appearance settings
Resetting focus
You signed in with another tab or window. [Reload][68] to refresh your session. You signed out in
another tab or window. [Reload][69] to refresh your session. You switched accounts on another tab or
window. [Reload][70] to refresh your session. Dismiss alert
[ can1357 ][71] / ** [oh-my-pi][72] ** Public
* [ Notifications ][73] You must be signed in to change notification settings
* [ Fork 1.5k ][74]
* [ Star 16.8k ][75]
* [ Code ][76]
* [ Issues 439 ][77]
* [ Pull requests 155 ][78]
* [ Discussions ][79]
* [ Actions ][80]
* [ Projects ][81]
* [ Security and quality 0 ][82]
* [ Insights ][83]
Additional navigation options
* [ Code ][84]
* [ Issues ][85]
* [ Pull requests ][86]
* [ Discussions ][87]
* [ Actions ][88]
* [ Projects ][89]
* [ Security and quality ][90]
* [ Insights ][91]
# can1357/oh-my-pi
main
[Branches][92][Tags][93]
Go to file
Code
Open more actions menu
## Folders and files
────────────────────────────────┬────────────────────────────────┬──────────────────┬───────────────
Name │Name │Last commit │Last commit
│ │message │date
────────────────────────────────┴────────────────────────────────┴──────────────────┴───────────────
## Latest commit
## History
[12,674 Commits][94]
[][95]12,674 Commits
────────────────────────────────┬────────────────────────────────┬──────────────────┬───────────────
[.github][96] │[.github][97] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[.omp][98] │[.omp][99] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[assets][100] │[assets][101] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[crates][102] │[crates][103] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[docs][104] │[docs][105] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[infra][106] │[infra][107] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[packages][108] │[packages][109] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[patches][110] │[patches][111] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[python][112] │[python][113] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[scripts][114] │[scripts][115] │ │
────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
[types/assets][116] │[types/assets][117] │ │
────────────────────────────────┼───────────────────… (144 chars truncated)
… (1210 lines truncated)
<truncation_notice>
Full output written to: /var/folders/d9/mzhyr7lx6xbf236j5ll9v_300000gn/T/devin-overflows-501/cc8f14a9/content.txt
</truncation_notice>Let me read the README more thoroughly. Let me check the docs directory and the README for setup instructions.
Let me read the full README to understand setup requirements.
{
"file_path": "/var/folders/d9/mzhyr7lx6xbf236j5ll9v_300000gn/T/devin-overflows-501/cc8f14a9/content.txt"
}<file-view path="/var/folders/d9/mzhyr7lx6xbf236j5ll9v_300000gn/T/devin-overflows-501/cc8f14a9/content.txt" start_line="1" end_line="445" total_lines="1427">
1|# Web Content from https://github.com/can1357/oh-my-pi
2|
3|[Skip to content][1]
4|
5|## Navigation Menu
6|
7|Toggle navigation
8|[ Sign in ][2]
9|Appearance settings
10|* Platform
11| * AI CODE CREATION
12| * [
13| GitHub CopilotWrite better code with AI
14| ][3]
15| * [
16| GitHub Copilot appDirect agents from issue to merge
17| ][4]
18| * [
19| MCP Registry^{New}Integrate external tools
20| ][5]
21| * DEVELOPER WORKFLOWS
22| * [
23| ActionsAutomate any workflow
24| ][6]
25| * [
26| CodespacesInstant dev environments
27| ][7]
28| * [
29| IssuesPlan and track work
30| ][8]
31| * [
32| Code ReviewManage code changes
33| ][9]
34| * APPLICATION SECURITY
35| * [
36| GitHub Advanced SecurityFind and fix vulnerabilities
37| ][10]
38| * [
39| Code securitySecure your code as you build
40| ][11]
41| * [
42| Secret protectionStop leaks before they start
43| ][12]
44| * EXPLORE
45| * [Why GitHub][13]
46| * [Documentation][14]
47| * [Blog][15]
48| * [Changelog][16]
49| * [Marketplace][17]
50| [View all features][18]
51|* Solutions
52| * BY COMPANY SIZE
53| * [Enterprises][19]
54| * [Small and medium teams][20]
55| * [Startups][21]
56| * [Nonprofits][22]
57| * BY USE CASE
58| * [App Modernization][23]
59| * [DevSecOps][24]
60| * [DevOps][25]
61| * [CI/CD][26]
62| * [View all use cases][27]
63| * BY INDUSTRY
64| * [Healthcare][28]
65| * [Financial services][29]
66| * [Manufacturing][30]
67| * [Government][31]
68| * [View all industries][32]
69| [View all solutions][33]
70|* Resources
71| * EXPLORE BY TOPIC
72| * [AI][34]
73| * [Software Development][35]
74| * [DevOps][36]
75| * [Security][37]
76| * [View all topics][38]
77| * EXPLORE BY TYPE
78| * [Customer stories][39]
79| * [Events & webinars][40]
80| * [Ebooks & reports][41]
81| * [Business insights][42]
82| * [GitHub Skills][43]
83| * SUPPORT & SERVICES
84| * [Documentation][44]
85| * [Customer support][45]
86| * [Community forum][46]
87| * [Trust center][47]
88| * [Partners][48]
89| [View all resources][49]
90|* Open Source
91| * COMMUNITY
92| * [
93| GitHub SponsorsFund open source developers
94| ][50]
95| * PROGRAMS
96| * [Security Lab][51]
97| * [Maintainer Community][52]
98| * [Accelerator][53]
99| * [GitHub Stars][54]
100| * [Archive Program][55]
101| * REPOSITORIES
102| * [Topics][56]
103| * [Trending][57]
104| * [Collections][58]
105|* Enterprise
106| * ENTERPRISE SOLUTIONS
107| * [
108| Enterprise platformAI-powered developer platform
109| ][59]
110| * AVAILABLE ADD-ONS
111| * [
112| GitHub Advanced SecurityEnterprise-grade security features
113| ][60]
114| * [
115| Copilot for BusinessEnterprise-grade AI features
116| ][61]
117| * [
118| Premium SupportEnterprise-grade 24/7 support
119| ][62]
120|* [Pricing][63]
121|Search or jump to...
122|
123|# Search code, repositories, users, issues, pull requests...
124|
125|Search
126|Clear
127|[Search syntax tips][64]
128|
129|# Provide feedback
130|
131|We read every piece of feedback, and take your input very seriously.
132|
133|Include my email address so I can be contacted
134|Cancel Submit feedback
135|
136|# Saved searches
137|
138|## Use saved searches to filter your results more quickly
139|
140|Name
141|Query
142|
143|To see all available qualifiers, see our [documentation][65].
144|
145|Cancel Create saved search
146|[ Sign in ][66]
147|[ Sign up ][67]
148|Appearance settings
149|Resetting focus
150|You signed in with another tab or window. [Reload][68] to refresh your session. You signed out in
151|another tab or window. [Reload][69] to refresh your session. You switched accounts on another tab or
152|window. [Reload][70] to refresh your session. Dismiss alert
153|[ can1357 ][71] / ** [oh-my-pi][72] ** Public
154|* [ Notifications ][73] You must be signed in to change notification settings
155|* [ Fork 1.5k ][74]
156|* [ Star 16.8k ][75]
157|* [ Code ][76]
158|* [ Issues 439 ][77]
159|* [ Pull requests 155 ][78]
160|* [ Discussions ][79]
161|* [ Actions ][80]
162|* [ Projects ][81]
163|* [ Security and quality 0 ][82]
164|* [ Insights ][83]
165|Additional navigation options
166|* [ Code ][84]
167|* [ Issues ][85]
168|* [ Pull requests ][86]
169|* [ Discussions ][87]
170|* [ Actions ][88]
171|* [ Projects ][89]
172|* [ Security and quality ][90]
173|* [ Insights ][91]
174|
175|# can1357/oh-my-pi
176|
177|main
178|[Branches][92][Tags][93]
179|Go to file
180|Code
181|Open more actions menu
182|
183|## Folders and files
184|
185|────────────────────────────────┬────────────────────────────────┬──────────────────┬───────────────
186|Name │Name │Last commit │Last commit
187| │ │message │date
188|────────────────────────────────┴────────────────────────────────┴──────────────────┴───────────────
189|## Latest commit
190|
191|## History
192|
193|[12,674 Commits][94]
194|[][95]12,674 Commits
195|────────────────────────────────┬────────────────────────────────┬──────────────────┬───────────────
196|[.github][96] │[.github][97] │ │
197|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
198|[.omp][98] │[.omp][99] │ │
199|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
200|[assets][100] │[assets][101] │ │
201|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
202|[crates][102] │[crates][103] │ │
203|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
204|[docs][104] │[docs][105] │ │
205|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
206|[infra][106] │[infra][107] │ │
207|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
208|[packages][108] │[packages][109] │ │
209|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
210|[patches][110] │[patches][111] │ │
211|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
212|[python][112] │[python][113] │ │
213|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
214|[scripts][114] │[scripts][115] │ │
215|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
216|[types/assets][116] │[types/assets][117] │ │
217|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
218|[.fallowrc.jsonc][118] │[.fallowrc.jsonc][119] │ │
219|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
220|[.gitattributes][120] │[.gitattributes][121] │ │
221|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
222|[.gitignore][122] │[.gitignore][123] │ │
223|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
224|[AGENTS.md][124] │[AGENTS.md][125] │ │
225|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
226|[CONTRIBUTING.md][126] │[CONTRIBUTING.md][127] │ │
227|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
228|[Cargo.lock][128] │[Cargo.lock][129] │ │
229|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
230|[Cargo.toml][130] │[Cargo.toml][131] │ │
231|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
232|[Dockerfile][132] │[Dockerfile][133] │ │
233|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
234|[Dockerfile.dockerignore][134] │[Dockerfile.dockerignore][135] │ │
235|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
236|[Dockerfile.robomp][136] │[Dockerfile.robomp][137] │ │
237|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
238|[Dockerfile.robomp.dockerignore]│[Dockerfile.robomp.dockerignore]│ │
239|[138] │[139] │ │
240|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
241|[LICENSE][140] │[LICENSE][141] │ │
242|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
243|[README.md][142] │[README.md][143] │ │
244|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
245|[biome.json][144] │[biome.json][145] │ │
246|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
247|[bun.lock][146] │[bun.lock][147] │ │
248|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
249|[bunfig.toml][148] │[bunfig.toml][149] │ │
250|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
251|[package.json][150] │[package.json][151] │ │
252|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
253|[rust-analyzer.toml][152] │[rust-analyzer.toml][153] │ │
254|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
255|[rust-toolchain.toml][154] │[rust-toolchain.toml][155] │ │
256|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
257|[rustfmt.toml][156] │[rustfmt.toml][157] │ │
258|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
259|[tsconfig.base.json][158] │[tsconfig.base.json][159] │ │
260|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
261|[tsconfig.json][160] │[tsconfig.json][161] │ │
262|────────────────────────────────┼────────────────────────────────┼──────────────────┼───────────────
263|[tsconfig.tools.json][162] │[tsconfig.tools.json][163] │ │
264|────────────────────────────────┴────────────────────────────────┴──────────────────┴───────────────
265|View all files
266|─────────────────────────────────────────────────────────────────
267|
268|## Repository files navigation
269|* [README][164]
270|* [Contributing][165]
271|* [MIT license][166]
272|* [Security][167]
273|
274|More items
275|
276|[[omp]][168]
277|
278|**A coding agent with the IDE wired in.** **[omp.sh][169]**
279|
280|[[npm version]][170] [[Changelog]][171] [[CI]][172] [[License]][173] [[TypeScript]][174]
281|[[Rust]][175] [[Bun]][176] [[Discord]][177]
282|
283|Fork of [Pi][178] by [@mariozechner][179]
284|
285|The most capable agent surface that ships. Continuously tuned by real-world use — complete out of
286|the box, open all the way down.
287|
288|**40+** providers · **32** built-in tools · **14** lsp ops · **28** dap ops · **~55k** lines of Rust
289|core.
290|
291|## Install
292|
293|**macOS · Linux**
294|
295|curl -fsSL https://omp.sh/install | sh
296|
297|**Homebrew**
298|
299|brew install can1357/tap/omp
300|
301|**Bun (recommended)**
302|
303|bun install -g @oh-my-pi/pi-coding-agent
304|
305|**Windows (PowerShell)**
306|
307|irm https://omp.sh/install.ps1 | iex
308|
309|**Pinned versions (mise)**
310|
311|mise use -g github:can1357/oh-my-pi
312|
313|macOS · Linux · Windows · bun ≥ 1.3.14
314|
315|### Shell completions
316|
317|`omp` generates its own completion scripts for **bash**, **zsh**, and **fish** from the live
318|command/flag metadata, so they never drift from the actual CLI. Subcommands, flags, and enum values
319|complete statically; model names (`--model`, `--smol`, `--slow`, `--plan`) resolve against the
320|bundled model catalog and `--resume` against your on-disk sessions.
321|
322|# zsh — add to ~/.zshrc (or write the output into a file on your $fpath)
323|eval "$(omp completions zsh)"
324|
325|# bash — add to ~/.bashrc
326|eval "$(omp completions bash)"
327|
328|# fish
329|omp completions fish > ~/.config/fish/completions/omp.fish
330|
331|## Every tool, *benchmaxxed*.
332|
333|Edits that land on the first attempt. Reads that summarize files instead of dumping their content.
334|Searches that return instantly. Pick any model — omp will get it right.
335|
336|────────────────┬────────────┬─────────────────────────────────────────────────────────────────────
337|model │metric │what
338|────────────────┼────────────┼─────────────────────────────────────────────────────────────────────
339|Grok Code Fast 1│6.7% → 68.3%│Tenfold lift the moment the edit format stops eating the model alive.
340|────────────────┼────────────┼─────────────────────────────────────────────────────────────────────
341|Gemini 3 Flash │+5 pp │Over str_replace — beats Google's own best attempt at the format.
342|────────────────┼────────────┼─────────────────────────────────────────────────────────────────────
343|Grok 4 Fast │−61% tokens │Output collapses once the retry loop on bad diffs disappears.
344|────────────────┼────────────┼─────────────────────────────────────────────────────────────────────
345|MiniMax │2.1× │Pass rate more than doubles. Same weights, same prompt.
346|────────────────┴────────────┴─────────────────────────────────────────────────────────────────────
347|* `read` : summarized snippets · ideal defaults · selector hit rate
348|* `search` : fastest in the west
349|* `lsp` : everything your IDE knows, the agent knows
350|* `prompts` : adjusted relentlessly for each model
351|
352|[Read the full post ↗][180]
353|
354|## The Pi *you love*, with **batteries included**.
355|
356|Originally built on [Mario Zechner][181]'s wonderful [Pi][182], omp adds everything you're missing.
357|
358|### 01 · Code execution w/ tool-calling
359|
360|Most harnesses give the agent a Python sandbox and call it done. Ours runs persistent Python and a
361|Bun worker, and either kernel can call back into the agent's own tools — read, search, task — over a
362|loopback bridge. The agent loads a CSV with tool.read from inside Python, charts it from JavaScript,
363|and never leaves the cell.
364|
365|[[omp TUI: a single eval session with [1/2] pandas describe (Python) printing a real
366|DataFrame.describe() table, followed by [2/2] top scorer (JavaScript) running a reduce. Footer:
367|'Both kernels ran in one session.']][183]
368|
369|### 02 · LSP wired into every write
370|
371|Ask for a rename and you get a rename. The call goes through workspace/willRenameFiles, so
372|re-exports, barrel files, and aliased imports update before the file moves. Everything your IDE
373|knows, the agent knows.
374|
375|[[omp TUI: LSP references returns five hits across three files for the symbol formatBytes, then LSP
376|rename applies the change with edits to format.ts/report.ts/cli.ts, then a Search formatBytes 0
377|matches confirmation. Final line: 'Rename complete. Five edits across three files…'.]][184]
378|
379|### 03 · Drives a real debugger
380|
381|A C binary segfaults: the agent attaches lldb, steps to the bad pointer, reads the frame. A Go
382|service hangs: it attaches dlv and walks the goroutines. A Python process is wedged: debugpy, pause,
383|inspect, evaluate. Most agents are still sprinkling print statements.
384|
385|[[omp TUI: a live lldb-dap session against a native binary at /tmp/omp-native/demo.
386|Adapter=lldb-dap, Status=stopped, Frame=xorshift32, Instruction pointer 0x10000055C, Location
387|demo.c:6:10. Debug scopes and Debug variables cards show locals (x = 57351) and the agent confirms
388|the math: x went from 7 → 57351 (= 7 ^ (7<<13)).]][185]
389|
390|*[Watch the capture ↗][186]*
391|
392|### 04 · Time-traveling stream rules
393|
394|Your rules sit dormant until the model goes off-script. A regex match aborts the stream mid-token,
395|injects the rule as a system reminder, and retries from the same point. You get course-correction
396|without paying context tax on every turn. Injections survive compaction, so the fix sticks.
397|
398|[[omp TUI: agent reading src.rs and about to write Box::leak when the request aborts (red Error:
399|Request was aborted), an amber ⚠ Injecting rule: box-leak card injects the rule body Don't reach for
400|Box::leak in production code paths, and the agent then course-corrects by proposing Arc<str> and
401|asking the user to confirm.]][187]
402|
403|*[Watch the capture ↗][188]*
404|
405|### 05 · First-class subagents
406|
407|Split a job across workers and get typed results back. task fans out into isolated worktrees, each
408|worker runs its own tool surface, and the final yield is a schema-validated object the parent reads
409|directly. No prose to parse, no merge conflicts between siblings, no orphaned edits.
410|
411|[[omp TUI showing task spawning two subagents ComponentsExports and RoutesExports, the constraints
412|block requiring an IRC DM between peers, the per-subagent status cards with cost and duration, and a
413|final Findings section listing both exports plus an honest 'IRC coordination note' about a one-sided
414|handshake.]][189]
415|
416|*[Watch the capture ↗][190]*
417|
418|### 06 · A second model, watching every turn.
419|
420|Pair a reviewer model to the 'advisor' role and it reads every turn the main agent takes, injecting
421|notes inline — a quiet aside, a concern, or a hard blocker. It runs on its own context and its own
422|model, so it catches what the doer rushed past. The main agent sees the note and course-corrects, or
423|tells you why it won't.
424|
425|[[omp TUI: /advisor status shows the advisor running on openai-codex/gpt-5.5; after the main agent
426|scopes a catch to ENOENT instead of swallowing every error, an amber 'Advisor 1 note (concern)' card
427|warns the fix no longer matches the user's literal acceptance criterion.]][191]
428|
429|*[Watch the capture ↗][192]*
430|
431|### 07 · Hand someone the link, they're in.
432|
433|/collab puts your live session on a relay and hands back a link — and a QR. A teammate joins from
434|another terminal with omp join, or just opens it in a browser. Share read-write to pair on the same
435|agent, or /collab view for a read-only link anyone can watch but no one can steer. Frames are sealed
436|client-side; the relay never sees your keys.
437|
438|[[omp TUI: /collab view prints 'Collab session started!' with an omp join command, a my.omp.sh
439|browser link, the note 'Anyone with this link can watch the session but cannot prompt the agent',
440|and a large scannable QR code.]][193]
441|
442|*[Watch the capture ↗][194]*
443|
444|### 08 · Read a pdf on arxiv, why not?
</file-view>I have enough information. Let me check the current environment - is bun installed? Is omp already installed? Let me check.
I have enough info. Let me check the current environment before installing.
{
"command": "command -v omp && omp --version; command -v bun && bun --version; command -v brew && brew --version | head -1"
}Output from command in shell 49aad2: /Users/root1/.bun/bin/bun 1.3.14 /opt/homebrew/bin/brew Homebrew 6.0.8 Exit code: 0
Bun is installed at version 1.3.14 (exactly the minimum required). omp is not installed. I have three install options: 1. `curl -fsSL https://omp.sh/install | sh` - uses bun since bun is available 2. `brew install can1357/tap/omp` - Homebrew 3. `bun install -g @oh-my-pi/pi-coding-agent` - Bun directly (recommended per README) The README says Bun is recommended. Let me ask the user which install method they prefer. Actually, let me just go with the recommended Bun install since bun is already at the right version. But I should ask about the install method since there are meaningful choices. Actually, the user said "set this up" - they want it installed. Let me just go with the recommended approach (bun). But there's also the question of shell completions and configuration (model provider, API keys). Let me ask a quick question about install method and then proceed. Actually, let me just install it via bun (recommended) and then set up shell completions for zsh. I'll ask about the install method to be safe since homebrew is also available and some users prefer it for manageability.
bun 1.3.14 is installed (meets the minimum), and Homebrew is available too. omp isn't installed yet. Let me ask about your preferred install method.
{
"questions": [
{
"header": "Install method",
"question": "How would you like to install omp?",
"options": [
{
"label": "Bun (recommended)",
"description": "bun install -g @oh-my-pi/pi-coding-agent. README's recommended method; bun 1.3.14 is already installed."
},
{
"label": "Homebrew",
"description": "brew install can1357/tap/omp. Easier to upgrade/uninstall via brew."
},
{
"label": "Install script",
"description": "curl -fsSL https://omp.sh/install | sh. Uses bun if available, otherwise downloads a prebuilt binary."
}
]
},
{
"header": "Shell completions",
"question": "Set up zsh shell completions for omp?",
"options": [
{
"label": "Yes, add to ~/.zshrc",
"description": "Adds eval \"$(omp completions zsh)\" to ~/.zshrc so completions stay in sync with the CLI."
},
{
"label": "No, skip",
"description": "Skip completions setup for now."
}
]
}
]
}User answered your questions:
{
"Set up zsh shell completions for omp?": {
"selected": [
"Yes, add to ~/.zshrc"
]
},
"How would you like to install omp?": {
"selected": [
"Bun (recommended)"
]
}
}Installing via Bun and setting up zsh completions.
{
"todos": [
{
"content": "Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent)",
"status": "in_progress"
},
{
"content": "Verify omp installation (omp --version)",
"status": "pending"
},
{
"content": "Add zsh completions to ~/.zshrc",
"status": "pending"
},
{
"content": "Run omp and confirm it starts / guide on provider setup",
"status": "pending"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable Current todo list: 1. [~] Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent) [in_progress] 2. [ ] Verify omp installation (omp --version) [pending] 3. [ ] Add zsh completions to ~/.zshrc [pending] 4. [ ] Run omp and confirm it starts / guide on provider setup [pending]
{
"command": "bun install -g @oh-my-pi/pi-coding-agent 2>&1",
"timeout": 180000
}bun add v1.3.14 (0d9b296a) Resolving dependencies === Stopped waiting for output after 5.0 seconds. Command running in background with ID: 7f9e5d. Run get_output with timeout if you need to wait.
{
"shell_id": "7f9e5d",
"timeout": 120000
}Resolved, downloaded and extracted [1010] Saved lockfile installed @oh-my-pi/pi-coding-agent@16.3.12 with binaries: - omp 240 packages installed [6.80s] Blocked 2 postinstalls. Run `bun pm -g untrusted` for details. Exit code: 0
Installed. There were 2 blocked postinstalls - let me check what they are, they might be important (e.g., native binary setup).
Installed omp v16.3.12. Two postinstalls were blocked by Bun's trusted-scripts feature — let me check what they are, since they may be important for native functionality.
{
"command": "bun pm -g untrusted 2>&1; echo \"---\"; which omp; omp --version 2>&1"
}Output from command in shell 9b3b12: bun pm untrusted v1.3.14 (0d9b296a) ./node_modules/onnxruntime-node @1.24.3 » [postinstall]: node ./script/install ./node_modules/protobufjs @7.6.5 » [postinstall]: node scripts/postinstall These dependencies had their lifecycle scripts blocked during install. If you trust them and wish to run their scripts, use `bun pm trust`. --- /Users/root1/.bun/bin/omp omp/16.3.12 Exit code: 0
omp is installed and working. The two blocked postinstalls are: 1. `onnxruntime-node` - this is for ONNX runtime (likely used for local embeddings/models). The postinstall downloads native binaries. 2. `protobufjs` - protobuf postinstall, usually just generates code or downloads nothing critical. The onnxruntime-node one is likely important if omp uses local embeddings. Let me trust these to be safe, since they're well-known packages. Actually, let me check if omp actually needs onnxruntime-node. It might be an optional dependency for local embeddings. Let me trust both since they're from reputable packages (onnxruntime-node is from Microsoft, protobufjs is widely used). Actually, let me be careful. The user wanted me to "set this up" - I should make sure it actually works. Let me trust these postinstalls so the native binaries are available, then verify omp runs.
omp 16.3.12 is installed and the CLI runs. The two blocked postinstalls are from reputable packages:
onnxruntime-node (Microsoft) — downloads native ONNX runtime binaries, used for local embeddingsprotobufjs — standard protobuf codegen postinstallI'll trust both so native functionality works, then verify omp starts.
{
"command": "bun pm -g trust onnxruntime-node protobufjs 2>&1",
"timeout": 120000
}Output from command in shell 5be66b: bun pm trust v1.3.14 (0d9b296a) ./node_modules/onnxruntime-node @1.24.3 ✓ [postinstall]: node ./script/install ./node_modules/protobufjs @7.6.5 ✓ [postinstall]: node scripts/postinstall 2 scripts ran across 2 packages [119.00ms] Exit code: 0
{
"todos": [
{
"content": "Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent)",
"status": "completed"
},
{
"content": "Verify omp installation (omp --version)",
"status": "completed"
},
{
"content": "Add zsh completions to ~/.zshrc",
"status": "in_progress"
},
{
"content": "Run omp and confirm it starts / guide on provider setup",
"status": "pending"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable Current todo list: 1. [x] Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent) [completed] 2. [x] Verify omp installation (omp --version) [completed] 3. [~] Add zsh completions to ~/.zshrc [in_progress] 4. [ ] Run omp and confirm it starts / guide on provider setup [pending]
Now let me check the current ~/.zshrc to see if completions are already set up, and verify the completion command works.
{
"command": "omp completions zsh 2>&1 | head -20; echo \"---EXIT: $?\""
}Output from command in shell 283160:
#compdef omp
# zsh completion for omp — generated by `omp completions zsh`
_omp_call() {
local kind=$1
local -a items
local line
for line in "${(@f)$(command omp __complete $kind -- "$PREFIX" 2>/dev/null)}"; do
[[ -z $line ]] && continue
items+=( "${line//$'\t'/:}" )
done
_describe -t "$kind" "$kind" items
}
_omp_models_list() {
local -a items
local line
for line in "${(@f)$(command omp __complete models 2>/dev/null)}"; do
[[ -z $line ]] && continue
items+=( "${line%%$'\t'*}" )
done
---EXIT: 0
Exit code: 0Completions generate correctly. Let me check the current ~/.zshrc for any existing omp setup before appending.
{
"pattern": "omp completions",
"path": "/Users/root1/.zshrc",
"output_mode": "content"
}No matches found for pattern 'omp completions' in /Users/root1/.zshrc
{
"file_path": "/Users/root1/.zshrc"
}<file-view path="/Users/root1/.zshrc" start_line="1" end_line="27" total_lines="27"> 1|alias codex="codex --search --yolo" 2|alias devin='devin --permission-mode bypass' 3|alias whisper='python3 ~/Downloads/utilities/whisper_x/whisper_transcribe.py' 4|export PATH="$HOME/.local/bin:$PATH" 5|export PATH="/Library/Frameworks/Python.framework/Versions/3.12/bin:$PATH" 6| 7|# pnpm 8|export PNPM_HOME="/Users/root1/Library/pnpm" 9|case ":$PATH:" in 10| *":$PNPM_HOME:"*) ;; 11| *) export PATH="$PNPM_HOME:$PATH" ;; 12|esac 13|# pnpm end 14| 15|# bun completions (disabled due to syntax error) 16|# [ -s "/Users/root1/.bun/_bun" ] && source "/Users/root1/.bun/_bun" 17| 18|# bun 19|export BUN_INSTALL="$HOME/.bun" 20|export PATH="$BUN_INSTALL/bin:$PATH" 21| 22|# Added by Devin 23|export PATH="/Users/root1/.codeium/windsurf/bin:$PATH" 24| 25| 26|# Added by Antigravity CLI installer 27|export PATH="/Users/root1/.local/bin:$PATH" </file-view>
{
"replace_all": false,
"file_path": "/Users/root1/.zshrc",
"old_string": "# Added by Antigravity CLI installer\nexport PATH=\"/Users/root1/.local/bin:$PATH\"",
"new_string": "# Added by Antigravity CLI installer\nexport PATH=\"/Users/root1/.local/bin:$PATH\"\n\n# omp (oh-my-pi) completions\neval \"$(omp completions zsh)\""
}The file /Users/root1/.zshrc has been updated. Here's the result of running `cat -n` on a snippet of the edited file: 22|# Added by Devin 23|export PATH="/Users/root1/.codeium/windsurf/bin:$PATH" 24| 25| 26|# Added by Antigravity CLI installer 27|export PATH="/Users/root1/.local/bin:$PATH" 28| 29|# omp (oh-my-pi) completions 30|eval "$(omp completions zsh)"
{
"todos": [
{
"content": "Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent)",
"status": "completed"
},
{
"content": "Verify omp installation (omp --version)",
"status": "completed"
},
{
"content": "Add zsh completions to ~/.zshrc",
"status": "completed"
},
{
"content": "Run omp and confirm it starts / guide on provider setup",
"status": "in_progress"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable Current todo list: 1. [x] Install omp via bun (bun install -g @oh-my-pi/pi-coding-agent) [completed] 2. [x] Verify omp installation (omp --version) [completed] 3. [x] Add zsh completions to ~/.zshrc [completed] 4. [~] Run omp and confirm it starts / guide on provider setup [in_progress]
Now let me check what providers/config omp needs and whether there's existing config, so I can guide on provider setup.
{
"command": "omp --help 2>&1 | head -60"
}Output from command in shell aa6f67:
omp v16.3.12
USAGE
$ omp [COMMAND]
ARGUMENTS
MESSAGES Messages to send (prefix files with @)
FLAGS
--model=<value> Model to use (fuzzy match: "opus", "gpt-5.2", or "openai/gpt-5.2")
--smol=<value> Smol/fast model for lightweight tasks (or PI_SMOL_MODEL env)
--slow=<value> Slow/reasoning model for thorough analysis (or PI_SLOW_MODEL env)
--plan=<value> Plan model for architectural planning (or PI_PLAN_MODEL env)
--provider=<value> Provider to use (legacy; prefer --model)
--api-key=<value> API key (defaults to env vars)
--system-prompt=<value> System prompt (default: coding assistant prompt)
--append-system-prompt=<value> Append text or file contents to the system prompt
--allow-home Allow starting in ~ without auto-switching to a temp dir
--profile=<value> Use an isolated profile for auth, sessions, settings, and caches
--alias=<value> Create a shell shortcut for the selected profile and exit
--cwd=<value> Directory to start in (overrides the launch cwd)
--mode=<value> Output mode: text (default), json, rpc, or rpc-ui
--config=<value> Load an extra config.yml-style overlay for this run (repeatable)
-p, --print Non-interactive mode: process prompt and exit
-c, --continue Continue previous session
-r, --resume=<value> Resume a session (by ID prefix, path, or picker if omitted)
--session-dir=<value> Directory for session storage and lookup
--no-session Don't save session (ephemeral)
--models=<value> Comma-separated model patterns for Ctrl+P cycling
--no-tools Disable all built-in tools
--no-lsp Disable LSP tools, formatting, and diagnostics
--no-pty Disable PTY-based interactive bash execution
--tools=<value> Comma-separated list of tools to enable (default: all)
--thinking=<value> Set thinking level: off, minimal, low, medium, high, xhigh, auto
--hide-thinking Hide thinking blocks in TUI output (display only, does not disable model thinking)
--advisor Enable the advisor runtime (passively reviews each turn and injects notes)
--hook=<value> Load a hook/extension file (can be used multiple times)
-e, --extension=<value> Load an extension file (can be used multiple times)
--no-extensions Disable extension discovery (explicit -e paths still work)
--no-skills Disable skills discovery and loading
--skills=<value> Comma-separated glob patterns to filter skills (e.g., git-*,docker)
--no-rules Disable rules discovery and loading
--export=<value> Export session file to HTML and exit
--no-title Disable title auto-generation
--print-thoughts Include thinking blocks in print mode text output
--max-time=<value> Stop the session after this many seconds
--auto-approve Auto-approve all tool calls (skip approval prompts)
--approval-mode=<value> Override tools.approvalMode for this session (always-ask|write|yolo)
EXAMPLES
# Interactive mode
omp
# Interactive mode with initial prompt
omp "List all .ts files in src/"
# Include files in initial message
omp @prompt.md @image.png "What color is the sky?"
# Non-interactive mode (process and exit)
omp -p "List all .ts files in src/"
# Continue previous session
omp --continue "What did we discuss?"
… (123 lines truncated)
Exit code: 0
`| head -60` was parsed out (60 of 183 total lines shown).
<truncation_notice>
Full output written to: /var/folders/d9/mzhyr7lx6xbf236j5ll9v_300000gn/T/devin-overflows-501/b59cab4b/content.txt
</truncation_notice>Let me check the auth/provider setup. omp uses env vars for API keys. Let me check what env vars it looks for and whether the user has any set in ~/.env. Let me also check the config file location.
Let me check the auth/provider setup — omp uses env vars for API keys, and per the AGENTS.md, secrets live in ~/.env.
{
"command": "ls -la ~/.config/omp 2>&1; echo \"---\"; ls -la ~/.omp 2>&1; echo \"--- env keys (names only) ---\"; set -a; . ~/.env 2>/dev/null; set +a; env | grep -iE 'API_KEY|ANTHROPIC|OPENAI|GROQ|GROK|XAI|GEMINI|GOOGLE|DEEPSEEK|MISTRAL|TOGETHER|FIREWORKS|OPENROUTER|PI_' | sed 's/=.*/=<set>/' | sort"
}Output from command in shell cda642: ls: /Users/root1/.config/omp: No such file or directory --- ls: /Users/root1/.omp: No such file or directory --- env keys (names only) --- HUD_API_KEY=<set> STRIPE_API_KEY=<set> Exit code: 0
No AI provider API keys are set in ~/.env. The user has HUD_API_KEY and STRIPE_API_KEY but no ANTHROPIC_API_KEY, OPENAI_API_KEY, etc. omp needs at least one provider API key to function. Let me check what providers omp supports and what env vars it expects. Let me look at the full help output for auth info, and check the docs.
No AI provider keys are set in ~/.env yet — omp needs at least one to function. Let me check what providers/env vars omp supports so I can guide you.
{
"command": "omp --help 2>&1 | sed -n '60,200p'"
}Output from command in shell a53a4d:
omp --continue "What did we discuss?"
# Create a shell shortcut for a work profile
omp --profile work --alias omp-work
# Use different model (fuzzy matching)
omp --model opus "Help me refactor this code"
# Limit model cycling to specific models
omp --models claude-sonnet,claude-haiku,gpt-4o
# Export a session file to HTML
omp --export ~/.omp/agent/sessions/--path--/session.jsonl
COMMANDS
acp Run Oh My Pi as an ACP (Agent Client Protocol) server over stdio
agents Manage bundled task agents
auth-broker Manage the omp auth-broker (credential vault)
auth-gateway Run an auth-gateway forward proxy backed by the configured broker
bench Benchmark models with the same prompt: time-to-first-token and generation throughput (tokens/s)
commit Generate a commit message and update changelogs
completions Print a shell completion script (bash, zsh, or fish)
config Manage configuration settings
dry-balance Dry-run OAuth account balancing across random session ids
gallery Preview tool renderers across streaming, in-progress, success, and failure states
gc Run storage garbage collection
grep Test grep tool
grievances View, clean, or push reported tool issues (auto-QA grievances)
install Install or link an extension package (alias of `plugin install`/`plugin link`)
join Join a shared collab session (same as /join)
models List, search, and refresh available models
plugin Manage plugins (install, uninstall, list, etc.)
read Show what the read tool will return for a path, URL, or internal URI
say Synthesize text with the local TTS engine and play it through the speakers
search Test web search providers
setup Run onboarding setup or install dependencies for optional features
shell Interactive shell console
ssh Manage SSH host configurations
stats View usage statistics
tiny-models Download tiny local models (session titles + memory)
token Get the API key or OAuth token for a provider
ttsr Inspect and test Time-Traveling Stream Rules (TTSR)
update Check for and install updates
usage Show provider usage limits for every authenticated account
worktree List or clear agent-managed git worktrees (~/.omp/wt)
Environment Variables:
# Core Providers
ANTHROPIC_API_KEY - Anthropic Claude models
ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth (takes precedence over API key)
CLAUDE_CODE_USE_FOUNDRY - Enable Anthropic Foundry mode (uses Foundry endpoint + mTLS)
FOUNDRY_BASE_URL - Anthropic Foundry base URL (e.g., https://<foundry-host>)
ANTHROPIC_FOUNDRY_API_KEY - Anthropic token used as Authorization: Bearer <token> in Foundry mode
ANTHROPIC_CUSTOM_HEADERS - Extra headers for Foundry or any custom ANTHROPIC_BASE_URL gateway (e.g., "user-id: USERNAME")
CLAUDE_CODE_CLIENT_CERT - Client certificate (PEM path or inline PEM) for mTLS
CLAUDE_CODE_CLIENT_KEY - Client private key (PEM path or inline PEM) for mTLS
NODE_EXTRA_CA_CERTS - CA bundle path (or inline PEM) for server certificate validation
OPENAI_API_KEY - OpenAI GPT models
GEMINI_API_KEY - Google Gemini models
COPILOT_GITHUB_TOKEN - GitHub Copilot
# Additional LLM Providers
AZURE_OPENAI_API_KEY - Azure OpenAI models
GROQ_API_KEY - Groq models
CEREBRAS_API_KEY - Cerebras models
XAI_API_KEY - xAI Grok models
OPENROUTER_API_KEY - OpenRouter aggregated models
KILO_API_KEY - Kilo Gateway models
MISTRAL_API_KEY - Mistral models
ZAI_API_KEY - z.ai models (ZhipuAI/GLM)
UMANS_AI_CODING_PLAN_API_KEY - Umans AI Coding Plan models
UMANS_WEBSEARCH_PROVIDER - Umans gateway web search backend (native or exa)
MINIMAX_API_KEY - MiniMax models
OPENCODE_API_KEY - OpenCode Zen/OpenCode Go models
CURSOR_ACCESS_TOKEN - Cursor AI models
AI_GATEWAY_API_KEY - Vercel AI Gateway
WAFER_SERVERLESS_API_KEY - Wafer Serverless (pay-as-you-go)
# Cloud Providers
AWS_PROFILE - AWS Bedrock (or AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY)
GOOGLE_CLOUD_PROJECT - Google Vertex AI (requires GOOGLE_CLOUD_LOCATION)
GOOGLE_APPLICATION_CREDENTIALS - Service account for Vertex AI
# Search & Tools
EXA_API_KEY - Exa web search
BRAVE_API_KEY - Brave web search
PERPLEXITY_API_KEY - Perplexity web search API key (optional; anonymous fallback)
PERPLEXITY_COOKIES - Perplexity web search (session cookie)
TAVILY_API_KEY - Tavily web search
TINYFISH_API_KEY - TinyFish web search
FIRECRAWL_API_KEY - Firecrawl web search
ANTHROPIC_SEARCH_API_KEY - Anthropic web search (override; isolates search from main ANTHROPIC_API_KEY)
ANTHROPIC_SEARCH_BASE_URL - Anthropic web search base URL (override; pairs with ANTHROPIC_SEARCH_API_KEY)
# Configuration
OMP_PROFILE - Named profile for isolated agent state (same as --profile)
Use `omp --profile <name> --alias <command>` to create a shell shortcut for a profile
PI_CODING_AGENT_DIR - Session storage directory (default: ~/.omp/agent)
PI_PACKAGE_DIR - Override package directory (for Nix/Guix store paths)
PI_SMOL_MODEL - Override smol/fast model (see --smol)
PI_SLOW_MODEL - Override slow/reasoning model (see --slow)
PI_PLAN_MODEL - Override planning model (see --plan)
PI_NO_PTY - Disable PTY-based interactive bash execution
For complete environment variable reference, see:
docs/environment-variables.md
Available Tools (default-enabled unless noted):
read - Read file contents
bash - Execute bash commands
edit - Edit files with find/replace
write - Write files (creates/overwrites)
grep - Search file contents
glob - Find files by glob pattern
lsp - Language server protocol (code intelligence)
python - Execute Python code (requires: omp setup python)
notebook - Edit Jupyter notebooks
inspect_image - Analyze images with a vision model
browser - Browser automation (Puppeteer)
task - Launch sub-agents for parallel tasks
todo - Manage todo/task lists
web_search - Search the web
ask - Ask user questions (interactive mode only)
Plugin Options:
--plugin-dir <path> Load plugin from directory (repeatable)
Useful Commands:
omp agents unpack - Export bundled subagents to ~/.omp/agent/agents (default)
omp agents unpack --project - Export bundled subagents to ./.omp/agents
Exit code: 0There's a `omp setup` command for onboarding. Let me run it — it likely guides through provider setup. But it might be interactive. Let me check `omp setup --help` first. Also there's `omp auth-broker` for credential vault. Let me check the setup command. Actually, the cleanest approach: omp needs at least one provider API key. The user has none set. I should ask the user which provider(s) they want to use, then add the key(s) to ~/.env. But I don't know their keys. Let me check `omp setup` to see if it handles onboarding interactively, and also check if there's an `omp auth-broker` that stores credentials in a vault (which might be the preferred way rather than env vars). Let me run `omp setup --help` and `omp auth-broker --help`.
There's an omp setup onboarding command and an auth-broker credential vault. Let me check both to find the cleanest setup path.
{
"command": "omp setup --help 2>&1; echo \"=== auth-broker ===\"; omp auth-broker --help 2>&1 | head -40"
}Output from command in shell 92fff9:
Run onboarding setup or install dependencies for optional features
USAGE
$ omp setup [COMPONENT] [FLAGS]
ARGUMENTS
COMPONENT Optional component to install (python|speech)
FLAGS
-c, --check Check if dependencies are installed
--json Output status as JSON
=== auth-broker ===
Manage the omp auth-broker (credential vault)
USAGE
$ omp auth-broker [ACTION] [SOURCE] [FLAGS]
ARGUMENTS
ACTION Sub-command (serve|token|login|logout|import|migrate|status|list)
SOURCE OAuth provider id (login/logout) or path (import)
FLAGS
--json Output JSON
-b, --bind=<value> Bind address for `serve` (host:port)
--regenerate Regenerate the bearer token
--via=<value> SSH user@host for remote login (login --via=user@host)
--provider=<value> Override provider id for `import` (e.g. when JSON `type` is unrecognized)
--include-disabled Import credentials whose JSON has `disabled: true` (import)
--from-local migrate source: local SQLite + env vars (required for `migrate`)
--include-env Capture env-var API keys for providers not yet on broker (migrate)
--include-oauth Also upload OAuth from local SQLite during migrate (default skips them)
--dry-run Print actions without executing (import / login --via / migrate)
EXAMPLES
# Boot the broker against the local SQLite store
omp auth-broker serve
# Boot on a non-default port
omp auth-broker serve --bind=127.0.0.1:9000
# Print the bearer token
omp auth-broker token
# Rotate the bearer token
omp auth-broker token --regenerate
# List supported OAuth providers
omp auth-broker list
# Local login (run on the broker host)
omp auth-broker login anthropic
# Interactive provider selection
omp auth-broker login
# Remote login over SSH tunnel
omp auth-broker login anthropic --via=user@broker
# Log out of a provider (interactive without provider arg)
omp auth-broker logout anthropic
Exit code: 0There's an auth-broker with OAuth login support. `omp auth-broker login anthropic` would do an OAuth login flow for Anthropic — this is likely the cleanest way since it doesn't require an API key (it uses OAuth, similar to Claude Code's subscription login). Let me check what OAuth providers are supported.
There's an OAuth login flow (omp auth-broker login <provider>) — this lets you authenticate without managing API keys manually, similar to Claude Code's subscription login. Let me see which providers support OAuth.
{
"command": "omp auth-broker list 2>&1; echo \"=== status ===\"; omp auth-broker status 2>&1"
}Output from command in shell 533125: Available providers: openai-codex ChatGPT Plus/Pro (Codex Subscription) anthropic Anthropic (Claude Pro/Max) zai Z.AI (GLM Coding Plan) kimi-code Kimi Code openrouter OpenRouter github-copilot GitHub Copilot cursor Cursor (Claude, GPT, etc.) devin Devin google-antigravity Antigravity (Gemini 3, Claude, GPT-OSS) google-gemini-cli Google Cloud Code Assist (Gemini CLI) openai-codex-device ChatGPT Plus/Pro (Codex, headless/device) xai-oauth xAI Grok OAuth (SuperGrok Subscription) gitlab-duo GitLab Duo Non-Agentic gitlab-duo-agent GitLab Duo Agent alibaba-coding-plan Alibaba Coding Plan zhipu-coding-plan Zhipu Coding Plan (智谱) umans Umans AI Coding Plan qwen-portal Qwen Portal sakana Sakana AI minimax-code MiniMax Token Plan (International) minimax-code-cn MiniMax Token Plan (China) xiaomi Xiaomi MiMo xiaomi-token-plan-sgp Xiaomi Token Plan (Singapore) xiaomi-token-plan-ams Xiaomi Token Plan (Europe) xiaomi-token-plan-cn Xiaomi Token Plan (China) firepass Fire Pass (Fireworks Kimi K2.6 Turbo subscription) deepseek DeepSeek moonshot Moonshot (Kimi API) cerebras Cerebras baseten Baseten fireworks Fireworks together Together nvidia NVIDIA huggingface Hugging Face Inference perplexity Perplexity (Pro/Max) qianfan Qianfan venice Venice synthetic Synthetic nanogpt NanoGPT wafer-serverless Wafer Serverless (pay-as-you-go) coreweave CoreWeave Serverless Inference vercel-ai-gateway Vercel AI Gateway cloudflare-ai-gateway Cloudflare AI Gateway litellm LiteLLM kilo Kilo Gateway zenmux ZenMux opencode-zen OpenCode Zen opencode-go OpenCode Go tavily Tavily kagi Kagi parallel Parallel ollama Ollama (Local OpenAI-compatible) ollama-cloud Ollama Cloud lm-studio LM Studio (Local OpenAI-compatible) llama.cpp llama.cpp (Local OpenAI-compatible) vllm vLLM (Local OpenAI-compatible) === status === No auth-broker configured (set OMP_AUTH_BROKER_URL to enable). Exit code: 0
There's a wide range of OAuth providers. The user needs to pick at least one. Common choices would be: - `anthropic` (Claude Pro/Max subscription) - `openai-codex` (ChatGPT Plus/Pro Codex subscription) - `github-copilot` (GitHub Copilot) - Or use an API key env var like `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, etc. I should ask the user which provider they want to use. The OAuth flow is interactive (opens a browser), so I can't fully complete it without the user. Let me ask which provider(s) they want to authenticate with, and whether they prefer OAuth (subscription) or API key. Actually, let me first start the auth-broker since `omp auth-broker status` says no broker is configured. The OAuth login flow requires the broker to be running. Let me check how that works — does `omp auth-broker login` auto-start the broker? Let me check the docs or just try. Actually, I think the cleanest path is to ask the user which provider they want to use, then guide them through the OAuth login (which they'll need to do interactively in their terminal since it opens a browser). I can't run the interactive OAuth flow from here since it requires browser interaction on their end. Let me ask which provider they want.
omp supports 50+ providers via OAuth (subscription-based, no API key needed) or via API key env vars. You need at least one to use omp. Since the OAuth flow opens a browser and requires you to log in interactively, I'll set everything up and then give you the exact command to run.
Which provider do you want to use?
{
"questions": [
{
"header": "Provider",
"multi_select": true,
"options": [
{
"description": "Anthropic Claude Pro/Max subscription via OAuth (omp auth-broker login anthropic). No API key needed.",
"label": "Anthropic (Claude)"
},
{
"description": "ChatGPT Plus/Pro Codex subscription via OAuth (omp auth-broker login openai-codex).",
"label": "OpenAI (Codex)"
},
{
"description": "GitHub Copilot via OAuth (omp auth-broker login github-copilot).",
"label": "GitHub Copilot"
},
{
"description": "Use an API key in ~/.env instead (e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY, OPENROUTER_API_KEY).",
"label": "API key (env var)"
}
],
"question": "Which provider(s) do you want to authenticate with? (OAuth options use your existing subscription; the broker handles tokens.)"
}
]
}User answered your questions:
{
"Which provider(s) do you want to authenticate with? (OAuth options use your existing subscription; the broker handles tokens.)": {
"selected": [
"Anthropic (Claude)"
],
"custom_text": "Anthropic (Claude): e"
}
}