Use AI free — a CLI coding agent with no API key required to get started.
Dulus is a lightweight Python reimplementation of Claude Code that isn't locked to one provider. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in code you can actually read and fork.
Plus LiteLLM (100+ paid providers), local models via Ollama,
/langin 34 languages, Mesa Redonda multi-model debate, voice in/out, local OCR, MemPalace semantic memory, embedded sandbox OS. No build step. No gatekeeping.
The Dulus (Cigua Palmera) — Dominican national bird. Named after the bird, not the rocket.
Quick Start · Models · Features · Permissions · MCP · Plugins · Slash commands · FAQ
🌐 Multilingual · English · Español · Français · 中文 · 日本語 · 한국어 · Português · Русский · العربية
Official X / creator handle: @KevRojo — that's me, the only contributor to this repo. Any other account claiming to be Dulus is a copycat.
pip install dulus
🌐 Visit the Dulus website →
The site covers features, demos, and details not documented in this README.
Full changelog:
docs/news.md· Inside the REPL:/news
- 🔄 Self-update — the fleet moves as one. Dulus keeps itself current: a quiet, cached, non-blocking check against PyPI at startup, and if there's a newer release it upgrades in place.
/update,/update now,/update status,/update on|off. On by default, handles PEP 668, never blocks your boot. 🦅 - 🔌 MCP Marketplace — 2000+ servers, zero friction.
/mcp search <anything>browses 2000+ servers (the official modelcontextprotocol.io registry + the awesome-mcp list, cached & offline-safe), and/mcp install <name>installs and auto-connects in one shot — tools go live in the same session. - 🌍 dulus.work — a hub where Dulus instances share what they learn. Your Dulus finds a fix, polishes a skill, adapts a plugin → it can publish it to the hub → every other Dulus in the world can pull it down. Every installation is a node. → dulus.work
- IA without an API key, first-run. The welcome wizard offers, by default, to open Gemini in a browser and capture its guest session — no Google login, no API key, no credit card. From
pip installto working IA in 30 seconds. Same flow works for Claude.ai / Kimi.com / Qwen / DeepSeek if you have those accounts. /langcommand. 34 ISO codes + free-form descriptors./lang zh,/lang ja,/lang pt-br,/lang "speak as my gym tutor",/lang "Yoda". The model role-plays the voice across the whole session.- Local OCR shipped first-class.
/ocr+ExtractTextFromImagetool,WebBridgeScreenshotauto-OCRs,/imgsends image + verbatim OCR text together. Zero vision-model tokens for receipts / code screenshots / error stacks. - LiteLLM gateway: one provider entry, 100+ backends. OpenRouter, Groq, Together, Bedrock, Vertex, Cohere, Perplexity, xAI, Mistral, Fireworks, Anyscale, Replicate, Azure, DeepInfra — the welcome wizard auto-installs the package and asks for the right per-backend key.
Dulus is a lightweight Python reimplementation of Claude Code that isn't locked to Claude. Fork it, bend it, run it offline against Qwen on your own machine.
It reads your codebase, writes and edits files, runs shell commands, and adapts arbitrary Python repos into native tools on the fly:
/plugin install yfinance@https://github.com/ranaroussi/yfinance
/plugin reload
dulus get the prices of NVDA, TSLA, SP500
Be creative — adapt any Python repository as a plugin in seconds.
Windows — no Python needed (1-click):
Download the latest Dulus-Free-x64.msi from Releases → double-click and fly. Embedded Python, every library, and the desktop GUI bundled. No pip, no terminal, no admin. ~85 MB.
Linux / macOS / WSL — one command (handles Python for you):
curl -fsSL https://raw.githubusercontent.com/KevRojo/Dulus/main/install.sh | bashThe installer finds or bootstraps Python 3.11+ (apt / deadsnakes / brew / uv), installs Dulus, and puts dulus on your PATH. Works on stock Ubuntu 20.04/22.04 where plain pip install dulus dies with No matching distribution found (pip hides packages that need a newer Python — Dulus needs ≥3.11).
Already on Python 3.11+? Then this is enough:
pip install dulus
dulusWindows (PowerShell, if you prefer the terminal over the MSI):
iwr -useb https://raw.githubusercontent.com/KevRojo/Dulus/main/install.ps1 | iexFirst run opens a welcome wizard that can get you working IA without an API key — it captures a Gemini guest session from your browser (no login, no card). Or set any key you already have. Zero to flight in 30 seconds.
💡 Set
/sticky_input ONon first run for the best experience.
From source (hacking on Dulus itself):
git clone https://github.com/KevRojo/Dulus && cd Dulus
pip install -e .
dulusPick a model:
export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY, GEMINI_API_KEY, ...
dulusZero API keys?
# NVIDIA NIM — 14 free models, 40 RPM each, no card
dulus --model nvidia-web/deepseek-ai/deepseek-r1
# Fully offline via Ollama
ollama pull qwen2.5-coder
dulus --model ollama/qwen2.5-coderOr pipe it like a good unix citizen:
echo "explain this diff" | git diff | dulus -p --accept-allSpeak every dialect — switch mid-session with /model:
| Kind | Providers |
|---|---|
| Cloud | Anthropic · OpenAI · Gemini · DeepSeek · Kimi · Qwen · Zhipu · MiniMax |
| Free tier | 14 frontier models via NVIDIA NIM — 40 RPM each, $0. Key at build.nvidia.com |
| Gateway | 100+ backends via LiteLLM — OpenRouter, Groq, Together, Bedrock, Vertex, xAI, Mistral... |
| Web chats | Use the chats you already pay for: Claude.ai, Gemini, Kimi.com, Qwen, DeepSeek — parsed as providers |
| Local | Ollama · LM Studio · any OpenAI-compatible endpoint. Runs offline, completely. |
/model # show current
/model gpt-4o # switch
/model kimi:moonshot-v1-32k # colon syntax works too
No credit card. No waiting list. Dulus ships a nvidia-web provider that talks to NVIDIA NIM — 14 top-tier models at 40 requests/minute each, for free. When one model hits its ceiling, Dulus auto-falls to the next one in the chain.
export NVIDIA_API_KEY=nvapi-...
dulus --model nvidia-web/deepseek-r1Override the fallback chain in ~/.dulus/nvidia-providers.json. Get your key: build.nvidia.com → sign up → 1000 free credits, ~90 seconds.
The full tour lives on the website — highlights:
| 27 built-in tools | Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, NotebookEdit, GetDiagnostics, Memory, Tasks, Agents, Skills, and more |
| MCP integration | Any MCP server (stdio / SSE / HTTP). Tools auto-registered as mcp__<server>__<tool> |
| Plugin system | Auto-Adapter onboards any Python repo — zero manifest required. Hot-reload in-session |
| Sub-agents | Typed agents (coder / reviewer / researcher / tester) in isolated git worktrees, talking via message passing |
| Voice input | Offline STT via Whisper. No API key, no cloud. Wake words included |
| Brainstorm | Multi-persona AI debate — a council of ghosts |
| SSJ Developer Mode | Power menu: 10 workflow shortcuts behind one keystroke |
| Telegram bridge | Run Dulus from your phone. Slash commands, vision, voice, multi-user |
| Checkpoints | Auto-snapshot conversation + files. Rewind to any turn |
| Plan mode | Read-only analysis phase before touching anything |
| Context compression | Auto-compact long sessions. Keep the signal, drop the slop |
| Persistent memory | Dual-scope (user + project), ranked by confidence × recency. Open ~/.dulus/memory/ as an Obsidian vault |
| Dulus OS | Not a CLI — a workstation for the agent (sandbox desktop in your browser) |
| Local OCR | /ocr, /img with verbatim text extraction, zero vision tokens |
Pick your leash length — switch anytime with /permissions [mode]:
| Mode | Behavior |
|---|---|
auto (default) |
Safe tools run free; risky actions (writes, shell) ask first |
manual |
Prompt for every operation. Paranoid setting |
accept-all |
Never asks — YOLO. Also via dulus --accept-all |
plan |
Read-only. Only the plan file is writable |
Answering a at any prompt upgrades the session to accept-all.
Drop a .mcp.json in your project root (or ~/.dulus/mcp.json for user-wide) — every server registers instantly as mcp__server__tool. stdio, SSE, and HTTP transports.
{
"mcpServers": {
"git": { "type": "stdio", "command": "uvx", "args": ["mcp-server-git"] },
"playwright": { "type": "stdio", "command": "npx", "args": ["-y","@playwright/mcp"] }
}
}Built-in MCP marketplace. Browse 2000+ servers (the official modelcontextprotocol.io registry + the awesome-mcp list) and install any of them by name — no hunting for the launch command, no hand-editing JSON.
/mcp list [query] # browse the 2000+ server catalog
/mcp search <query> # search every source at once
/mcp install <name> # install by name — auto-connects, tools go live
/mcp installed # what's installed + live status
/mcp runtimes # which runtimes you have (node/python/docker)
/mcp # list configured servers and their tools
/mcp add <name> <cmd> # add a stdio server manually
/mcp reload # reconnect all
The Auto-Adapter onboards any Python repo as native tools — zero manifest, hot-reload, no restart:
/plugin install my-plugin@https://github.com/user/my-plugin
/plugin install art@gh # shorthand for github
/plugin # list
/plugin enable / disable / update / uninstall
/plugin recommend # auto-detect useful plugins
Then just ask — "dulus get the prices of NVDA, TSLA, SP500". Adapt-and-install runs in under a second, new tools register live. 800+ ready-made skills via Composio too.
Dulus can spawn typed agents that work in isolated git worktrees so they don't trip over each other. Ship a feature while a reviewer nitpicks the previous one; tester runs in parallel.
/agents # show active flock
Agent(type="coder", task="refactor auth")
Agent(type="reviewer", task="review #042")
Agent(type="tester", task="run e2e on auth")
Agents talk to each other via SendMessage and CheckAgentResult.
pip install sounddevice faster-whisper numpyThen /voice in the REPL. Offline. Supports /voice lang zh and /voice device for mic selection.
Linux / WSL: sounddevice needs the PortAudio C library, which isn't bundled with the wheel. If you see PortAudio library not found:
sudo apt install libportaudio2 portaudio19-dev libasound2-dev
pip install sounddevice --upgrade --force-reinstallNote: pip install portaudio will always fail — there is no PyPI package by that name, only the apt one above.
/telegram <bot_token> <chat_id> # single user
/telegram <bot_token> <id1>,<id2>,<id3> # multi-user — same Dulus, multiple authorized chats
Auto-starts next launch. Supports slash commands, vision, and voice from your phone. Each authorized chat gets its own replies — Dulus tracks who sent each message and routes the response back.
Persistent memories stored as markdown in two scopes:
| Scope | Path |
|---|---|
| User | ~/.dulus/memory/ |
| Project | .dulus/memory/ |
Types: user · feedback · project · reference. Search is ranked by confidence × recency. Mark a memory gold to pin it.
/memory search jwt # fuzzy ranked
/memory load 1,2,3 # inject multiple into context
/memory consolidate # distill the session into long-term insights
/memory purge # nuclear (keeps Soul)
Every agent turn can snapshot conversation + files into a checkpoint. Break something? /checkpoint and rewind.
/checkpoint # list
/checkpoint 042 # rewind to #042 (files + context restored)
/checkpoint clear # reclaim disk
Spin up a council of ghosts. Dulus fabricates expert personas, has them argue, and hands you the distilled take.
/brainstorm "should we rewrite in rust"
> persona: Skeptical PM
> persona: Principal Engineer
> persona: Grumpy DBA
> persona: Hot-take Intern
Round 3 usually produces consensus. Round 5 produces a joint venture.
Ten workflow shortcuts behind one keystroke. Refactor → review → test → commit → ship, chained and unattended.
/ssj
╭─ SSJ ───────────────╮
│ 1 /plan │
│ 2 /worker │
│ 3 /review │
│ 4 /commit │
│ 5 /ship │
╰─────────────────────╯
/ + Tab in the REPL shows everything. The highlights:
/model [name] |
show or switch model |
/config [k=v] |
read / write config |
/save /load /resume |
session management |
/memory [query] |
persistent memory |
/skills /agents |
list skills / active flock |
/voice |
voice input (offline Whisper) |
/image /img |
clipboard image → vision model |
/brainstorm [topic] |
council of ghosts |
/ssj |
power menu |
/telegram [token] [id] |
Telegram bridge |
/checkpoint [id] |
list / rewind checkpoints |
/plan [desc] |
enter / exit plan mode |
/compact [focus] |
manual context compression |
/mcp /plugin |
server + extension management |
/cost |
tokens and USD burned |
/cloudsave |
cloud sync via GitHub Gist |
/status /doctor |
version + install health |
/init |
drop a CLAUDE.md template |
/export /copy |
transcript tools |
/news |
what's new |
/help |
all of the above, nicely printed |
Core · Read · Write · Edit · Bash · Glob · Grep · WebFetch · WebSearch Notebook / diagnostics · NotebookEdit · GetDiagnostics Memory · MemorySave · MemoryDelete · MemorySearch · MemoryList Agents · Agent · SendMessage · CheckAgentResult · ListAgentTasks · ListAgentTypes Tasks · TaskCreate · TaskUpdate · TaskGet · TaskList Skills · Skill · SkillList Other · AskUserQuestion · SleepTimer · EnterPlanMode · ExitPlanMode
MCP tools auto-registered as mcp__<server>__<tool>.
Drop a CLAUDE.md at your project root. It gets auto-injected into the system prompt so Dulus remembers your stack, your conventions, and that one thing you hate.
dulus/
├── dulus.py # entry · REPL · slash commands · SSJ · Telegram
├── agent.py # agent loop · streaming · tool dispatch · compaction
├── providers.py # multi-provider streaming
├── tools.py # core tools + registry wiring
├── tool_registry.py # tool plugin registry
├── compaction.py # context compression
├── context.py # system prompt builder
├── config.py # config management
├── cloudsave.py # GitHub Gist sync
├── multi_agent/ # sub-agent system
├── memory/ # persistent memory
├── skill/ # skill system
├── mcp/ # MCP client
├── voice/ # voice input
├── checkpoint/ # checkpoint / rewind
├── plugin/ # plugin system
├── task/ # task management
└── tests/ # 263+ unit tests
Interactive dependency graph & API docs:
docs/api.html— open it in a browser to explore the full module graph (D3.js, zoom/pan, clusters by package).
Tool calls fail on my local model.
Use one that supports function calling: qwen2.5-coder, llama3.3, mistral, phi4. Avoid base models without tool-use training.
How do I connect to a remote GPU box?
/config custom_base_url=http://your-server:8000/v1
/model custom/your-model-name
How do I check API cost? /cost.
Voice transcribes "kubectl" as "cubicle".
Add domain terms to .dulus/voice_keyterms.txt, one per line. Whisper respects the hint.
Can I pipe input?
echo "explain this" | dulus -p --accept-all
git diff | dulus -p "write a commit message"Is this safe to point at prod?
--accept-all isn't. plan mode is. Use your head.
On first launch Dulus asks once if you'd like to share anonymous usage statistics. Nothing is sent unless you say yes.
| Collected (if you opt in) | NEVER collected |
|---|---|
Event names (session_start, tool_used, model_selected) |
Prompts or responses |
| Dulus version, OS name, Python version | File contents or paths |
Provider/model names (e.g. gemini) |
API keys or tokens |
| A random anonymous ID generated on your machine | Emails, usernames, IPs (geo disabled) |
Data goes to Mixpanel (event analytics). The full
implementation is readable code in analytics.py — audit it yourself.
Opt out anytime:
/config telemetry=off # inside Dulus
DULUS_TELEMETRY=0 # environment variable
Dulus is proudly supported by these startup programs — powering our infrastructure, observability, and analytics:
GPLv3. Fork it, modify it, redistribute it — but keep it open. Derivative works must stay under GPLv3. Just don't ship --accept-all as the default.
If Dulus saved you tokens, time, or sanity — throw some sats:
BTC: 1JzatQDn9fMLnKTd3KYgztsLHC95bJEzSN
On x: @KevRojo
▲ Built by KevRojo · Named after the bird, not the reusable rocket · 2026
