> ## Documentation Index
> Fetch the complete documentation index at: https://docs.embedder.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack integration

> Connect your Slack workspace so anyone on your team can start Embedder work by messaging @Embedder

With the Slack integration connected, anyone in your Slack workspace can hand Embedder work by mentioning `@Embedder` in a channel or sending it a direct message. The request runs on your [daemon](/headless/daemon) against one of your organization's linked GitHub repositories, streams progress into the Slack thread, and links the resulting pull request when it pushes changes.

## Before you begin

Make sure you have:

* **Owner or admin access** to your Embedder organization to install the app.
* **The [GitHub integration](/headless/github) set up with mapped repositories.** Slack requests run against the repositories your organization has connected and mapped — without them, Slack work has nowhere to run.
* **A running [daemon](/headless/daemon)** to execute the work.

## Connect the workspace

<Steps>
  <Step title="Add Embedder to Slack">
    In [the dashboard](https://app.embedder.com), select your team in the sidebar, then open **Slack** and select **Add to Slack**. Approve the installation on Slack's consent screen.

    <Check>
      The dashboard confirms with **Slack workspace connected**, and the workspace appears under **Slack workspaces** with a **Connected** badge.
    </Check>

    <Note>
      The connection is **workspace ↔ organization**: everyone in the connected Slack workspace can start work across all of the organization's linked repositories. A Slack workspace can belong to only one Embedder organization, and Enterprise Grid installs are not supported yet.
    </Note>
  </Step>

  <Step title="Invite the bot to a channel">
    In any channel where people should be able to use Embedder:

    ```text theme={"system"}
    /invite @Embedder
    ```

    Direct messages to the bot work without an invite.
  </Step>

  <Step title="Link your Slack identity">
    The first time you send Embedder a request, it asks you to connect your Slack account to your Embedder account and replies with a link. Select **Connect Slack**, then return to Slack and send the request again. This is a one-time step per user.
  </Step>

  <Step title="Make a request">
    Mention the bot and name the repository you want it to work in:

    ```text theme={"system"}
    @Embedder in firmware-nrf9160, add a retry with backoff to the MQTT reconnect logic
    ```

    The thread shows **Working on it** once a daemon claims the request, streams progress while the agent works, and finishes with **Done** and a pull request link if the work pushed changes.

    <Frame caption="A thread request completing with a summary of the changes, verified on the attached hardware">
      <img src="https://mintcdn.com/embedder/_xHO9pAtDOGBmFZI/images/slack-bot-integration.png?fit=max&auto=format&n=_xHO9pAtDOGBmFZI&q=85&s=4f5aa439b932c89d1516c2460ac7d81f" alt="Slack thread where a user asks Embedder for a live temperature plot, the bot picks the session back up, and replies Done with a repository link, a summary of changes, and serial output verified on hardware" width="984" height="1966" data-path="images/slack-bot-integration.png" />
    </Frame>
  </Step>
</Steps>

## How requests are routed to a repository

Embedder picks the target repository from your message:

1. **An explicit name always wins.** Write `owner/repo` or the repository's name anywhere in the request.
2. **A close match works too** — "the sensor-hub repo" matches a linked repository named `sensor-hub`.
3. **If your organization has exactly one linked repository**, it is used by default and you don't need to name it.
4. **If the repository is ambiguous or missing**, the bot asks in the thread and lists the candidates. Reply with the name, and it picks up the request from there.

To work on a specific pull request, reference it in the message — `pr 13` or the PR's URL — and Embedder checks out that PR's branch instead of the default branch.

## Working in a thread

A Slack thread is a **session**: it keeps its repository checkout and conversation state, so you can iterate.

* **Reply in the thread to continue.** After a task completes, a reply picks the same session back up in the same working state — "now also update the changelog" continues where the last run finished.
* **Replies while it's working are folded in.** If you add a message mid-run, the bot acknowledges it and incorporates it into the run in progress.
* **The agent can ask questions.** When it needs input it posts **One question before I continue** and pauses — reply in the thread to resume. While paused, your daemon is free to pick up other work.
* **Not every request needs code.** Questions like "how does the OTA update flow work in firmware-nrf9160?" complete with an answer in the thread and no pull request.
* **Sessions expire.** A session closes after 24 hours of inactivity; send a new root message to start a fresh one.

## If no daemon is online

Slack requests queue until a daemon claims them. If nothing picks the request up within about 45 seconds, the thread shows **Waiting for daemon** with a hint to start one. The request stays queued and runs as soon as a daemon comes online — or expires with the session after 24 hours.

## Troubleshooting

<AccordionGroup>
  <Accordion title="The bot doesn't respond in a channel">
    Invite it with `/invite @Embedder`. If it isn't in the workspace at all, an organization owner or admin needs to connect the workspace from the dashboard's **Slack** page.
  </Accordion>

  <Accordion title="&#x22;… is not a linked repository in this organization&#x22;">
    The repository you named isn't connected, or isn't mapped to a project. Connect and map it on the dashboard's **GitHub** page — see [GitHub integration](/headless/github).
  </Accordion>

  <Accordion title="&#x22;Connect and map a GitHub repository before starting Slack agent work&#x22;">
    Your organization has no linked repositories yet. Set up the [GitHub integration](/headless/github) first.
  </Accordion>

  <Accordion title="It picked the wrong repository">
    Name the repository explicitly as `owner/repo` in your request — an explicit name always takes priority over fuzzy matching.
  </Accordion>

  <Accordion title="&#x22;This Slack workspace is linked elsewhere&#x22;">
    A Slack workspace can belong to only one Embedder organization. Disconnect it from the other organization first.
  </Accordion>

  <Accordion title="&#x22;This session has ended&#x22;">
    The session completed, failed, or expired after 24 hours of inactivity. Send a new root message (not a thread reply) to start a new session.
  </Accordion>
</AccordionGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Run the daemon" icon="server" href="/headless/daemon">
    Start the daemon that executes Slack requests.
  </Card>

  <Card title="GitHub integration" icon="github" href="/headless/github">
    Connect and map the repositories Slack work runs against.
  </Card>
</CardGroup>
