Tack
Self-evolving idiomatic personal assistant. ~15k lines of Python. Local-first. Provider-agnostic.
Install
pip install tack-agent
Imports as tack. CLI command is tack.
From source:
git clone https://github.com/egmaminta/tack && cd tack
uv sync
MCP servers and the Discord connector ship with the base install. The only optional extra is the heavy document parser:
pip install 'tack-agent[docling]' # PDF/DOCX/PPTX in ReadDoc
Quickstart
Point Tack at any provider that speaks OpenAI's chat-completions API.
ollama pull qwen2.5-coder:7b
tack
That's it. First run prompts you with three questions to seed the
identity files (~/.tack/soul.md, <project>/.tack/user.md,
<project>/.tack/agents.md). Skip with --no-bootstrap.
Configure
config.yaml in the project root, or ~/.tack/config.yaml for global.
Minimal:
provider: ollama
model: qwen2.5-coder:7b
That's the entire required config. Defaults handle the rest.
For paid providers, add api_key: (or set LLM_API_KEY). For
non-default endpoints, add api_base:. Everything else (identity,
memory, cron, connectors, sandbox, dreaming) is opt-in and documented
in the docs below.
Env vars override YAML: LLM_PROVIDER, LLM_MODEL, LLM_API_KEY,
LLM_API_BASE, DISCORD_BOT_TOKEN. Prefer env or config.yaml over
the --api-key CLI flag; argv values are visible to any process that
can read /proc/<pid>/cmdline (Linux) or open Task Manager (Windows).
CLI
tack REPL
tack --session bug-auth resume a named session
tack --provider ollama override provider
tack --model qwen2.5:7b override model
tack --thinking high reasoning effort: none|low|medium|high|xhigh|auto
tack --verbose show reasoning + telemetry
tack --trace write state transitions to ~/.tack/trace/
tack --no-sandbox run Bash on host instead of Docker
tack --no-mcp disable MCP servers
tack --no-bootstrap skip first-run identity dialogue
tack --daemon headless: cron + heartbeat, no stdin
Slash commands
/help /config /thinking [level] /verbose
/compact /reset /session {list|load|new|rename}
/skills /soul /user /agents
/mcp /listen /copy /exit
Tools
40 built-in:
| Group | Tools |
|---|---|
| Core | Bash, Read, Write, Edit, MultiEdit, LS, Grep, Glob, ReadImage, ReadDoc |
| Sub-agent | Agent, ReadSidechain, Compact |
| Todo + Tasks | TodoRead, TodoWrite, TaskCreate, TaskUpdate, TaskList, TaskGet, TaskNext |
| Web | WebSearch, WebFetch |
| Identity | SoulEdit, UserEdit, AgentsEdit |
| Skills | SkillCreate, SkillDelete, SkillList |
| Memory | MemorySearch |
| Cron | CronCreate, CronList, CronDelete, CronEnable, CronDisable |
| Heartbeat | HeartbeatEdit |
| Discord | DiscordChannelCreate, DiscordChannelList |
| Dream | DreamRun, DreamRead |
| EmailSend |
MCP tools merge in as mcp__<server>__<tool>.
Mutating tools (Bash, Write, Edit, identity edits, skill
mutations, every cron and heartbeat change, DiscordChannelCreate,
DreamRun, EmailSend) require approval. approval_policy: auto
cannot auto-approve identity, skill, cron, heartbeat, dream, or
email sends.
Profiles: lean (6), minimal (12), standard (21, default), full (40). See TOOLS.md.
Layout
tack/
__init__.py boot + dispatch (REPL or daemon)
config.py layered config: defaults < yaml < env < CLI
agent/ loop, prompt, session, identity, memory, cron, daemon
tools/ built-in tools + dispatcher
connectors/ connector protocol + Discord
mcp/ MCP client + manager
ui/ abstract UIBridge, RichBridge (REPL), SilentBridge (daemon)
~/.tack/
sessions/<hash>/ per-workdir session transcripts
memory.db SQLite FTS5 cross-session index
soul.md global persona
cron/<id>.json scheduled jobs
logs/daemon.log daemon output
<project>/.tack/
user.md per-project profile
agents.md per-project rules
Docs
| HOW-TO-SOUL.md | Identity files, agent self-edits, git integration |
| HOW-TO-SKILLS.md | Built-in skills, enable/disable, write your own |
| HOW-TO-MEMORY.md | SQLite FTS5 cross-session recall |
| HOW-TO-CRON.md | Cron expressions, daemon mode, failure handling |
| HOW-TO-DISCORD.md | Bot setup, allowlist, security model |
| HOW-TO-DREAM.md | Nightly memory consolidation |
| HOW-TO-EMAIL.md | SMTP+TLS, allowlist, approval gate |
| HOW-TO-MCP.md | Connect any MCP server |
| TOOLS.md | Tool catalog, profile selection, sample scenarios |
| TROUBLESHOOTING.md | Top failure modes, 5-minute fixes |
| CHANGELOG.md | Per-release notes, newest first |
Status
- Currently pre-release: v1.x.x. GitHub releases.
- Python 3.12+, no cloud services required for core function.
- CI: Linux, macOS, Windows.
uv run pytest tests/ -qruns the suite locally. - MIT license. See LICENSE.
Metadata
Release files for tack-agent 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tack_agent-1.0.4.tar.gz | 197.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tack_agent-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 420.5 kB
Release files / tack_agent-1.0.4.tar.gz
| Download URL | tack_agent-1.0.4.tar.gz |
|---|---|
| Size | 197.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe1e450a38ad86468839d01c416e38990d5cea16aa74bbd5cd885ae811e9196c
|
|
BLAKE2b-256 checksum How to use checksums |
bf755d4df88dbd3e803a0805ca325be6374bc1fd8aa59e0da5bc8c0efb7a51e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 29, 2026.
Transparency logRelease files / tack_agent-1.0.4-py3-none-any.whl
| Download URL | tack_agent-1.0.4-py3-none-any.whl |
|---|---|
| Size | 223.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c173b1a2f7c0e4b37d993bc494a3851529ab7f3c88fc24f04fac90f0c70c01c8
|
|
BLAKE2b-256 checksum How to use checksums |
1f62456654c1742ed99b05af5fac3507ad6d76c65e225b2bd786f95f7bd0552e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 29, 2026.
Transparency log