---
title: Providers
description: Configure services for captcha, email, uploads, scoring, moderation, and more.
order: 3
---

Providers connect rCTF to services such as email, object storage, captcha, and scoring. You choose an implementation with `<red>name</red>` and configure it through `<red>options</red>`.

## Provider format

All providers follow the same configuration pattern:

```yaml
providerField:
  name: provider-type/provider-name
  options:
    key: value
```

The `<red>name</red>` selects the provider, while `<red>options</red>` contains its settings. Most of those settings can also be supplied through environment variables.

## Available providers

| Type                                 | Config Field                                  | Available Providers                                                                                                                                                                         | Default                         |
| ------------------------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| [Captcha](/providers/captcha)        | `<red>captcha.provider</red>`                 | `<green>captcha/recaptcha</green>`, `<green>captcha/hcaptcha</green>`, `<green>captcha/turnstile</green>`                                                                                   | None (disabled)                 |
| [Email](/providers/emails)           | `<red>email.provider</red>`                   | `<green>emails/smtp</green>`, `<green>emails/ses</green>`, `<green>emails/postmark</green>`, `<green>emails/mailgun</green>`                                                                | None (disabled)                 |
| [Uploads](/providers/uploads)        | `<red>uploadProvider</red>`                   | `<green>uploads/local</green>`, `<green>uploads/s3</green>`, `<green>uploads/gcs</green>`, `<green>uploads/r2</green>`                                                                      | `<green>uploads/local</green>`  |
| [Scoring](/providers/scores)         | `<red>scoreProvider</red>`                    | `<green>scores/classic</green>`, `<green>scores/sekai</green>`, `<green>scores/steep</green>`, `<green>scores/jammy</green>`, `<green>scores/genni</green>`, `<green>scores/legacy</green>` | `<green>scores/classic</green>` |
| [Moderation](/providers/moderation)  | `<red>avatarsModeration.provider</red>`       | `<green>moderation/openai</green>`                                                                                                                                                          | None (disabled)                 |
| [Messages](/integrations/bloodbot)\* | `<red>bloodBot.destinations[].provider</red>` | `<green>messages/discord</green>`, `<green>messages/telegram</green>`                                                                                                                       | None (disabled)                 |
| [Analytics](/providers/analytics)    | `<red>analytics.provider</red>`               | `<green>analytics/google</green>`, `<green>analytics/cloudflare</green>`                                                                                                                    | None (disabled)                 |
| [Instancer](/integrations/instancer) | `<red>instancers</red>`                       | `<green>instancers/docker</green>`, `<green>instancers/k8s</green>`                                                                                                                         | None (disabled)                 |
| [Admin Bot](/integrations/admin-bot) | `<red>adminBot.provider</red>`                | `<green>admin-bots/rctf-ts</green>`                                                                                                                                                         | None (disabled)                 |
| [Flags](/providers/flags)\*\*        | `<red>flags[].provider</red>`                 | `<green>flags/static</green>`, `<green>flags/regex</green>`, `<green>flags/dynamic</green>`                                                                                                 | `<green>flags/static</green>`   |

Providers marked "None (disabled)" are optional. Their features remain unavailable until a provider is configured.

\* Unlike the other providers, message providers are not selected by a top-level config field. They are nested inside each [blood bot](/integrations/bloodbot) destination entry, so the same deployment can post to multiple destinations using different providers.

\*\* Flag providers are not part of the server configuration at all. Each [flag entry](/admin/challenges#flags) of a challenge picks its own provider, and all flag providers are always available.
