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

# Configuration

> Environment variables that matter when setting up Orbit

Orbit is configured through the same set of Laravel environment variables regardless of how you run it. For the native setup and Docker without Doppler, that means a standard `.env` file. If you're on the Docker path and this directory is linked to a [Doppler](https://www.doppler.com/) project, Doppler injects these same variables directly instead of a `.env` file — see [Docker](/deployment/docker#where-configuration-comes-from-doppler-or-env) for that distinction. This page covers the variables you're likely to actually touch — the rest of `.env.example` is framework boilerplate you can leave at its default.

## Application

| Variable    | Notes                                                                                                       |
| ----------- | ----------------------------------------------------------------------------------------------------------- |
| `APP_NAME`  | Defaults to `Laravel` in `.env.example` — rename it to `Orbit` (or your instance's name)                    |
| `APP_ENV`   | `local` for development, `production` for a real deployment                                                 |
| `APP_KEY`   | Generate with `php artisan key:generate` — never share this or commit it                                    |
| `APP_DEBUG` | `true` locally; **must** be `false` in production, or error pages leak stack traces and environment details |
| `APP_URL`   | The base URL Orbit is served from                                                                           |

## Database

Orbit defaults to SQLite (`DB_CONNECTION=sqlite`, backed by `database/database.sqlite`) — no other configuration is required for local development. For MySQL or PostgreSQL, switch `DB_CONNECTION` and set the standard `DB_HOST`, `DB_PORT`, `DB_DATABASE`, `DB_USERNAME`, and `DB_PASSWORD` variables.

## Session, cache, and queue

All three default to the `database` driver (`SESSION_DRIVER`, `CACHE_STORE`, `QUEUE_CONNECTION`), which needs no extra infrastructure — just a migrated database. Redis (`REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`) and Memcached (`MEMCACHED_HOST`) variables are present in `.env.example` if you'd rather run one of those instead, but neither is required.

The queue is no longer just framework boilerplate: a worker actually needs to be running (`php artisan queue:work`, or the `queue` Docker service — see [Docker](/deployment/docker#services)) for [email notifications](/concepts/notifications#channels) to be delivered, whichever queue driver you pick.

## File storage

`FILESYSTEM_DISK=local` is used for user avatar uploads. If you want avatars stored on S3 instead, set `FILESYSTEM_DISK=s3` and fill in `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_DEFAULT_REGION`, and `AWS_BUCKET`.

## Mail and broadcasting

`BROADCAST_CONNECTION=log` is a Laravel framework default present in `.env.example` — nothing in the app currently broadcasts over a websocket connection, so it doesn't need to be configured.

`MAIL_MAILER` matters now: [notification emails](/concepts/notifications#channels) are sent through Laravel's standard mail configuration (`MAIL_HOST`, `MAIL_PORT`, `MAIL_USERNAME`, `MAIL_PASSWORD`, `MAIL_FROM_ADDRESS`, `MAIL_FROM_NAME`). `.env.example` defaults `MAIL_MAILER=log`, which writes emails to the log instead of actually sending them — fine for local development, but point it at a real driver (`smtp`, `ses`, and so on) before relying on email delivery anywhere else. Delivery also requires a running [queue worker](/deployment/docker#services) regardless of mailer — emails are always queued, never sent synchronously.

## Avatar moderation (nsfwjs)

Uploaded [avatars](/concepts/account#profile) are screened by a separate nsfwjs HTTP service before they're accepted.

| Variable                 | Notes                                                                                                                                                                                                                                        |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `NSFW_DETECTION_ENABLED` | Defaults to `true`. Set to `false` to skip moderation entirely and accept every valid image upload                                                                                                                                           |
| `NSFW_SERVICE_URL`       | Where the nsfwjs service is reachable. Defaults to `http://localhost:3333` for a native/host setup; Docker Compose overrides this to `http://nsfwjs:3333` automatically, since `localhost` inside the `app` container isn't the host machine |
| `NSFW_THRESHOLD`         | Probability threshold (`0.0`–`1.0`, default `0.70`) above which an image classified as explicit is rejected                                                                                                                                  |

If the nsfwjs service is unreachable when someone uploads an avatar, the upload is rejected rather than allowed through unchecked.

## Frontend

`VITE_APP_NAME="${APP_NAME}"` mirrors `APP_NAME` into the frontend build — update `APP_NAME` and this follows automatically.


## Related topics

- [Docker](/deployment/docker.md)
- [Production deployment](/deployment/production.md)
- [Quickstart](/quickstart.md)
