An AI teammate that reads your entire codebase once and never forgets it.

Connect GitHub and it pulls in all of your repositories — every one of them — then starts learning and onboarding itself: it parses every file, mines the git history, and builds a knowledge graph of functions, call edges and owners. Then it joins the team: answers questions with file-and-line receipts, traces bugs to the person who owns them, and opens real pull requests.
Self-hosted — your code never leaves your servers.

$ docker compose up -d --build
MIT license · beta · bring your own LLM (or run one locally) · cloud version coming soon
What it does, and why it helps
Learns the entire codebase

Pulls every repo from your GitHub, parses every file and mines every commit into a graph + embeddings. New engineers stop spending weeks building a mental model — it's already built, and it stays current.

Answers with receipts

Every reply is grounded in real lookups — semantic search, graph queries, blame. You get the file and the line, not a hallucinated guess.

Knows who owns what

Ownership is mined from git history, weighted by commits. "Who should review this?" and "who do I ask?" stop being tribal knowledge.

Sees the blast radius

Call edges in the graph answer "what depends on this?" before you touch it. Fewer surprise breakages from innocent-looking changes.

Ships real code

Edits files, runs tests and lint, branches, commits, opens the PR itself. Small fixes go from "someday" to "merged" without stealing an engineer's afternoon.

Runs the rituals

Standup, task board, weekly digest — deterministic pages fed by real data, postable to Slack. Status meetings write themselves.

Stays observable

Every LLM call metered with a monthly budget guardrail; every agent action audited; live container logs in the UI. A self-hosted agent never becomes a surprise bill or a mystery.

Keeps code private

Runs on your infrastructure with your LLM key — or a fully local model via Ollama. Nothing phones home; with local models, nothing leaves the box at all.

Ask it things
who owns billing?
ownership from git history, one honest row per person
what calls retry_task?
call-edge lookup in the graph — structure, not vibes
where do we handle webhooks?
semantic search over embeddings of your actual code
trace this stack trace
attach a file; it reasons over it next to your code
summarize this week's PRs
pull requests synced from GitHub and reconciled locally
fix it and open a PR
branch → edit → test → lint → pull request, by itself
How it learns a repo

Add one repo at a time — or connect GitHub, click “Browse my repositories,” and bulk-select everything you own. Each repo rides a pipeline that turns source code into queryable knowledge. Progress is shown per stage with real status — failed stages retry.

1/5
clone
git clone into local storage on your box
2/5
parse
tree-sitter extracts functions, classes, call edges — Python, JS/TS, Go, Rust, Java+
3/5
embed
code chunks vectorized into pgvector; local embeddings by default, zero cost
4/5
graph
Neo4j nodes wired with PART_OF, CALLS, OWNS edges
5/5
mine
git history → ownership; PRs pulled from GitHub and reconciled

then a background poller re-syncs every 15 minutes, so its knowledge tracks reality without a manual re-onboard.

The toolbox — 28 tools, it picks which to call

A real agent loop: think, call a tool, read the result, keep going until it can answer. Exactly like a senior engineer with a terminal.

files
read_file write_file edit_file list_directory glob_search grep_search
git
create_branch commit_files create_pr get_diff get_blame get_commit_log list_prs
knowledge
semantic_search graph_query find_owner find_dependents find_dependencies get_architecture trace_issue
memory
write_note search_notes
exec
run_command run_tests run_lint http_request schedule_task web_search

write_note / search_notes give the team a durable memory that survives across conversations and links into the graph.

Two brains, one teammate

pgvector answers "what code means this?" — Neo4j answers "how does it connect?" Vector search guesses by meaning; the graph knows by structure. Together they keep every answer grounded.

          your question
               |
               v
        +-------------+        28 tools
        |    agent    | -----------------------+
        +-------------+                        |
           |        |                          v
           v        v                   +--------------+
   +-----------+  +-----------+         |  git + gh    |
   | pgvector  |  |   neo4j   |         |  tests, lint |
   | "what     |  | "what     |         |  real PRs    |
   |  means?"  |  | connects?"|         +--------------+
   +-----------+  +-----------+
        semantic search    CALLS / OWNS / PART_OF
