Privacy & Security
How Alphorn handles your data and keeps your notifications secure.
Data handling
What Alphorn stores
- Notification payloads — title, message, priority, tags, and custom payload data
- Delivery logs — timestamps, status codes, and error messages for each delivery attempt
- Channel configuration — webhook URLs, API keys, and credentials for your notification channels
- Account data — email address, organization memberships, and authentication details
What Alphorn doesn't do
- Alphorn does not sell or share your data with third parties
- Alphorn does not use your notification content for training, analytics, or advertising
- Alphorn does not track you across websites or services
Self-hosted: you control everything
When you self-host Alphorn, all data stays in your PostgreSQL database on your infrastructure. Nothing is sent to Alphorn's servers. You have full control over data retention, backups, and access.
Encryption
In transit
All communication with the hosted service at app.alphorn.dev uses TLS (HTTPS).
For self-hosted instances, configure TLS through your reverse proxy (Nginx, Caddy, Traefik). Caddy enables HTTPS automatically. For Nginx:
server {
listen 443 ssl;
server_name alphorn.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
}
}At rest
Database encryption depends on your PostgreSQL configuration and hosting provider. Most managed PostgreSQL providers (AWS RDS, Supabase, Neon, etc.) encrypt data at rest by default. For self-managed PostgreSQL, configure disk encryption at the OS level.
Webhook security
Webhook URL tokens
Each webhook URL contains a unique, randomly generated ID (e.g., wh_abc123). These IDs are unguessable — they function as bearer tokens. Anyone with the URL can send notifications to that webhook.
Treat webhook URLs like API keys:
- Don't commit them to public repositories
- Don't log them in plain text
- Use environment variables or secrets management in CI/CD
- Rotate webhooks if you suspect a URL has been exposed
IP restrictions
For self-hosted instances, you can restrict webhook access at the network level using your reverse proxy or firewall to only accept requests from known source IPs.
Authentication security
Passwords
Alphorn uses Better Auth for authentication. Passwords are hashed using bcrypt before storage.
Two-factor authentication
Alphorn supports TOTP-based 2FA. Organization owners can enforce 2FA for all members. See Authentication for setup instructions.
SSO
Alphorn supports GitHub, Google, Microsoft, and any OIDC-compliant identity provider. SSO tokens are managed by Better Auth and stored server-side. See Authentication for details.
Session management
Sessions are server-side and signed with BETTER_AUTH_SECRET. Use a strong, random secret — generate one with:
openssl rand -base64 32Channel credentials
Channel configuration (Slack webhook URLs, API keys, SMTP passwords, etc.) is stored in PostgreSQL. For self-hosted instances, secure your database access:
- Use strong PostgreSQL passwords
- Restrict database access to the Alphorn application only
- Use SSL connections to PostgreSQL in production
- Back up your database with encryption
Organizational isolation
Each organization is fully isolated:
- Webhooks, channels, and filtering rules are scoped to the organization
- Members can only access their own organizations
- Role-based access control limits who can manage configuration vs. view logs
Responsible disclosure
If you find a security vulnerability in Alphorn, please report it privately through GitHub Security Advisories rather than opening a public issue.