Open source · MIT · Slack app

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.

# general

Nia9:41 AM

@Griot what's our refund policy?

GriotAPP9:41 AM

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.

The problem

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.

The memory model

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

knowledge

Facts 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

decisions

Team 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

todos

Todos 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

messages

A 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

Flagship feature

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.
# engineering

Sam2:14 PM

@Griot #decision we're shipping the v2 release this Friday

GriotAPP2:14 PM

Logged ✅ ⚠️ Heads-up: this may contradict an earlier decision —

“No production deploys on Fridays” — logged 12 Jun

GriotAPP2:14 PM

Both are on the record. If one should go, just tell me to forget it.

How to use 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 sayGriot 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 monthStores it in semantic memory: chunked, embedded, vector-indexed.
Log a decision@Griot we're switching to monthly invoicingAuto-detects the decision and logs it — #decision forces it explicitly. Contradictions trigger the Conflict Guard.
Undo a decision@Griot forget thatSoft-deletes the latest decision. Nothing is ever truly lost.
Add a task@Griot Ada is to design the flyer by FridayCreates a todo with the owner and deadline parsed from plain language.
Update a task@Griot move the flyer deadline to MondayFinds the existing todo and updates it — deadlines and owners change in plain language too.
Complete a task@Griot the flyer is readyMatches 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 designSearches 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 ruleRetires 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.

How it works

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.

Events APIschedulesposts summaries & remindersSlackyour workspaceAPI Gatewayevents + OAuthLambdaBolt + agent coreGeminiprovider-agnosticCockroachDBvector indexes +transactional tableskeyed by workspace_idEventBridgetwo cronsLambdasummary + deadlines

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.

Self-hosting

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

  1. 1Clone and install. git clone the repo, npm install, and copy .env.example to .env.
  2. 2Migrate the database. Point DATABASE_URL at your CockroachDB cluster and run npm run db:migrate — schema, vector indexes and all.
  3. 3Create the Slack app. Add the bot scopes and event subscriptions, then copy the tokens and signing secret into .env.
  4. 4Run locally. npm run dev starts Griot over Socket Mode — invite @Griot to a channel and say hi.
  5. 5Deploy to AWS. Set the SST secrets and npx sst deploy — Lambda, API Gateway, and the EventBridge crons ship together.
Full guide in the README
FAQ

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.