Personal AI agent with daily-driver CLI, modal TUI, and graph-based memory
Project description
The problem with AI agents isn't that they forget — it's that they improvise. durin is built the other way around: it remembers your work, sharpens its own skills, and runs on adaptable workflows that make it follow the exact steps you define instead of inventing its own. Reliable execution you control — local-first, on any model.
durin is named for Tolkien's dwarf-king of Khazad-dûm; the mark is a dwarven anvil lit by a forge flame.
Why durin
Workflows that follow your steps
Left to itself, an LLM agent improvises a different path every time — great for open-ended chat, unreliable for work you need done a specific way. durin lets you pin it to adaptable workflows: visual graphs of nodes with routing, loop-backs, parallel branches, sub-flows, and human checkpoints. A task then runs the way you designed it — every time. The agent can pause to ask you, resume exactly where it stopped, and even edit and improve a workflow on its own (with an auto-revert safety net). Few personal agents give you this much control over how the work gets done.
Loops that chase a goal, not a clock
A workflow runs once; a loop runs one over and over until a goal is actually
met. You give it a plain-language goal — plus optional checks (a shell command
that must exit 0, or an assertion an LLM judge grades) — and durin takes it from
there: it fires on a trigger (a schedule, an inbound message, a webhook, or you
just asking), runs the workflow, checks the result against the goal, and either
closes out or tries again next time. And when it keeps missing after a few
attempts, it doesn't spin forever — it stops and asks you.
A memory that's actually yours
durin builds an entity graph from your conversations — people, projects, documents, decisions — and keeps it as plain markdown you own. Recall is instant and offline: it searches an FTS + vector index without an LLM in the hot path, so it's fast and private. Documents you hand it (PDF, Office, EPUB, web pages) land in a separate Library, kept apart from everyday recall. The markdown is the source of truth; the search indexes are derived and rebuildable. (Benchmarked at LoCoMo ≈ 0.79.)
A skills ecosystem with guardrails
durin discovers skills from public marketplaces, security-scans each one for scam/malware patterns before you run it, and connects MCP servers from a curated catalog with one-click install and auto-detected OAuth. Its composition doctrine keeps behaviour reliable — prefer deterministic code, use workflows for structure, treat skills as the through-line the agent follows — and it sharpens its own skills over time.
See exactly what it's running
Every run — workflows, scheduled cron jobs, agent tasks — shows up in a live panel with per-step detail, status, and the model used. Nothing happens in a black box: watch a run, open a paused checkpoint, and pick up right where it stopped.
And more
- Any model, or none. 35 provider integrations — Anthropic, OpenAI, Gemini, NVIDIA, Mistral, DeepSeek, Groq, Z.AI, Qwen, Moonshot, and more, plus OpenRouter and other gateways that reach hundreds of models. Switch mid-conversation, or run fully local with Ollama / llama.cpp / vLLM / LM Studio.
- Talk to it anywhere. A CLI, a Textual TUI, a browser dashboard, and chat channels — Telegram, Slack, Discord, email, WhatsApp, WebSocket — all reach the same agent and the same memory.
- Local-first & private. Runs as a daemon on your own machine under
~/.durin/; nothing phones home. - Personas, voice, and schedules. Per-channel personas (a SOUL + a model), local speech-to-text and text-to-speech, and cron for scheduled work.
…and it gets sharper while you sleep
A cold-path dream runs offline: it consolidates your conversations into the memory graph and curates your skills, so durin quietly gets better at helping you over time — without you lifting a finger.
Quick start
durin installs with uv, which fetches a compatible
Python for you — nothing on your system has to match. Don't have uv yet?
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install --prerelease allow durin-agent # PyPI (uv picks a compatible Python)
durin onboard # interactive setup wizard
durin doctor # confirm setup is healthy
durin agent # launch the TUI
Run the gateway for the browser dashboard plus chat channels:
durin gateway start # dashboard at http://127.0.0.1:8765
See the install guide for prerequisites, optional extras (memory, local models, audio), and platform notes. For everyday and in-session commands, see the CLI reference.
Documentation
- Install · configure · uninstall
- CLI & in-session commands
- Configuration reference
- Providers & models
- Channels — Telegram, Slack, Discord, email, and more
- Documents & your knowledge
- Workflows
- Loops — workflows that repeat until a goal is met
- How it works (internals)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file durin_agent-0.3.0.tar.gz.
File metadata
- Download URL: durin_agent-0.3.0.tar.gz
- Upload date:
- Size: 31.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
676d2b72f4dc8199b55a9e41fb095ab9b60cc04544be7340805b282179d77826
|
|
| MD5 |
33f04e4c3315b76bb3bbd2f6d9bfb589
|
|
| BLAKE2b-256 |
2e7c5a22b558e100acc4bcce5001d7a02b5d04ef5602d963ffb836f1cf9cf5c8
|
Provenance
The following attestation bundles were made for durin_agent-0.3.0.tar.gz:
Publisher:
release.yml on mmarmol/durin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
durin_agent-0.3.0.tar.gz -
Subject digest:
676d2b72f4dc8199b55a9e41fb095ab9b60cc04544be7340805b282179d77826 - Sigstore transparency entry: 2194851212
- Sigstore integration time:
-
Permalink:
mmarmol/durin@bcd3b746a23a09317c6a1e73d10d02d77c8f10e5 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/mmarmol
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bcd3b746a23a09317c6a1e73d10d02d77c8f10e5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file durin_agent-0.3.0-py3-none-any.whl.
File metadata
- Download URL: durin_agent-0.3.0-py3-none-any.whl
- Upload date:
- Size: 31.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5b1233c7de398898b20ec5f084805d942c8e7ee5846828f50df2c3cec5400ed
|
|
| MD5 |
8cd9930c48d9f1b3342d112e5a81b0ae
|
|
| BLAKE2b-256 |
de02a1f22c571639e2b46b2157d470d38ac575a5980aff95e8f709405695568c
|
Provenance
The following attestation bundles were made for durin_agent-0.3.0-py3-none-any.whl:
Publisher:
release.yml on mmarmol/durin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
durin_agent-0.3.0-py3-none-any.whl -
Subject digest:
d5b1233c7de398898b20ec5f084805d942c8e7ee5846828f50df2c3cec5400ed - Sigstore transparency entry: 2194851236
- Sigstore integration time:
-
Permalink:
mmarmol/durin@bcd3b746a23a09317c6a1e73d10d02d77c8f10e5 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/mmarmol
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bcd3b746a23a09317c6a1e73d10d02d77c8f10e5 -
Trigger Event:
push
-
Statement type: