telcontar
Local AI assistant that organizes a directory tree: renames files to readable names based on content, moves them to sensible locations, quarantines clutter, and produces an index and summary. Once a corpus is analyzed, an interactive query mode lets you ask natural-language questions over the registry, event journal, and knowledge graph — read-only, no reorganization needed. All file operations run locally; only content snippets are sent to the LLM endpoint.
Architecture: custom MCP server (file tools) + custom MCP host (agent loop) over stdio transport.
Prerequisites
- Python 3.12+
- uv for environment management
- Access to any OpenAI-compatible chat-completions endpoint (Azure OpenAI, Mammouth, or another compatible provider)
Setup
uv tool install git+https://github.com/reboulip/telcontar.git
Then launch telcontar once. On first run the setup wizard appears automatically — it collects your AI service URL and API key, stores the key in the OS credential store (Windows Credential Manager / macOS Keychain), and saves non-sensitive settings to ~/.telcontar/config.env. No manual editing of config files required.
For developer / contributor setup (clone + uv sync), see docs/getting-started/installation.md.
Usage
telcontar
Telcontar opens in its own native window (via pywebview, Windows only) rather than a browser tab — pass --browser to use the system browser instead, or telcontar falls back to it automatically (with a warning) if pywebview isn't installed or the platform isn't Windows.
On first run the setup wizard appears automatically (/setup) — it collects your AI service URL and API key. Once configured, telcontar opens on a startup page with a directory tree in the left sidebar; pick a folder there, then choose:
- Use selected directory — starts an Organize run. It opens on a starter pane showing a code-generated directory overview (file/subfolder counts, common file types — no LLM call yet) plus an optional field for steering instructions (e.g. "group by workstream", "don't quarantine drafts"); press Start organizing to launch the run. Telcontar first recursively surveys nested subfolders (not just the top level) and analyzes any documents it hasn't seen before — a document already known from a previous run is never re-read or re-sent to the model; before fetching content for the new ones it pauses once to show a rough cost estimate scoped to just those new documents (new document count, already-analyzed count, estimated input tokens, from file sizes alone) and waits for you to proceed or cancel. The agent then designs and stages the reorganization — free to redesign the existing layout entirely — and may pause at any point before or while building the plan to check in with you in chat: genuine clarifying questions, a few competing options to pick between (e.g. how to group a set of documents), or a mix — reply in the chat box and it continues; not capped at once, since it's a normal chat exchange, so it can check in again later if a new ambiguity comes up.
- Query — opens an interactive read-only chat over an already-analyzed corpus (requires the selected folder, or one of its parent folders, to contain a
.organizer/from a previous Organize run — memory is per-directory, stored inside the organized tree itself).
A chat box at the bottom of the Organize run page is live for the whole run, not just once it stops — type a message at any point (e.g. "actually, group by year instead") and it's woven into the agent's in-progress work as soon as it's between turns, without waiting for the run to finish first. After the run reaches a stopping point (done, error, or max-turns), the same box keeps working — a follow-up message (e.g. "quarantine the drafts too") resumes the same conversation, on the same MCP session, with the same organize toolset (document content stays unavailable, since the corpus was already analyzed). Once the run is done, a Query this corpus button jumps into the separate read-only query mode, and a Browse corpus button opens a table/detail view of every analyzed document. A Journal button (with a live undo-able-operations count) is available throughout the run — it opens a dialog listing every filesystem operation telcontar has made, with an Undo last operation action (confirmed before it runs).
Every page keeps a persistent header nav bar — Conversation / Corpus / Query / Settings tabs for jumping straight between views. Conversation and Corpus enable once a run is active, Query enables once telcontar can resolve an analyzed corpus for the current directory, and Settings is always available. Every page also keeps the same left sidebar: the directory tree (which live-updates as files are renamed/moved/quarantined), and a ⚙ Settings entry (/settings, reachable from anywhere) — edit URL, API key, profile, and approval mode at any time, including mid-run. Settings also has a read-only "What telcontar tells the model" panel showing the exact organize/query/analyze system prompts telcontar composes and which domain profile actually resolved.
CLI flags:
| Flag | Description |
|---|---|
--version |
Print the installed version and exit. |
--target PATH |
Skip the landing page's directory picker and start a run for PATH immediately. |
--browser |
Launch the web UI in the system browser instead of a native window. |
Development
uv run --group test pytest # run tests
uv run ruff check . # lint
uv run mypy host server config # type check (CI gate)
uv run ty check host server config # type check (fast local check)
Contributor setup, including the pre-commit hooks that wire these in, is covered in docs/developer/contributing.md.
Safety model
APPROVAL_MODE=always(default): every plan requires explicit user approval before execution.- Every path-taking tool is confined to the directory you're organizing (plus telcontar's own working files) — an agent can't be steered into reading or writing outside it.
- Nothing is ever deleted — clutter goes to
QUARANTINE_DIR(_quarantine/by default). - Agent-proposed taxonomy folders can never collide with the quarantine folder: renaming, moving into, or creating a folder whose name reads as quarantine-like (case/locale-insensitive, plus a fixed set of discard-word aliases across languages) or that resolves inside
QUARANTINE_DIRis rejected. - Every filesystem mutation — renames, moves, quarantines, file writes, folder creation, archiving, and quarantine compression — is staged as a plan op and only takes effect through
execute_plan; there is no tool that touches the filesystem directly. - Every destructive operation is journaled. Undo is a manual, user-only action: press j in the Organizer screen to open the operations journal, then u to revert the most recent operation — the agent itself has no undo tool.
- Compressing loose quarantine files into a verified ZIP archive (reclaiming space) is staged the same way and remains fully reversible via undo.
Credits
- The web UI's display typeface is Cinzel, copyright The Cinzel Project Authors, licensed under the SIL Open Font License 1.1 (vendored at
host/web/assets/fonts/).
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 telcontar-1.0.0.tar.gz.
File metadata
- Download URL: telcontar-1.0.0.tar.gz
- Upload date:
- Size: 691.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36dfcceaba590dc54a970080069380a47a21c0206bf51981aca85bf3f13e8de4
|
|
| MD5 |
fe4f4110c60cc03e0baad3b4c5290420
|
|
| BLAKE2b-256 |
2c98306b0f3d9a6fbe8d7813d4a823daf82b4ce9c49461638b570cc102949fa4
|
Provenance
The following attestation bundles were made for telcontar-1.0.0.tar.gz:
Publisher:
release.yml on reboulip/telcontar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
telcontar-1.0.0.tar.gz -
Subject digest:
36dfcceaba590dc54a970080069380a47a21c0206bf51981aca85bf3f13e8de4 - Sigstore transparency entry: 2581865141
- Sigstore integration time:
-
Permalink:
reboulip/telcontar@447801ed64629a928a9293523f5e4188d48e4e82 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/reboulip
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@447801ed64629a928a9293523f5e4188d48e4e82 -
Trigger Event:
push
-
Statement type:
File details
Details for the file telcontar-1.0.0-py3-none-any.whl.
File metadata
- Download URL: telcontar-1.0.0-py3-none-any.whl
- Upload date:
- Size: 214.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e23cc5438fc8b1e531a82737b1aeb4bf2f1be5b479ba5500792eccf543c14229
|
|
| MD5 |
0a934faad2f05cdd34af610aa92d3054
|
|
| BLAKE2b-256 |
5f29098f0fc27bd0a03a2815a7a0d08993087a7fc4500c5679265a3ab3154986
|
Provenance
The following attestation bundles were made for telcontar-1.0.0-py3-none-any.whl:
Publisher:
release.yml on reboulip/telcontar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
telcontar-1.0.0-py3-none-any.whl -
Subject digest:
e23cc5438fc8b1e531a82737b1aeb4bf2f1be5b479ba5500792eccf543c14229 - Sigstore transparency entry: 2581865144
- Sigstore integration time:
-
Permalink:
reboulip/telcontar@447801ed64629a928a9293523f5e4188d48e4e82 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/reboulip
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@447801ed64629a928a9293523f5e4188d48e4e82 -
Trigger Event:
push
-
Statement type: