An AI teammate with institutional memory
Griot lives in your Slack workspace. It answers from what your team has taught it, remembers every decision — and pushes back when a new one contradicts an old one — tracks tasks in plain language, researches the web when you ask, and keeps the rhythm with daily summaries and morning deadline checks.
@Griot what's our refund policy?
Refunds are honored within 14 days of purchase, no questions asked. After that, store credit only — per the policy the team taught me in March.
Teams forget. Constantly.
The knowledge is all there — it's just buried in channels nobody scrolls back through.
Decisions vanish in the scroll
The team agreed on something three weeks ago. Nobody remembers where, or exactly what.
New hires ask the same questions
The answers exist — scattered across channels, DMs, and the heads of two busy people.
Todos die in threads
"Can someone handle this by Friday?" gets a thumbs-up, then silently expires.
Four kinds of memory, one database
Everything lives in CockroachDB, keyed by workspace from the first row — vector search and transactional tables side by side.
Semantic memory
knowledgeFacts your team teaches it — chunked, embedded as VECTOR(768), and retrieved top-k through a cosine vector index. Answers are grounded RAG: if the knowledge isn't there, Griot says "Not sure" instead of inventing it.
Example @Griot learn Our standard rate is $50/hour
Episodic memory
decisionsTeam decisions, auto-detected from normal conversation and logged append-only. Saying "forget" soft-deletes the latest one, so every undo still leaves an audit trail.
Example @Griot we're switching to monthly invoicing
Task memory
todosTodos with owners and deadlines, parsed from plain language. Add, update, complete, and list tasks by just saying so — no syntax to learn.
Example @Griot Ada is to design the flyer by Friday
Working memory
messagesA rolling window of the last 15 messages per channel — including Griot's own replies — so multi-turn context and self-consistency survive across the conversation.
Example Automatic — every channel message keeps the window fresh
The Conflict Guard
Every new decision is vector-matched against past decisions and the knowledge base before it lands. On a contradiction, Griot still logs it — your team stays in charge — but it pushes back, quoting the earlier rule so nobody overwrites history by accident.
- Logs first, warns second — the decision is never blocked, only flagged.
- Matches against both past decisions and taught knowledge.
- Quotes the exact earlier rule, with the date it was logged.
- One "forget" resolves it — the soft delete keeps the audit trail.
@Griot #decision we're shipping the v2 release this Friday
Logged ✅ ⚠️ Heads-up: this may contradict an earlier decision —
“No production deploys on Fridays” — logged 12 Jun
Both are on the record. If one should go, just tell me to forget it.
No slash commands. No syntax. Just talk.
Mention @Griot and say what you mean — an intent classifier routes every message to the right memory.
| You say | Griot does |
|---|---|
| Ask a question@Griot what's our refund policy? | Answers from the team knowledge base (RAG) — and says "Not sure" rather than inventing facts. |
| Teach a fact@Griot learn We invoice on the 1st of every month | Stores it in semantic memory: chunked, embedded, vector-indexed. |
| Log a decision@Griot we're switching to monthly invoicing | Auto-detects the decision and logs it — #decision forces it explicitly. Contradictions trigger the Conflict Guard. |
| Undo a decision@Griot forget that | Soft-deletes the latest decision. Nothing is ever truly lost. |
| Add a task@Griot Ada is to design the flyer by Friday | Creates a todo with the owner and deadline parsed from plain language. |
| Update a task@Griot move the flyer deadline to Monday | Finds the existing todo and updates it — deadlines and owners change in plain language too. |
| Complete a task@Griot the flyer is ready | Matches the message against open todos and closes the right one. |
| List tasks@Griot what's pending? | Lists open tasks, soonest deadline first. |
| Research the web@Griot find out what competitors charge for logo design | Searches the live web and replies with concise findings plus the sources it used — for anything beyond the team's own knowledge. |
| Ask for provenance@Griot why did you say that? | Explains its last answer's sources — which memories it quoted, match strength, and when they were learned. |
| Replace a rule@Griot replace the old rule | Retires the old rule the Conflict Guard flagged — only the new decision is retrieved from then on. |
Daily summary — 8:00 pm
Posts a recap in every channel that had real activity. Quiet channels are skipped, not spammed.
Deadline check — 8:30 am
Posts due-today and overdue task reminders in the channel where each task was created.
Serverless in front, one database behind
Slack events flow through API Gateway into a Lambda running the agent core; EventBridge crons drive the daily summary and deadline check.
One database does both jobs: CockroachDB holds the VECTOR(768) cosine indexes for semantic search and the transactional tables for decisions, todos, and messages — side by side. Every table and every vector index is keyed by workspace_id, so similarity search is tenant-isolated at the index level.
Run it yourself — it's MIT licensed
Everything deploys from one repo with SST: the event Lambda, the OAuth flow, and both crons. Here's the shape of it.
You'll need
- Node.js ≥ 22 and npm
- A CockroachDB Cloud cluster on v25.2+ (the free tier works)
- A Gemini API key
- An AWS account with credentials configured locally
- A Slack workspace where you can create apps
Five steps
- 1Clone and install. git clone the repo, npm install, and copy .env.example to .env.
- 2Migrate the database. Point DATABASE_URL at your CockroachDB cluster and run npm run db:migrate — schema, vector indexes and all.
- 3Create the Slack app. Add the bot scopes and event subscriptions, then copy the tokens and signing secret into .env.
- 4Run locally. npm run dev starts Griot over Socket Mode — invite @Griot to a channel and say hi.
- 5Deploy to AWS. Set the SST secrets and npx sst deploy — Lambda, API Gateway, and the EventBridge crons ship together.
Common questions
Is my data isolated from other workspaces?
Yes. Every table and every vector index is keyed by workspace_id, so similarity search is tenant-isolated at the index level — no query path exists that crosses workspaces. Unknown workspaces get a polite "not set up" reply.
What LLM does it use?
Gemini today, behind a provider-agnostic wrapper (complete + embed with retries and timeouts). A Bedrock provider sits behind a flag, so swapping providers is a config change, not a rewrite.
Can I self-host it?
Yes — Griot is MIT-licensed and open source. You need a CockroachDB Cloud cluster, a Gemini API key, an AWS account, and a Slack app; the README walks through the whole setup.
What does it store?
Recent channel messages (a rolling window), the facts you teach it, decisions, and todos — all in CockroachDB, all keyed by your workspace. Decisions are append-only, so the history stays inspectable.
What if the answer isn't in the knowledge base?
For business facts, Griot says "Not sure" instead of guessing. But ask it to research something — "find out what competitors charge" — and it searches the live web and comes back with findings and the sources it used.
How do I undo something?
Say "@Griot forget that". The latest decision is soft-deleted — it stops applying, but the audit trail survives.
Does it work in threads?
Yes. Mention @Griot in a thread and it replies there, with the same memory behind it.