Self-evolving coding agent. Small, sharp, gets things done. Yours.
Project description
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.
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 tack_agent-1.0.4.tar.gz.
File metadata
- Download URL: tack_agent-1.0.4.tar.gz
- Upload date:
- Size: 197.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe1e450a38ad86468839d01c416e38990d5cea16aa74bbd5cd885ae811e9196c
|
|
| MD5 |
532aa85c2448ac4245027426106605ce
|
|
| BLAKE2b-256 |
bf755d4df88dbd3e803a0805ca325be6374bc1fd8aa59e0da5bc8c0efb7a51e0
|
Provenance
The following attestation bundles were made for tack_agent-1.0.4.tar.gz:
Publisher:
publish.yml on egmaminta/tack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tack_agent-1.0.4.tar.gz -
Subject digest:
fe1e450a38ad86468839d01c416e38990d5cea16aa74bbd5cd885ae811e9196c - Sigstore transparency entry: 1399568353
- Sigstore integration time:
-
Permalink:
egmaminta/tack@cef929fe494740db73b4c78031d77f57119a04cf -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/egmaminta
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cef929fe494740db73b4c78031d77f57119a04cf -
Trigger Event:
release
-
Statement type:
File details
Details for the file tack_agent-1.0.4-py3-none-any.whl.
File metadata
- Download URL: tack_agent-1.0.4-py3-none-any.whl
- Upload date:
- Size: 223.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c173b1a2f7c0e4b37d993bc494a3851529ab7f3c88fc24f04fac90f0c70c01c8
|
|
| MD5 |
2ab051f0e37283176db34c36cb47d1fc
|
|
| BLAKE2b-256 |
1f62456654c1742ed99b05af5fac3507ad6d76c65e225b2bd786f95f7bd0552e
|
Provenance
The following attestation bundles were made for tack_agent-1.0.4-py3-none-any.whl:
Publisher:
publish.yml on egmaminta/tack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tack_agent-1.0.4-py3-none-any.whl -
Subject digest:
c173b1a2f7c0e4b37d993bc494a3851529ab7f3c88fc24f04fac90f0c70c01c8 - Sigstore transparency entry: 1399568360
- Sigstore integration time:
-
Permalink:
egmaminta/tack@cef929fe494740db73b4c78031d77f57119a04cf -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/egmaminta
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cef929fe494740db73b4c78031d77f57119a04cf -
Trigger Event:
release
-
Statement type: