# Coming from Slack

> What is the same as in Slack, what differs, and what Amedeus does not have yet.

Amedeus apps follow Slack's model on purpose, so what you know carries over. This page lists what is
the same and what is different. Slack details are from its public documentation.

## The same

- **Concepts:** an app has a bot user, permissions (scopes), a bot token, incoming webhooks, slash
  commands, and event subscriptions with a signed request URL.
- **Request signing:** HMAC-SHA256 of `v0:{timestamp}:{raw body}`, compared in constant time, with a
  5-minute window. Only the header names change (`X-Amedeus-Signature`, `X-Amedeus-Request-Timestamp`).
- **URL verification:** a signed `{"type":"url_verification","challenge":…}`, answered with the challenge.
- **Acknowledge fast:** answer `2xx` within 3 seconds and work afterwards.
- **Incoming webhooks:** the same `{"text": …}` body, and Slack's `attachments` are understood.
- **Slash command replies:** a `response_url`, private by default, `in_channel` for everyone.
- **An app acts only where it belongs,** and joins public channels itself.

## Different

| Topic                           | Slack                                                                             | Amedeus                                                                   |
| ------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Errors                          | Usually HTTP 200 with `{"ok": false, "error": "code"}`                            | The real HTTP status, with `{"ok": false, "error": "code", "message": …}` |
| Pagination                      | `cursor` and `response_metadata.next_cursor`                                      | `cursor` and a top-level `next_cursor`                                    |
| Message id                      | `ts`, a timestamp string                                                          | `id`, a UUID. Times are ISO 8601 `created_at`                             |
| Text format                     | `mrkdwn`, with `<@U123>` mentions and `<url\|label>` links                        | Markdown as written; mentions as `@Name` plus a `mentions` list of ids    |
| Event envelope                  | `team_id`, `api_app_id`, `authorizations`, `event_context`                        | `workspace_id`, `app_id`, `bot_user_id`                                   |
| Event names                     | `message.channels`, `message.groups`, `message.im`, `message.mpim`, `app_mention` | `message.channel` (public and private), `message.im`, `app_mention`       |
| Channel type                    | `channel_type`: `channel`, `group`, `im`, `mpim`                                  | `channel_kind`: `public`, `private`, `dm`                                 |
| Author field                    | `user`                                                                            | `user` everywhere                                                         |
| Retry headers                   | `X-Slack-Retry-Num`, `X-Slack-Retry-Reason`                                       | `X-Amedeus-Retry-Num`, `X-Amedeus-Retry-Reason` (same reason values)      |
| Retries                         | 3 retries: immediately, 1 minute, 5 minutes                                       | 4 attempts: immediately, 1, 5 and 30 minutes                              |
| Redirects                       | Followed, up to 2                                                                 | Not followed: give the final URL                                          |
| Slash command body              | `application/x-www-form-urlencoded`                                               | JSON                                                                      |
| Command reply in the `200` body | Yes                                                                               | No: use `response_url` (or the Web API)                                   |
| Direct messages to a bot        | App Home → Messages Tab, and a checkbox to let people write                       | App Home → "Allow people to message this app"                             |
| Installing an app               | Each workspace installs and approves it (OAuth)                                   | An app belongs to the workspace that created it; there is no install step |
| Posting response                | `{ok, channel, ts, message}`                                                      | `{ok, message}`                                                           |

## Not in Amedeus yet

Updating or deleting a message the app wrote, Block Kit, interactive components, app unfurls,
events on behalf of users, OAuth for apps distributed across workspaces, and the optional 24-hour
"Delayed events". Apps that need them can't be built yet.

