vibralabs/atrium

By vibralabs

Updated 2 months ago

Open source client portal for agencies and freelancers. Manage projects, documents, upload invoices

Image
Integration & delivery
0

5.1K

vibralabs/atrium repository overview

Atrium

A self-hosted client portal for agencies and freelancers.

GitHub

What is Atrium?

Atrium replaces shared drives, spreadsheets, and scattered emails with a single branded portal your clients can log into. You own the data and host it yourself.

Features

  • Project management — Customizable status pipeline per organization
  • File sharing — Upload and deliver files via S3, MinIO, Cloudflare R2, or local storage
  • White-label branding — Custom colors and logo applied to the client portal
  • Role-based access — Owner/admin roles for your team, member role for clients
  • Email notifications — Transactional email via Resend
  • Built-in database — PostgreSQL included, no separate container needed

Quick Start

The only required variable is BETTER_AUTH_SECRET:

docker run -d \
  --name atrium \
  -p 8080:8080 \
  -v atrium-db:/var/lib/postgresql/data \
  -v atrium-uploads:/app/uploads \
  -e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
  vibralabs/atrium:latest

Open http://localhost:8080 and create your account.

Docker Compose

services:
  atrium:
    image: vibralabs/atrium:latest
    ports:
      - "8080:8080"
    environment:
      BETTER_AUTH_SECRET: "change-me-to-a-random-string-at-least-32-chars"
    volumes:
      - atrium-db:/var/lib/postgresql/data
      - atrium-uploads:/app/uploads
    restart: unless-stopped

volumes:
  atrium-db:
  atrium-uploads:

Using an External Database

Disable the built-in PostgreSQL and provide your own connection string:

environment:
  USE_BUILT_IN_DB: "false"
  DATABASE_URL: "postgresql://user:password@your-db-host:5432/atrium"
  BETTER_AUTH_SECRET: "your-secret-here"

Environment Variables

VariableRequiredDefaultDescription
BETTER_AUTH_SECRETYesRandom string (min 32 chars) for signing auth tokens
USE_BUILT_IN_DBNotrueSet to false to use an external database
DATABASE_URLNoautoPostgreSQL connection string (required when built-in DB is disabled)
STORAGE_PROVIDERNolocalFile storage: local, s3, minio, or r2
S3_ENDPOINTNoS3-compatible endpoint URL
S3_REGIONNous-east-1S3 region
S3_BUCKETNoatriumS3 bucket name
S3_ACCESS_KEYNoS3 access key
S3_SECRET_KEYNoS3 secret key
RESEND_API_KEYNoResend API key for email
EMAIL_FROMNo[email protected]Sender address
MAX_FILE_SIZE_MBNo50Max upload size in MB
SKIP_DB_PUSHNofalseSkip schema sync on startup

Volumes

PathPurpose
/var/lib/postgresql/dataBuilt-in PostgreSQL data
/app/uploadsUploaded files (when using local storage)

Tag summary

Content type

Image

Digest

sha256:d4f238d88

Size

919 MB

Last updated

2 months ago

docker pull vibralabs/atrium