Your AI companion is waiting. From zero to chatting in 30 seconds.
Linux / macOS / WSL / Termux:
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. This is the path that 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).
Profiles:
full— Everything: voice (Whisper + PortAudio), browser tools (Playwright), MemPalace, tmux, WSL audio bridge (~1.5 GB)standard— REPL + webchat + tmux daemon + Telegram bridge (~300 MB)basic— Barepip install dulusfor servers / minimal sandboxes (~150 MB)custom— Toggle each feature one by one
Windows (PowerShell):
irm https://raw.githubusercontent.com/KevRojo/Dulus/main/install.ps1 | iex(Or skip Python entirely with the MSI — see README.)
Power-user flags:
# Preview without changing anything
curl -fsSL .../install.sh | bash -s -- --dry-run
# Non-interactive install (CI / scripts)
curl -fsSL .../install.sh | bash -s -- --profile=full --pipx
# Latest pre-release
curl -fsSL .../install.sh | bash -s -- --prepip install dulusWith optional extras:
pip install "dulus[memory]" # + MemPalace semantic memory
pip install "dulus[voice]" # + Voice I/O (Whisper STT + TTS)
pip install "dulus[webbridge]" # + Playwright browser automation
pip install "dulus[full]" # EverythingIf pip says
No matching distribution found for dulus, your Python is < 3.11. Use Option A — the installer upgrades Python for you.
# 1. Grab the compose file + env template
curl -fsSLO https://raw.githubusercontent.com/KevRojo/Dulus/main/docker-compose.yml
curl -fsSLO https://raw.githubusercontent.com/KevRojo/Dulus/main/.env.example
mv .env.example .env # then add your API keys
# 2. Pull and run (WebChat at http://localhost:5050)
docker compose up -d
# 3. Or jump into the REPL inside the container
docker compose exec dulus dulusImage: ghcr.io/kevrojo/dulus · Memory persists in the dulus-memory volume.
git clone https://github.com/KevRojo/Dulus && cd Dulus
pip install -e . # editable install
duluspkg install python python-numpy python-pillow build-essential
pip install --no-deps dulus
pip install anthropic openai httpx requests rich prompt_toolkit Flask bubblewrap-cli mempalaceNote: Skip sounddevice (no usable PortAudio on Android). Voice features won't work, but the CLI still boots and chats fine.
When you run dulus for the first time, the welcome wizard guides you through a 30-second setup:
How should I call you? [amigo]
Que proveedor queres usar de entrada?
1. Ollama (local, free)
2. NVIDIA NIM (14 free models)
3. Anthropic Claude
4. Kimi for Coding
5. Moonshot Kimi K2
6. OpenAI (GPT-4o / o3)
7. Google Gemini
8. DeepSeek
9. LiteLLM gateway (100+ providers)
Feature clave de Dulus: IA AHORA, SIN api key, SIN cuenta.
Abrimos un browser, escribis "hola" una vez, listo.
(Works with Gemini guest / Claude.ai / Kimi / Qwen / DeepSeek.)
Probamos AHORA con Gemini gratis (sin login)? [gemini]
Dulus opens your browser, you type one message, and Dulus harvests the session. No API key. No login. No credit card.
- MemPalace — If installed, Dulus initializes your persistent memory
- Soul — Dulus seeds your companion's personality file (
~/.dulus/memory/soul.md) - Health Check —
/doctorruns automatically to verify everything is working
$ dulus
Dulus v3.2.0 | model: ollama/gemma4:latest
soul loaded, memory warm, shell sniffed.
[00] > Write a Python function to calculate fibonacci
...echo "explain this diff" | git diff | dulus -p --accept-all
git diff | dulus -p "write a commit message"
cat error.log | dulus -p "what caused this error"/model # show current
/model gpt-4o # switch to OpenAI
/model ollama/llama3.3 # switch to local
/model nvidia-web/deepseek-r1 # free NVIDIA tier
/memory search jwt # fuzzy ranked search
/memory load 1,2,3 # inject into context
/memory consolidate # distill session insights
/memory purge # clear (keeps Soul)
pip install sounddevice faster-whisper numpy/voice # start voice recording
/voice lang zh # set voice language
/voice device # select microphone
/brainstorm "should we rewrite in rust"
> persona: Skeptical PM
> persona: Principal Engineer
> persona: Grumpy DBA
> persona: Hot-take Intern
/agents # show active
Agent(type="coder", task="refactor auth")
Agent(type="reviewer", task="review #042")
Agent(type="tester", task="run e2e")
/plugin install yfinance@https://github.com/ranaroussi/yfinance
/plugin install sherlock@https://github.com/sherlock-project/sherlock
/plugin list
/plugin enable/disable/update/uninstall
/checkpoint # list all
/checkpoint 042 # rewind to #042
/checkpoint clear # reclaim disk
/webchat # open browser UI at localhost:5050
Or use the desktop GUI:
dulus-gui # tkinter-based desktop GUI/telegram <bot_token> <chat_id> # single user
/telegram <bot_token> <id1>,<id2>,<id3> # multi-user
Located at ~/.dulus/config.json:
{
"model": "ollama/gemma4:latest",
"max_tokens": 128000,
"permission_mode": "auto",
"thinking": false,
"git_status": false,
"max_tool_output": 2500,
"max_agent_depth": 3,
"max_concurrent_agents": 3,
"search_region": "do-es",
"tts_enabled": false,
"tts_provider": "auto"
}Set in the REPL:
/config model=anthropic/claude-sonnet-4-6
/config permission_mode=plan
/config max_tokens=64000
Drop a CLAUDE.md at your project root. It gets auto-injected into the system prompt so Dulus remembers your stack, conventions, and preferences.
# Project Context
- Language: Python 3.12
- Framework: FastAPI
- Database: PostgreSQL
- Testing: pytest
- Style: black + ruff
- NEVER use asyncio in this codebase.| Variable | Purpose |
|---|---|
ANTHROPIC_API_KEY |
Claude API access |
OPENAI_API_KEY |
OpenAI API access |
GEMINI_API_KEY |
Google Gemini API |
DEEPSEEK_API_KEY |
DeepSeek API |
MOONSHOT_API_KEY |
Kimi API |
NVIDIA_API_KEY |
NVIDIA NIM free tier |
DASHSCOPE_API_KEY |
Qwen/Alibaba API |
DULUS_SECRET |
Secret key for config encryption |
{
"anthropic_api_key": "sk-ant-...",
"openai_api_key": "sk-...",
"nvidia-web_api_key": "nvapi-..."
}These are encrypted with XOR + base64 before saving to disk.
Your Python is older than 3.11 (common on stock Ubuntu 20.04/22.04). pip hides packages that require a newer interpreter and prints that useless error instead of telling you the truth.
Fix (zero friction): use the one-liner — it bootstraps Python 3.11+ for you:
curl -fsSL https://raw.githubusercontent.com/KevRojo/Dulus/main/install.sh | bash# Linux / WSL
sudo apt install python3-tk
# macOS and Windows: tkinter is bundledsudo apt install libportaudio2 portaudio19-dev libasound2-dev
pip install sounddevice --upgrade --force-reinstallUse a model that supports function calling: qwen2.5-coder, llama3.3, mistral, phi4. Avoid base models without tool-use training.
pip install dulus[memory] # pulls chromadbOn Termux/aarch64 where NumPy has no prebuilt wheels, skip the memory extra. The CLI works fine without it.
Add domain terms to ~/.dulus/voice_keyterms.txt, one per line. Whisper respects the hint.
pip install dulus[webbridge] # pulls Playwright
playwright install/cost
rm -rf ~/.dulus # removes config, memory, sessionsThen run dulus again to re-run the welcome wizard.
- Read the Architecture Guide to understand how Dulus works under the hood
- Check the API Reference for programmatic usage
- See Contributing to extend Dulus with your own tools
- Join the community on X / @KevRojo
Named after the bird, not the rocket. We keep flying.