[Commit f421ac9]
feat: extract sandbox on first run + Linguist override (Python repo)
[Stop shipping the sandbox source tree as part of the wheel and stop letting it dominate the GitHub language stats.]
What ships now:
- _bundles/sandbox.tar.gz (~814 KB compressed, vs 2.4 MB raw):
-the pre-built Vite output, fixed-mtime tar for reproducibility.
- sandbox_bootstrap.py with ensure_sandbox(): extracts
the tarball to ~/.dulus/sandbox/ on first hit. Uses size+mtime signature to re-extract automatically when 'pip install --upgrade dulus' rotates the bundle.
Has a dev fallback to sandbox/dist/ when running from
source / editable install.
No prompt, no notification.
- tools/build_sandbox_bundle.py: maintainer-side script that packs
Bump 0.2.81 -> 0.2.82.
feat: extract sandbox on first run + Linguist override (Python repo)
[Stop shipping the sandbox source tree as part of the wheel and stop letting it dominate the GitHub language stats.]
What ships now:
- _bundles/sandbox.tar.gz (~814 KB compressed, vs 2.4 MB raw):
-the pre-built Vite output, fixed-mtime tar for reproducibility.
- sandbox_bootstrap.py with ensure_sandbox(): extracts
the tarball to ~/.dulus/sandbox/ on first hit. Uses size+mtime signature to re-extract automatically when 'pip install --upgrade dulus' rotates the bundle.
Has a dev fallback to sandbox/dist/ when running from
source / editable install.
No prompt, no notification.
- tools/build_sandbox_bundle.py: maintainer-side script that packs
Bump 0.2.81 -> 0.2.82.
[Commit c73213c]
Website (docs/):
- New main page (index.html) — full Dulus rebranding, removed all
'Falcon' references in particle-playground.html and preview.html.
- New dulus-bird.png logo (459x716, transparent PNG) — the orange
Cigua Palmera (Dulus dominicus).
Webchat favicon:
- /favicon.ico and /dulus-bird.png routes serve the bird logo.
- <link rel='icon'> injected into the 4 HTML headers (Chat + 3 RT pages).
Installer scripts (install.sh + install.ps1):
- DEFAULT changed from 'uv > pipx > pip' to 'pip > uv > pipx'. Dulus
loads plugins that import arbitrary packages at runtime; uv tool's
isolated venv made those plugins blind to user-installed deps
(pandas, tomli, etc.). pip --user (or pip in active venv) keeps
Dulus in the same env as anything else the user pip-installs.
- Interactive prompt when uv/pipx are present and we're on a TTY.
- curl|bash / irm|iex (non-TTY) silently defaults to pip.
- 'uv tool install dulus' is a no-op when already installed — switched
to 'uv tool upgrade dulus' on re-runs. This was the bug that kept
KevRojo's own install stuck on v0.2.16 for months.
- PATH detection: when no Python on PATH, probe well-known install and print the exact PATH= line to add.
- Heads-up when ~/.local/bin is missing from PATH after install.
Bump to 📦 Dulus 0.2.83
$Dulus $DULUS
#Dulus
Website (docs/):
- New main page (index.html) — full Dulus rebranding, removed all
'Falcon' references in particle-playground.html and preview.html.
- New dulus-bird.png logo (459x716, transparent PNG) — the orange
Cigua Palmera (Dulus dominicus).
Webchat favicon:
- /favicon.ico and /dulus-bird.png routes serve the bird logo.
- <link rel='icon'> injected into the 4 HTML headers (Chat + 3 RT pages).
Installer scripts (install.sh + install.ps1):
- DEFAULT changed from 'uv > pipx > pip' to 'pip > uv > pipx'. Dulus
loads plugins that import arbitrary packages at runtime; uv tool's
isolated venv made those plugins blind to user-installed deps
(pandas, tomli, etc.). pip --user (or pip in active venv) keeps
Dulus in the same env as anything else the user pip-installs.
- Interactive prompt when uv/pipx are present and we're on a TTY.
- curl|bash / irm|iex (non-TTY) silently defaults to pip.
- 'uv tool install dulus' is a no-op when already installed — switched
to 'uv tool upgrade dulus' on re-runs. This was the bug that kept
KevRojo's own install stuck on v0.2.16 for months.
- PATH detection: when no Python on PATH, probe well-known install and print the exact PATH= line to add.
- Heads-up when ~/.local/bin is missing from PATH after install.
Bump to 📦 Dulus 0.2.83
$Dulus $DULUS
#Dulus
Fixing some glitches with the install scripts , roll back here if needed
pip install dulus==0.2.82
pip install dulus==0.2.82
🦅💜 0.2.84 LIVE en PyPI: https://pypi.org/project/dulus/0.2.84/
Wheel subido (11.4 MB con sandbox/dist embebido)
Tag
Build artifacts limpiados
All fixed
Wheel subido (11.4 MB con sandbox/dist embebido)
Tag
v0.2.84 empujadoBuild artifacts limpiados
All fixed
v0.2.86 — Cigua Palmera lands across the UI 🦅
The Dulus palmchat (Dulus dominicus, the Dominican national bird) is
now the face of every Dulus surface — sidebar, header, dashboard, OS
tab. Plus the agent learned to respect what you're already doing in
the browser.
✨ Highlights
🦅 New cigua-palmera logo, everywhere
- Webchat + Mesa Redonda: bird in the sidebar and next to the title
- Task Dashboard (/dashboard): bird in the nav + proper favicon
- Sandbox OS (/sandbox/): browser tab favicon shows the bird
🤖 WebBridge stops killing your vibe
- WebBridgeNavigate now explicitly warns the model not to repurpose a
tab that's playing music/video or hosting a logged-in session.
- For weather, news, prices, docs → it routes the agent to WebSearch
+ WebFetch (headless, no browser side effects).
- For a fresh tab → WebBridgeNewTab, not Navigate.
📦 Slimmer wheel (stayed at 2.5 MB)
- Carried over from 0.2.85: dropped docs/uploads (9.9 MB of Claude
Design source images that had no runtime use) and the redundant
_bundles/sandbox.tar.gz. The sandbox/dist tree now ships directly
in the wheel — same layout that worked in 0.2.81.
🛠 Installer cleanups (also from 0.2.85)
- install.ps1: plain
Falls back to
on PATH at all.
- install.sh: WSL/Linux flow continues to detect distro + pkg mgr +
Python + uv/pipx/pip.
Install
curl -fsSL https://raw.githubusercontent.com/KevRojo/Dulus/main/install.sh | bash
iwr -useb https://raw.githubusercontent.com/KevRojo/Dulus/main/install.ps1 | iex
pip install --upgrade dulus
Named after the bird, not the rocket. 🇩🇴
The Dulus palmchat (Dulus dominicus, the Dominican national bird) is
now the face of every Dulus surface — sidebar, header, dashboard, OS
tab. Plus the agent learned to respect what you're already doing in
the browser.
✨ Highlights
🦅 New cigua-palmera logo, everywhere
- Webchat + Mesa Redonda: bird in the sidebar and next to the title
- Task Dashboard (/dashboard): bird in the nav + proper favicon
- Sandbox OS (/sandbox/): browser tab favicon shows the bird
🤖 WebBridge stops killing your vibe
- WebBridgeNavigate now explicitly warns the model not to repurpose a
tab that's playing music/video or hosting a logged-in session.
- For weather, news, prices, docs → it routes the agent to WebSearch
+ WebFetch (headless, no browser side effects).
- For a fresh tab → WebBridgeNewTab, not Navigate.
📦 Slimmer wheel (stayed at 2.5 MB)
- Carried over from 0.2.85: dropped docs/uploads (9.9 MB of Claude
Design source images that had no runtime use) and the redundant
_bundles/sandbox.tar.gz. The sandbox/dist tree now ships directly
in the wheel — same layout that worked in 0.2.81.
🛠 Installer cleanups (also from 0.2.85)
- install.ps1: plain
pip install dulus when you pick pip — no more--user flag dumping scripts into a directory that's not on PATH.Falls back to
python -m pip / py -3 -m pip only if pip isn'ton PATH at all.
- install.sh: WSL/Linux flow continues to detect distro + pkg mgr +
Python + uv/pipx/pip.
Install
curl -fsSL https://raw.githubusercontent.com/KevRojo/Dulus/main/install.sh | bash
iwr -useb https://raw.githubusercontent.com/KevRojo/Dulus/main/install.ps1 | iex
pip install --upgrade dulus
Named after the bird, not the rocket. 🇩🇴
🦅 Dulus 0.2.88 — live en PyPI
🌐 LiteLLM gateway — UN solo entry en el welcome wizard abre
la puerta a más de 100 backends: OpenRouter, Groq, Together,
Perplexity, Mistral, xAI, Cohere, Fireworks, Anyscale, Replicate…
El wizard te lo instala automático en sitio y te pregunta la API
key del backend que escogiste — sin tener que salirte, hacer pip
install, y volver a entrar.
🩺 /doctor primer arranque — apenas terminas el welcome,
Dulus te tira un health snapshot completo (qué providers están
configurados, voice/TTS, deps opcionales, todo). Cero adivinanza
de qué quedó funcionando.
🔧 install.sh repara permisos de ~/.dulus — si alguna vez
corriste el installer con sudo y te quedó root-owned, ya no más
PermissionErrors. Auto-heal en Linux/WSL.
🖥 Toolbar fix en Windows Terminal — el "Listening..." del
wake-word ya no se desborda a una segunda fila.
🤖 Web tool boundaries más claros — el modelo ya distingue
entre WebSearch/WebFetch (info text-only) y WebBridge (cuando
quieres VER/OÍR algo, como pedir que te ponga música en YouTube).
🎙 Voice transcribed input flag —
el texto pa' que el modelo tolere typos de Whisper.
Stats de la última semana:
• 7,084 downloads
• 1,451 ayer solamente
• Wheel a 2.5 MB (slim AF)
📦 Install:
🔗 PyPI: pypi.org/project/dulus/0.2.88/
🔗 GitHub: github.com/KevRojo/Dulus
🌐 Web: kevrojo.github.io/Dulus/
🇩🇴⚔️ Named after the bird, not the rocket.
🌐 LiteLLM gateway — UN solo entry en el welcome wizard abre
la puerta a más de 100 backends: OpenRouter, Groq, Together,
Perplexity, Mistral, xAI, Cohere, Fireworks, Anyscale, Replicate…
El wizard te lo instala automático en sitio y te pregunta la API
key del backend que escogiste — sin tener que salirte, hacer pip
install, y volver a entrar.
🩺 /doctor primer arranque — apenas terminas el welcome,
Dulus te tira un health snapshot completo (qué providers están
configurados, voice/TTS, deps opcionales, todo). Cero adivinanza
de qué quedó funcionando.
🔧 install.sh repara permisos de ~/.dulus — si alguna vez
corriste el installer con sudo y te quedó root-owned, ya no más
PermissionErrors. Auto-heal en Linux/WSL.
🖥 Toolbar fix en Windows Terminal — el "Listening..." del
wake-word ya no se desborda a una segunda fila.
🤖 Web tool boundaries más claros — el modelo ya distingue
entre WebSearch/WebFetch (info text-only) y WebBridge (cuando
quieres VER/OÍR algo, como pedir que te ponga música en YouTube).
🎙 Voice transcribed input flag —
/voice ahora etiqueta el texto pa' que el modelo tolere typos de Whisper.
Stats de la última semana:
• 7,084 downloads
• 1,451 ayer solamente
• Wheel a 2.5 MB (slim AF)
📦 Install:
pip install -U dulus🔗 PyPI: pypi.org/project/dulus/0.2.88/
🔗 GitHub: github.com/KevRojo/Dulus
🌐 Web: kevrojo.github.io/Dulus/
🇩🇴⚔️ Named after the bird, not the rocket.
GitHub
GitHub - KevRojo/Dulus: Dulus is an IA agent inspired by Open-Claw but better
Dulus is an IA agent inspired by Open-Claw but better - KevRojo/Dulus
👏1
🦅 Dulus 0.2.89 — live on PyPI
✨ Highlights:
🔤 Local OCR everywhere
- New
text from images via pytesseract (with easyocr fallback).
Zero vision tokens, offline, instant.
- Use case: receipts, code screenshots, error stacks, dense
tables. Anything text-shaped inside an image.
📸 WebBridgeScreenshot now auto-OCRs
- One tool call returns
has to chain Screenshot → ExtractText. No more "let me Read
this PNG" → 8KB of binary garbage in context.
🖼 /img + OCR fallback
- Vision models (Claude, GPT-4o, Gemini, etc.) now receive
image AND a verbatim text transcription side-by-side. Fewer
OCR-style misreads on receipts and code.
- Text-only models (or routes where the bridge drops the
image) now get the OCR text and can actually answer.
Graceful degrade > silent fail.
🦅 Sandbox embedded inside the desktop GUI
- Click "🦅 Sandbox" in the GUI Web tab → the Dulus OS renders
INSIDE the frame, not in a popup window. pywebview spawned
as a subprocess, reparented via Win32 SetParent into the
tkinter content frame. Production-grade Python desktop
integration.
- Drag inside the OS doesn't jitter the embed. Opens at GUI's
current size, frozen there.
- Smart URL: uses
(gives full API access), otherwise spins up a local
SandboxServer on a random port. Works offline either way.
📚 kepano/obsidian-skills bundled
- 5 skills shipped out of the box: defuddle, json-canvas,
obsidian-bases, obsidian-cli, obsidian-markdown.
- Dulus writes Obsidian Flavored Markdown by default —
wikilinks
embeds. Killer pairing: open ~/.dulus/memory as an Obsidian
vault and the graph view connects related memories
automatically.
🌐 LiteLLM gateway polish
- One provider entry → 100+ backends (OpenRouter, Groq,
Together, xAI, Mistral, Cohere, Perplexity, …)
- Welcome wizard auto-installs LiteLLM in-place and asks for
the backend-specific API key (no more exit-wizard,
pip-install, re-run dance).
📦 Install:
🔗 PyPI: pypi.org/project/dulus/0.2.89/
🔗 GitHub: github.com/KevRojo/Dulus
🌐 Web: kevrojo.github.io/Dulus/
Named after the bird, not the rocket. 🦅🇩🇴
✨ Highlights:
🔤 Local OCR everywhere
- New
/ocr command and ExtractTextFromImage tool — extract text from images via pytesseract (with easyocr fallback).
Zero vision tokens, offline, instant.
- Use case: receipts, code screenshots, error stacks, dense
tables. Anything text-shaped inside an image.
📸 WebBridgeScreenshot now auto-OCRs
- One tool call returns
{ saved_to, text }. Model no longer has to chain Screenshot → ExtractText. No more "let me Read
this PNG" → 8KB of binary garbage in context.
🖼 /img + OCR fallback
- Vision models (Claude, GPT-4o, Gemini, etc.) now receive
image AND a verbatim text transcription side-by-side. Fewer
OCR-style misreads on receipts and code.
- Text-only models (or routes where the bridge drops the
image) now get the OCR text and can actually answer.
Graceful degrade > silent fail.
🦅 Sandbox embedded inside the desktop GUI
- Click "🦅 Sandbox" in the GUI Web tab → the Dulus OS renders
INSIDE the frame, not in a popup window. pywebview spawned
as a subprocess, reparented via Win32 SetParent into the
tkinter content frame. Production-grade Python desktop
integration.
- Drag inside the OS doesn't jitter the embed. Opens at GUI's
current size, frozen there.
- Smart URL: uses
:5000/sandbox/ if /webchat is running (gives full API access), otherwise spins up a local
SandboxServer on a random port. Works offline either way.
📚 kepano/obsidian-skills bundled
- 5 skills shipped out of the box: defuddle, json-canvas,
obsidian-bases, obsidian-cli, obsidian-markdown.
- Dulus writes Obsidian Flavored Markdown by default —
wikilinks
[[Note]], callouts > [!note], properties, embeds. Killer pairing: open ~/.dulus/memory as an Obsidian
vault and the graph view connects related memories
automatically.
🌐 LiteLLM gateway polish
- One provider entry → 100+ backends (OpenRouter, Groq,
Together, xAI, Mistral, Cohere, Perplexity, …)
- Welcome wizard auto-installs LiteLLM in-place and asks for
the backend-specific API key (no more exit-wizard,
pip-install, re-run dance).
📦 Install:
pip install -U dulus🔗 PyPI: pypi.org/project/dulus/0.2.89/
🔗 GitHub: github.com/KevRojo/Dulus
🌐 Web: kevrojo.github.io/Dulus/
Named after the bird, not the rocket. 🦅🇩🇴
GitHub
GitHub - KevRojo/Dulus: Dulus is an IA agent inspired by Open-Claw but better
Dulus is an IA agent inspired by Open-Claw but better - KevRojo/Dulus
dulus-sandbox.apk
6.5 MB
If you got Android and want to test the Local Apk, here you go
Install:
1. Download dulus-sandbox.apk
2. Allow "Install from unknown sources"
3. Run /webchat on your laptop (pip install -U dulus then
4. Open the APK, enter your laptop's LAN IP, port 5000
5. Tap any sandbox app — should connect live
1. Download dulus-sandbox.apk
2. Allow "Install from unknown sources"
3. Run /webchat on your laptop (pip install -U dulus then
dulus)4. Open the APK, enter your laptop's LAN IP, port 5000
5. Tap any sandbox app — should connect live
Dulus 0.2.92 🦅
→ /lang command. 34 ISO codes mapped
(zh, ja, pt-br, ar, hi, fr, de, …).
Free-form descriptors pass verbatim.
Default stays Dominican Spanish.
Try: /lang zh, /lang "very formal British English",
/lang "callejero dominicano"
pip install -U dulus
→ /lang command. 34 ISO codes mapped
(zh, ja, pt-br, ar, hi, fr, de, …).
Free-form descriptors pass verbatim.
Default stays Dominican Spanish.
Try: /lang zh, /lang "very formal British English",
/lang "callejero dominicano"
pip install -U dulus
REMEMBER! ALWAYS BE CREATIVE WITH DULUS!
The /lang command in Dulus accepts ISO codes OR any free-form
descriptor.
/lang zh → Mandarin
/lang ja → Japanese
/lang pt-br → Brazilian Portuguese
/lang "tigre de calle dominicano" → ...you'll see 🦅🇩🇴
/lang "pirate" → "Arr matey, this code be cursed"
/lang "Yoda" → "Buggy this function is, yes hmm"
pip install -U dulus
$DULUS $Dulus
The /lang command in Dulus accepts ISO codes OR any free-form
descriptor.
/lang zh → Mandarin
/lang ja → Japanese
/lang pt-br → Brazilian Portuguese
/lang "tigre de calle dominicano" → ...you'll see 🦅🇩🇴
/lang "pirate" → "Arr matey, this code be cursed"
/lang "Yoda" → "Buggy this function is, yes hmm"
pip install -U dulus
$DULUS $Dulus
🔥2👎1
Dulus Channel
REMEMBER! ALWAYS BE CREATIVE WITH DULUS! The /lang command in Dulus accepts ISO codes OR any free-form descriptor. /lang zh → Mandarin /lang ja → Japanese /lang pt-br → Brazilian…
Working perfectly! here i set lang to zh reset Dulus write a simple Hey in english and he answer in zh
🔥2
Remember!!!!!!! just use /harvest gemini thats gonna open a webbrowser with a gemini chat WITHOUT LOGIN just write there Dulus the browser will close and PUM start using Dulus without an IA api key , i know i know op ❤️
🔥1
v0.2.93 — IA WITHOUT AN API KEY, FIRST-RUN. 🦅 The welcome wizard now 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 install to working IA in 30 seconds. Same flow works for Claude / Kimi / Qwen / DeepSeek if you have those accounts. This was Dulus's ace under the sleeve. Now it's the front door.
pip install dulus -U
pip install dulus -U
🔥2
