A persistent memory agent that remembers, clarifies, and keeps your commitments. To err is human; Erring hopes to help you remember.
Humans err. We forget commitments, lose context, leave details unsaid, and remember conversations differently. AI assistants often make this worse by confidently filling in the gaps instead of asking for clarification.
Erring is built on a simple principle: when something matters, remember it; when something is missing, ask.
- 🧠 Persistent memory across conversations
- ✅ Commitment detection and tracking
- ❓ Clarification when key information is missing
- 🔍 Semantic retrieval of past facts and commitments
- 📜 Transparent memory updates
Erring's memory and conversation loop are independent of its interfaces:
CLI ---------\
> Erring core -> SQLite
Telegram ----/ -> LLM provider
The CLI and Telegram adapter use the same user-wide structured memory.
Install dependencies and create local configuration:
uv sync
cp .env.example .envSet DEEPSEEK_API_KEY in .env, then start the terminal interface:
uv run erring chatTelegram is an optional local interface. It uses long polling, so Alibaba Cloud, webhooks, and public hosting are not required.
-
Create a bot with BotFather.
-
Add its token to
.env:TELEGRAM_BOT_TOKEN=replace_with_bot_token
-
Start the adapter:
uv run erring telegram
-
Send
/startto the bot. In setup mode, it replies with theTELEGRAM_ALLOWED_USER_IDvalue to add to.env. -
Restart
uv run erring telegram.
Only that Telegram user is accepted. The first authorized Telegram identity is linked to the existing local Erring user, so CLI and Telegram share commitments, projects, observations, and accumulated experience. Telegram group chats are ignored in this version.
You: "Remind me to finish the OCR pipeline."
Erring: "Sure. When would you like to finish it?"
Later:
You: "What did I promise to work on this week?"
Erring: "You committed to finishing the OCR pipeline by Friday."
Erring is an experiment in building AI that compensates for human fallibility rather than pretending uncertainty doesn't exist.