Shared event albums for guest uploads, host moderation, and original-quality galleries.
  • TypeScript 98.5%
  • CSS 1.2%
  • Dockerfile 0.3%
Find a file
2026-10-01 14:59:57 -04:00
apps Recover interrupted uploads and clarify unfinished photo states 2026-10-01 14:59:57 -04:00
branding Rebrand product as Manyangles and add Authentik 2026-09-08 09:17:25 -04:00
docker Prepare production and Coolify deployment with original exports and datetime pickers 2026-09-09 17:59:20 -04:00
docs Harden bulk retries, parallelize guest uploads, and move guest map below gallery 2026-09-11 18:54:46 -04:00
packages Harden bulk retries, parallelize guest uploads, and move guest map below gallery 2026-09-11 18:54:46 -04:00
scripts Migrate Manyangles object storage to DigitalOcean Spaces 2026-09-11 17:41:11 -04:00
.dockerignore Prepare production and Coolify deployment with original exports and datetime pickers 2026-09-09 17:59:20 -04:00
.env.example Refine workspaces and event publishing; harden uploads and email delivery 2026-09-09 15:44:00 -04:00
.env.production.example Prepare production and Coolify deployment with original exports and datetime pickers 2026-09-09 17:59:20 -04:00
.gitignore Prepare production and Coolify deployment with original exports and datetime pickers 2026-09-09 17:59:20 -04:00
AGENTS.md Rebrand product as Manyangles and add Authentik 2026-09-08 09:17:25 -04:00
bun.lock Add permission-scoped MCP, readiness checks, and management UI improvements 2026-09-11 18:12:48 -04:00
bunfig.toml Initial commit of Vellum, an event photo product for guest uploads, host moderation, and original-quality galleries. 2026-09-07 19:36:14 -04:00
compose.coolify.yml Add permission-scoped MCP, readiness checks, and management UI improvements 2026-09-11 18:12:48 -04:00
compose.production.yml Add permission-scoped MCP, readiness checks, and management UI improvements 2026-09-11 18:12:48 -04:00
docker-compose.yml Initial commit of Vellum, an event photo product for guest uploads, host moderation, and original-quality galleries. 2026-09-07 19:36:14 -04:00
Dockerfile Reduce shared-server build concurrency and memory pressure 2026-09-10 12:18:41 -04:00
package.json Prepare production and Coolify deployment with original exports and datetime pickers 2026-09-09 17:59:20 -04:00
README.md Add printable guest sign studio and refine event imagery 2026-09-10 09:26:49 -04:00
tsconfig.base.json Initial commit of Vellum, an event photo product for guest uploads, host moderation, and original-quality galleries. 2026-09-07 19:36:14 -04:00
turbo.json Rebrand product as Manyangles and add Authentik 2026-09-08 09:17:25 -04:00

Manyangles

Event photo collection for a wedding day — and for any gathering that needs the same guest-upload, host-moderate, public-gallery loop.

Guests open a shareable event link, optionally add a name, email, and note, and upload photos. Event people approve what appears in the gallery. Originals stay full quality in S3-compatible object storage.

Image processing

Uploads go directly to object storage; the background worker creates WebP derivatives with Sharp. Displays fit within 2048 × 2048 (quality 82), thumbnails within 400 × 400 (quality 75), and cropped 8:3 banners within 2400 × 900 (quality 82). Encoding uses effort 4. Small images are not enlarged. Display copies are auto-oriented and omit source metadata; original uploads and exports retain their original bytes.

Existing JPEG derivatives remain supported through their saved database keys. Only newly processed images use .webp keys and image/webp; this change does not bulk-regenerate existing images or delete their JPEGs.

Repository

apps/
  web/       Public site, guest pages, dashboard, platform admin
  worker/    image variants, EXIF/GPS strip, HEIC conversion
packages/
  contracts/ shared Zod payloads
  database/  Drizzle schema, migrations, seed
  storage/  S3/Garage client, object keys, presign
  email/     Mailpit (dev) / Resend (prod) for auth and guest mail

Quick start

Requirements: Bun 1.4+ and Docker.

cp .env.example .env
bun install
bun run docker:up
bun run db:migrate
bun run auth:seed
bun run db:seed
bun run dev

The app runs at http://localhost:3000. Garage S3 is at http://localhost:3900. Mailpit is at http://localhost:8027.

  • Public: / (listed events) and /e/demo
  • Dashboard: /dashboard
  • Platform: /admin

Example accounts (password host, admin password admin):

  • admin@example.com — platform super-admin
  • host@example.com / partner@example.com — event owners
  • manager@example.com — event manager

Authentik sign-in

Production Docker/Compose setup and original-quality exports are documented in the deployment guide.

Manyangles can use an Authentik OAuth2/OpenID Connect provider alongside email and password authentication. In Authentik, create a confidential OAuth2/OpenID provider and application with the openid, profile, and email scopes.

Add a strict redirect URI for each Manyangles deployment:

https://photos.example.com/api/auth/oauth2/callback/authentik

For local development, use http://localhost:3000/api/auth/oauth2/callback/authentik.

Set all three variables to enable the Authentik button:

AUTHENTIK_ISSUER=https://auth.example.com/application/o/manyangles/
AUTHENTIK_CLIENT_ID=your-client-id
AUTHENTIK_CLIENT_SECRET=your-client-secret

AUTHENTIK_ISSUER is the application issuer URL, not the Authentik root URL. Manyangles discovers the authorization, token, user-info, and signing-key endpoints from <issuer>/.well-known/openid-configuration. If none of these variables are set, Authentik support stays disabled. A partial configuration fails at startup instead of silently hiding a broken provider.