The whole stack, one compose file
                        +----------------------------------+
     Browser --TLS-->   |  Caddy  (reverse proxy :80/:443) |
                        +---------------+------------------+
                        /api/*          |          everything else
                 +----------------------+-----------------------+
                 v                                              v
        +-----------------+                          +--------------------+
        |  FastAPI  :8000 |                          |  Next.js 14  :3000 |
        |  (REST + auth)  |                          |  (App Router UI)   |
        +--------+--------+                          +--------------------+
                 |
    +------------+---------------+-------------+-------------+
    v            v               v             v             v
+--------+  +-----------+  +-----------+  +----------+  +----------+
|postgres|  |   neo4j   |  |   redis   |  |  celery  |  | cloned   |
|pgvector|  | knowledge |  | broker +  |  | worker + |  | repos    |
| + ORM  |  |   graph   |  |  cache    |  |  beat    |  | /data    |
+--------+  +-----------+  +-----------+  +----------+  +----------+

LLM via LiteLLM  -->  DeepSeek · OpenAI · Anthropic · Groq · Ollama (local)
Observability    -->  Prometheus · Grafana · Loki/Promtail · Flower · node-exporter
Not just chat — a whole workspace
/chat
streaming agent, thread history, search, export to markdown
/tasks
drag-and-drop kanban backed by a real API, not mock cards
/standup
yesterday's PRs, today's tasks, real blockers — postable to Slack
/team
every contributor mined from git, deduped to one honest row
/knowledge
concept cards mapping the subsystems it has learned
/costs
every LLM call metered, with a monthly budget guardrail
/audit
a queryable record of every agent action
/logs
live container logs with per-level filters — no SSH needed
Privacy by architecture
Your servers

The whole stack runs on your infrastructure via Docker Compose. Code, embeddings and graph stay put. Nothing phones home.

Your LLM key

OpenAI, Anthropic, DeepSeek, Groq — or a local Ollama model. With local embeddings (the default) plus a local model, nothing leaves the box, full stop.

Locked-down API

Every endpoint requires login; auth rides an HttpOnly cookie XSS can't steal. Account creation is admin-only. A reachable instance can't be self-registered into.

Masked secrets

API keys and tokens are stored server-side and masked on read — never echoed back to the client. Rotate keys through the UI without redeploying.

Quickstart — 2 steps

Requirements: Docker + Compose v2, ~6 GB free RAM, one LLM key (or a local Ollama model).

# 1. clone and configure
$ git clone <your-fork-url> teammatex && cd teammatex
$ cp .env.example .env # set a secret key + one LLM key
# 2. launch everything — db migrations run automatically
$ docker compose up -d --build
✓ api · worker · frontend · postgres · neo4j · redis · caddy — healthy

open localhost:3000, grab the one-time admin password from the api logs, then: name your teammate → add an LLM key → connect GitHub → add repositories. minutes later it has read its first repo.

a read-only GitHub token is enough — it can pull, learn and answer with read access alone. grant write scope only if you want it opening PRs.

FAQ
Does my source code leave my servers?
No. It clones and analyzes everything locally. The only thing that can leave is what you send to your chosen LLM on a chat turn — and even that disappears with a local Ollama model + local embeddings (the default). Fully local means nothing leaves the box.
Which LLM should I use?
OpenAI, Anthropic, DeepSeek, Groq, or local Ollama — one-line config. DeepSeek is the cost-effective default for tool loops; frontier models for maximum capability; Ollama for maximum privacy at zero cost.
Can it actually open pull requests?
Yes — it runs git and gh itself: branch → commit → PR. It needs a GitHub token with write scope; a read-only token lets it clone and read, but a push will 403.
What languages does it understand?
Tree-sitter parsing: Python, JavaScript/TypeScript, Go, Rust, Java and more. Call-graph extraction is strongest for mainstream languages; semantic search and ownership work for any text-based repo.
Why both PostgreSQL and Neo4j?
Different jobs. pgvector: "what code is semantically similar to this question?" Neo4j: "what calls this? who owns it? what's the blast radius?" Meaning + structure = grounded answers.
Is there a hosted version?
Not yet — a cloud version is coming soon. Today it's self-hosted first, which is the privacy story: run it on a VM or inside your VPC. A 4 vCPU / 8 GB box is comfortable.
Stop re-explaining your codebase.

One compose file. Your servers. A teammate that already did the onboarding.

$ docker compose up -d --build