Slack directory¶
A read-only view of the Aruna Slack workspace inside HRIS: who is in it, and what channels the HRIS bot can see.
It does nothing yet. Nothing posts to Slack, nothing notifies anyone, and nothing links a Slack account to an HRIS employee. This is the piece everything later needs first — you cannot message a person or a channel without knowing it exists — and it is deliberately the whole of it for now.
Who this is for: whoever holds the System Info module. The directory is behind that gate, the same as every other integration.
1. The card¶
System Info → Integrations, below Google Calendar. It says one of three things, and the difference matters:
| What it says | What that means | What to do |
|---|---|---|
| Not configured | No bot token on this environment | Set SLACK_BOT_TOKEN. Nothing else is needed |
| Not connected | There is a token and Slack refused it | The card shows Slack's own words — usually a revoked token or a missing scope |
| Connected | Working | It names the workspace and the bot, and counts what it can see |
Connected, it shows what HRIS is talking to — the app ID, the bot, the workspace ID and the bot user ID, all copyable — then three numbers: people, public channels and private channels.
Granted scopes¶
The card lists the scopes the token actually carries, read from Slack's own response rather than from what anybody intended to grant. Anything this app needs and the token lacks is called out underneath.
This is worth reading before anything else when a list looks wrong. "Every email is blank" and "no private channels" both have the same first question — does the token have the scope? — and this answers it without a trip to the Slack app settings.
If no scopes are listed at all, Slack didn't report them on that response. That is not the same as the token having none, and nothing is wrong.
Private is a count of how far the bot has been let in
Public channels are listed whether or not the bot has joined them. A private channel appears only once the bot has been invited to it — being granted the scope is not enough. So the private count says how many private channels HRIS has been let into, not how many the workspace has.
2. The directory¶
Directory on the card opens the full lists, as two tabs: People and Channels. The open tab is in the address, so a link to one opens on it.
Each tab filters, sorts and pages on the server — the table only ever holds one page, and the count beside the pager is the filtered total, not the number of rows you can see.
People¶
Opens on active people. A deactivated account is almost always noise when you are looking somebody up, so it is filtered out by default rather than sorted to the bottom — the filter above the table says Active only, which is why the count there is smaller than the one on the tab.
| Filter | Options |
|---|---|
| Search | Name, handle, email or title |
| Status | Active only (default), Deactivated only, All statuses |
| Type | All account types (default), People only, Bots only |
Sort by clicking Name, Handle, Email or Title. Clicking the active column reverses it. A blank email or title sorts to the bottom either way — a blank is an absence rather than a value, and it would otherwise fill the first page.
Click a person for their full record: their user ID, email, display name, title, phone, timezone and workspace ID. The user ID is first and has a copy button, because it is what every Slack API call about a person takes, it appears nowhere in Slack's own interface, and it is almost certainly what you opened the panel to get.
If everybody's email is blank, the token is missing the
users:read.email scope — check the granted scopes on the card.
Channels¶
Public and private in one table, with a Visibility column and a filter to separate them.
| Filter | Options |
|---|---|
| Search | Name, topic or purpose |
| Visibility | Public and private (default), Public only, Private only |
| Archived | Active only (default), Active and archived, Archived only |
| Bot membership | Any membership (default), Bot is a member, Bot is not a member |
Sort by Channel, Members or Created. A Bot member column answers yes or no for every row.
An empty Private filter is not a fact about the workspace
A private channel is in this list because the bot was invited to it. Filtering to Private only and seeing nothing means the bot has been invited nowhere — not that the workspace has no private channels. The page says so when that happens.
Bot member is No for most public channels, and that is normal — no membership is needed to list one. It matters only later: posting to a channel or reading its history will require an invitation first.
Click a channel for its channel ID — copyable, for the same reason — plus its member count, when it was created, who created it, and its topic and purpose.
Refresh¶
Refresh re-reads the workspace from Slack. The lists are cached for a couple of minutes, so this is what to press after inviting the bot somewhere or adding someone, rather than waiting.
Filtering, sorting and paging do not re-read Slack — they work over what was already fetched, so they are instant and cost nothing.
3. Setting it up¶
One environment variable: SLACK_BOT_TOKEN, a bot token (xoxb-) for a Slack
app installed on the Aruna workspace.
Scopes the token needs:
| Scope | For |
|---|---|
users:read |
The people list |
users:read.email |
Their email addresses |
channels:read |
Public channels |
groups:read |
Private channels the bot is in |
It is a bot token, not a user token, deliberately. A user token acts as whoever authorised it and stops working when that person leaves or is deactivated — which for an unattended integration surfaces months later as pages quietly going empty.
To see a private channel, invite the bot to it — /invite @hris in the
channel. The scope alone does not grant it; neither does being a workspace
admin.
Troubleshooting¶
| Problem | What to do |
|---|---|
| Card says Not configured | No SLACK_BOT_TOKEN on this environment. That is expected anywhere it has not been set — it is not an error |
| Card says Not connected with a scope error | The token is missing a scope. The message names which one; add it in the Slack app's settings and reinstall the app |
Card says Not connected with invalid_auth |
The token was revoked or regenerated. Get the current one from the Slack app's settings |
| Every email is blank | The token lacks users:read.email. Slack treats the address as its own scope — check the granted scopes on the card |
| The card lists no granted scopes | Slack didn't report them on that response. Nothing is wrong, and it does not mean the token has none |
| A private channel is missing | The bot has not been invited. /invite @hris in that channel — the scope alone is not enough |
| Bot member says No on a public channel | Expected, and fine for listing. It only matters for posting or reading history later |
| Someone who left is still listed | Switch Status back to Active only — it is the default, so it has probably been changed |
| Somebody is missing from People | The default filter hides deactivated accounts. Set Status to All statuses |
| The tab count and the table count disagree | Expected. The tab counts the whole workspace; the table counts what your filter left |
| The lists look stale | Press Refresh — it re-reads from Slack rather than the cache |