Install
Add attest_tag to Slack or Teams.
An AI teammate that answers in the thread it was asked in — from your channels, your documents and the services your admins connected. It never holds a key, and it stops before it changes anything.
A Slack workspace admin, or a Teams admin, installs it once.
What it does
The answer is in Slack. Finding it is the problem.
The decision is in a thread from three weeks ago, the policy is in a document nobody can find, and the status is in a tool you have to open in another tab. So somebody asks in the channel, and somebody else stops what they are doing to go and look.
attest_tag answers those questions where they are asked. Mention it in a channel or send it a direct message: it reads the thread it was asked in, searches the channels and documents it has been given, calls the services your admins connected, and replies in place — streaming, with a status line saying what it is reading and a footer saying what the answer cost.
It is one app with a web console attached. The console is where admins decide, per channel, what it may reach and which model it runs on; Slack is where everybody else uses it.
Priya10:42 AM
@attest_tag we are seeing duplicate invoices on the Q3 renewals. has this shape come up before?
attest_tagApp10:42 AM
read 42 messages in #support · searched #billing, #incidents
Twice, and both times it was the retry in billing-sync firing before Stripe acknowledged the first call.
- 12 Aug, #billing — Marco added an idempotency key on the renewal path. Duplicates stopped that day.
- 3 Sep, #incidents — same signature on one-off invoices, which still use the old path.
These renewals are on the patched path, so it is worth checking whether the retry budget was raised in last week’s deploy.
google/gemini-flash1.2k in340 out$0.0012Configure
Answers where you asked
Mention it in a channel or send it a DM and it replies in that thread, reading the conversation around the question first so you never re-explain the context you are standing in.
Reads the channels it was invited to
Channel history, pins, and a workspace search over public channels run on behalf of the person asking — so it never returns something they could not find themselves.
Opens what you shared
A contract, a log, a PDF dropped in the thread. It reads the file the question refers to rather than indexing your workspace’s file storage.
Searches your documents
Upload documentation in the console and it is chunked, embedded and searchable in minutes. A document can be scoped so it only answers in the channel it belongs to.
Calls the services you connected
GitHub, ClickUp, Sentry, Google Workspace, the web, or any remote MCP server — through a proxy that injects the credential at the network edge, so the model never sees it.
Remembers what you tell it to
“remember for this channel: the release captain rotates weekly.” Channel memories are shared; what you tell it in a DM stays yours.
Runs on a schedule
“every weekday at 9am, post a digest of #support.” A routine can also stay silent unless what it finds crosses a bar you set.
Stops before it changes anything
Reads run. Writes are held in the thread with a Confirm card, and a write that grants someone access goes to an approver instead of the asker.
Install it
Four steps, and Slack does two of them.
From pressing the button to a first answer in a channel is about five minutes. Connecting your documents and services comes afterwards, in your own time.
Create your organisation, or sign in to it.
Pressing Add to Slack sends you to the attest_tag console. If your company is already running it, sign in; if you are the first person here, create an account — an email address and a password, under a minute. The account exists because the workspace’s settings, connections and audit trail have to belong to somebody.
Approve the app on Slack’s consent screen.
The console hands you to Slack, which shows the permissions listed below and asks which workspace to install into. Press Allow and Slack sends you straight back.
Only a workspace admin or owner can complete this step. We ask Slack who you are before saving anything, and a workspace that is already connected to another organisation is refused rather than quietly moved.
Org-wide installs are not supported yet — install into a single workspace. More than one workspace can be connected to the same organisation, one at a time.
Invite it to one channel.
Nothing happens until you do. Type /invite @attest_tag in the channel you want it in — or whatever your workspace named the app; the console shows the exact handle — and the setup screen notices within a few seconds.
Pick a real channel rather than a test one. Every channel is its own scope, with its own instructions, model, budget and connections, so the second channel is a decision you make later with evidence behind it.
Ask it something.
Mention it with a question the channel already knows the answer to — that is the fastest way to see whether it read the room. Out of the box it can reach the conversation it was invited to and nothing else.
Then connect what it should be able to reach: upload documents, add a service, choose a model. That part lives in the console and takes about twenty minutes.
Ready when you are.
The button opens the attest_tag console, where you sign in or create an account, and then hands you to Slack’s own consent screen.
Questions first? Talk to us.
Permissions
What the consent screen asks for, and why.
Slack shows this list at install time. It is worth reading, so here it is in advance with the reason beside each one — and the two sentences that are true of all of them:
- It reads only the conversations it has been invited to. A channel it is not in is invisible to it, including to an admin asking through it.
- It answers on behalf of the person asking and never widens what that person can already see.
assistant:write
chat:write.customize
groups:history
im:history
mpim:history
groups:read
im:read
#billing, confirms it is actually a member before reading, and lists the channels it is in so admins can configure it per channel.files:write
reactions:write
users:read.email
U0123ABCD, and skips bots and deactivated accounts. The email address matches a Slack account to the same person in the console and lets a workspace restrict the app to its own domain — it is never used for marketing.No scope here writes to your workspace beyond the app’s own messages, reactions and files. It cannot create, rename or archive a channel, cannot read a channel it was not invited to, and cannot act on behalf of a member. What stops it doing something stupid is a page of its own.
After installing
You land back in the console, on the next step.
Slack returns you to the attest_tag setup screen, which confirms the workspace is connected, names it, and shows the one thing left to do: invite the app to a channel. It watches for that invite and moves on by itself when it sees it.
From there the screen walks the rest — ask a first question, connect documents and services, invite the colleagues who will administer it. Nothing is workspace-wide until you attach it to the workspace.
If something goes wrong — the workspace already belongs to another organisation, or you are not an admin of it — the screen says which, in those words, rather than failing silently.
Dan9:12 AM
/invite @attest_tag
attest_tagApp9:12 AM
Added to #incidents. I can read this channel and answer when someone mentions me.
Nothing else is connected yet — an admin decides what I may reach here.
Dan9:13 AM
@attest_tag what changed in the deploy that started this page?
attest_tagApp9:13 AM
reading #incidents…
Your data
Where things go, in plain words.
The long versions are linked below, and they say the same thing at greater length.
Slack content
Read when a question needs it, from channels the app was invited to. Answers and the record of the run are stored in the deployment’s own database — not exported, not sold, never used to train a model.
The model call
The one thing that necessarily leaves: the prompt goes to the endpoint you chose — OpenRouter, a vendor API, or your own host. You pick the model, and the bill per answer is shown under it.
Credentials
Sealed at rest and injected by a proxy at the network edge. Tokens for the services you connect are never placed in a prompt and never reach the model.
Removing it
Remove the app from your Slack workspace and its access ends at once. Ask us to delete the organisation’s data and it goes — there is no import to unwind and nowhere else your team was sent.
Microsoft Teams
The same teammate, in Microsoft Teams.
One console for both, with the same connections, approvals, budgets and routines. What changes is how it arrives: a Teams admin uploads the app once, and a code sent from inside Teams says which account it belongs to. About ten minutes.
Get the app file from the console.
Sign up or sign in, open Workspaces → Add workspace → Microsoft Teams, and press Download the Teams app — on a new account, the first step of the setup screen offers the same beside Slack. The file is a small zip built for this deployment, naming this deployment’s bot, and Teams takes it as it is, so do not unzip it.
A Teams admin uploads it, once.
In the Teams admin centre, Teams apps → Manage apps, press Actions → Upload new app and pick the file. That puts attestTag in your organisation’s own app catalogue, for everyone your app policies allow. It is a custom app rather than a Teams Store listing, which is why an admin uploads it.
It asks for no Microsoft Graph permission and no admin consent, and it stores no credential for your organisation.
Uploading needs the Teams Administrator or Global Administrator role. A brand-new Microsoft 365 organisation spends up to half an hour setting up app management before Upload is available.
Add attestTag where people will talk to it.
In Teams, open Apps, search for attestTag and press Add, which starts a chat with it. For a team’s channels, add it to that team as well, from the team’s Manage team → Apps → Get more apps.
Teams then asks whether the app may read that team’s channel messages. Say yes: without it the bot hears only the messages that mention it. In Teams it is called attestTag, so that is the name people type after the @.
Send it the code.
It answers nobody until it knows which account it belongs to. In the console press Get a code, then Open the chat with attestTag — the code is already typed in, so press Send — or type @attestTag link ABCD-EFGH in a channel. A code works once, for thirty minutes, and the bot answers Connected.
Your organisation then sits in the console beside any Slack workspace, with the channels of every team the bot is in under it. Bundles, instructions and budgets attach to them as they do in Slack.
What is different in Teams
Teams lets an app do less than Slack does, and every row below follows from that — where it may stream, what it can read back, and which files it can open without a Microsoft Graph permission this app does not ask for.
slack_search, react, list_pins, list_channels, get_user. Microsoft offers an app no message search at all. Forwarding email into a channel is Slack only.Ready when your Teams admin is.
The button opens the attest_tag console, where the app file and the code both are — sign in, or create an account. The guide draws every screen of the four steps and needs no sign-in, so it can go straight to whoever administers Teams for you.
Stuck on any of this?
Email [email protected] and a person answers — no account, no ticket portal, and a reply within one business day.
One channel is enough to find out.
Install it, invite it somewhere real, and ask it something the channel already knows the answer to.
attest_tag is not affiliated with, endorsed by, or sponsored by Slack Technologies, LLC or Microsoft Corporation.