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.

support

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

A mention, the thread it was asked in, and the sources it used. Every answer carries its cost.

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.

01

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.

02

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.

03

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.

04

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.
app_mentions:read
assistant:write
Tells the app it was spoken to, and lets it show what it is doing — “reading #billing…” — while it works. It acts only when addressed.
chat:write
chat:write.customize
How it answers. It posts in reply to a person, or on a schedule an admin configured for a specific channel. The customize scope only changes the name and icon on its own messages, never impersonates a member.
channels:history
groups:history
im:history
mpim:history
Grounding. To answer “what did we decide about this?” it reads the conversation around the request — only in channels, group DMs and DMs it was deliberately added to, and never as a bulk export.
channels:read
groups:read
im:read
Identity, not content. Resolves a channel ID to #billing, confirms it is actually a member before reading, and lists the channels it is in so admins can configure it per channel.
im:write
Some things belong to one person: an approval request, a console invitation, a link to your own settings. It opens a DM so that message lands with them and nobody else.
files:read
files:write
Reads a file shared in the conversation when a question refers to it, and posts long answers, tables and reports back as a file instead of a wall of text. It never modifies or deletes anyone else’s files.
search:read.public
Finds the answer when it lives in another public channel. The search runs on the short-lived token Slack issues for the asker’s own message, so it returns only what that person could find themselves — and when there is no such token, it does not search at all.
pins:read
reactions:write
Pins are what a channel has marked as authoritative, so an answer can prefer them over the most recent chatter. A reaction is how it says “seen, working on it” without adding a message to a busy channel.
users:read
users:read.email
Turns user IDs into people, so answers read “Priya asked for that” rather than 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.

incidents

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…

Step three, in the channel. The setup screen notices the invite within seconds.

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.

01

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.

02

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.

03

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 @.

04

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.

Where it answers
Channel reply chains, group chats and one-to-one chats. With the channel-messages permission from step 03 it follows the whole conversation; without it, only the messages that mention it.
The answer as it is written
In a one-to-one chat, with a progress line saying which tool is running. In a channel or group chat the answer is posted whole when it is done: one-to-one chats are the only place Teams lets an app stream.
Confirm and approvals
The same Confirm card before a write and the same approval requests, as Adaptive Cards. An access request reaches an approver as a chat, when they share a team with the bot or have added the app themselves.
Reading a thread back
Teams gives an app no way to read a conversation back, so the bot keeps its own record of each conversation it is in, in the deployment’s database — which also means its memory of a thread starts on the day it was added.
Files
It reads a file sent to it in a chat, and an image pasted into any message. A file attached in a channel lives in SharePoint, so the model is told its name, not its contents. A long answer stays in the message rather than arriving as a file.
Left out in Teams
Message search, reactions, pins, the channel list and profile lookup — 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.
Who may use it
Your organisation’s email domains, checked against the address Teams gives for each person. Guests, anonymous users and people from other organisations are refused, even in a chat they share with a member.

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.

Support

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.