Provider configuration
Configure application origins, optional email and provider OAuth deployment profiles.
Postdot does not impose one global DNS or HTTPS requirement. The requirement is defined by the provider flow being used. The application can remain a simple single-process self-hosted deployment while a particular provider may require a public callback or a public client document.
Common Postdot requirements
- Keep the database,
BETTER_AUTH_SECRET, media signing secret, and publisher encryption key in the deployment environment. - Keep provider application settings and connected account credentials separate. Provider applications are instance-level; connected accounts and channels remain project-owned.
- In production, use a stable canonical origin for the API and dashboard and serve the authenticated application over HTTPS.
- Do not expose client secrets, access tokens, refresh tokens, or provider sessions in the browser, logs, or provider metadata documents.
These requirements do not mean that every provider needs a public HTTPS endpoint. They only become mandatory when the provider's authorization model requires a public web client or callback.
Optional account email delivery
Postdot can deliver project invitations, signup verification, and password-reset
messages through an operator-supplied SMTP relay. Configure
POSTBOT_EMAIL_SMTP_HOST and POSTBOT_EMAIL_FROM in the API environment; port 587
is the default, POSTBOT_EMAIL_SMTP_SECURE selects TLS mode, and username/password
are optional but must be supplied together. Keep credentials in the deployment
secret store or ignored environment file.
SMTP is not required for the local profile: without it, project invitations remain
copyable one-use links. Enable
POSTBOT_REQUIRE_EMAIL_VERIFICATION_ON_INVITATION=true only alongside a working
mail transport. SMTP submission is asynchronous and best-effort; delivery
guarantees, retries, bounces, and provider webhooks are outside this boundary.
For local development, docker-compose.dev.yml starts a Mailpit relay on
127.0.0.1:1025 and its inspection UI on 127.0.0.1:8025. The React Email
templates are owned by the @postdot/email workspace package; the API owns only
the SMTP transport and deployment configuration.
Bluesky / AT Protocol
Postdot supports two OAuth deployment profiles:
Local loopback development
Select Local loopback when the Postdot API and browser run on the same
machine. This uses the AT Protocol's official native loopback client ID
(http://localhost) and a callback on a loopback IP. No tunnel, DNS record,
public metadata URL, or Bluesky developer application is required.
Use the same loopback literal for the API, Vite proxy, and dashboard. The recommended setup is:
# apps/api/.env
BETTER_AUTH_URL=http://127.0.0.1:3000
POSTBOT_WEB_ORIGIN=http://127.0.0.1:5173
# apps/web/.env
POSTBOT_API_ORIGIN=http://127.0.0.1:3000Open the dashboard at http://127.0.0.1:5173, not http://localhost:5173.
This consistency is required because the Postdot session cookie is host-bound.
The same arrangement can use [::1] consistently instead of 127.0.0.1.
The Client metadata URL field must be left empty in this mode. A 404 from
/oauth/bluesky/client-metadata.json is expected: loopback clients do not
publish a web metadata document.
Public HTTPS deployment
Select Public HTTPS when the dashboard is deployed for remote access. Enter a stable HTTPS URL for the client metadata document, and make the API callback reachable at the public HTTPS origin registered with the AT Protocol authorization server. The metadata URL must remain fetchable at that exact URL, and its redirect URI must match the deployed callback exactly.
This mode requires a public DNS name and HTTPS for the web OAuth boundary. It does not require a separate proxy service: the Postdot API serves the metadata route itself. A reverse proxy or tunnel is only one way to make that API origin reachable; it is not a Postdot runtime dependency.
Analytics through Bluesky's public API does not require OAuth or either of these web deployment profiles. Only account authorization and authenticated publishing do.
Other providers
Provider setup remains provider-specific:
- LinkedIn and X use provider applications with client identifiers and secrets, plus the exact callback URLs required by each provider. A production OAuth deployment will normally use HTTPS, while local provider rules must be checked against the provider's current application policy.
- DEV.to uses an API key entered when connecting its project channel and does not use the Bluesky metadata or callback model.
- Providers with per-instance or token-based flows may need only the instance origin or token and do not automatically inherit Bluesky's public HTTPS requirement.
When a new provider is added, its adapter must document its own callback, credential, destination, and reachability requirements. Adding that provider must not silently turn DNS or HTTPS into a global requirement for Postdot.