SnapOtter
3b84fab765
feat: add enterprise licensing and S3 storage backend
...
Add the enterprise package with Ed25519 license key validation and
feature gating. Enterprise code lives in the public repo under a
proprietary license (Cal.com/PostHog model), protected legally, not
by code hiding.
Implement S3-compatible storage backend as the first enterprise
feature. The file-storage module now delegates to either local
filesystem or S3 based on STORAGE_MODE env var. Works with AWS S3,
Cloudflare R2, DigitalOcean Spaces, MinIO, and any S3-compatible
provider. Workspace files remain local (ephemeral processing).
New env vars: STORAGE_MODE, S3_BUCKET, S3_REGION, S3_ENDPOINT,
S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_FORCE_PATH_STYLE,
S3_PREFIX, SNAPOTTER_LICENSE_KEY.
Tested against MinIO: 10 S3 integration tests + 82 existing tests
pass with zero regressions.
2026-06-06 20:17:49 +08:00
..
2026-05-12 23:19:20 +08:00
2026-05-09 18:02:58 +08:00
2026-05-12 23:19:20 +08:00
2026-06-06 19:37:29 +08:00
2026-05-12 23:19:20 +08:00
2026-05-15 21:35:02 +08:00
2026-04-24 23:50:47 +08:00
2026-05-13 15:47:28 +08:00
2026-04-29 23:47:19 +08:00
2026-06-06 19:37:29 +08:00
2026-04-22 18:10:04 +08:00
2026-05-07 19:41:30 +08:00
2026-05-14 17:42:07 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-06-06 19:37:29 +08:00
2026-05-13 10:05:42 +08:00
2026-06-06 19:37:29 +08:00
2026-05-01 19:51:47 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-01 19:51:47 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-11 17:33:51 +08:00
2026-04-26 12:03:08 +08:00
2026-05-01 19:51:47 +08:00
2026-05-11 21:57:40 +08:00
2026-05-01 19:51:47 +08:00
2026-04-22 18:10:04 +08:00
2026-04-22 18:10:04 +08:00
2026-04-24 18:06:29 +08:00
2026-05-14 16:59:40 +08:00
2026-05-01 19:51:47 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 13:45:08 +08:00
2026-04-22 18:10:04 +08:00
2026-06-06 19:37:29 +08:00
2026-05-12 03:58:42 +08:00
2026-06-06 19:37:29 +08:00
2026-05-15 21:35:02 +08:00
2026-05-18 18:16:07 +08:00
2026-06-06 19:37:29 +08:00
2026-05-18 18:16:07 +08:00
2026-05-18 17:48:21 +08:00
2026-06-06 19:37:29 +08:00
2026-05-09 19:52:11 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-09 18:02:58 +08:00
2026-06-06 19:37:29 +08:00
2026-05-18 17:48:21 +08:00
2026-05-01 19:51:47 +08:00
2026-05-01 19:51:47 +08:00
2026-06-06 19:37:29 +08:00
2026-05-09 18:02:58 +08:00
2026-04-22 18:10:04 +08:00
2026-05-01 19:51:47 +08:00
2026-04-26 12:03:08 +08:00
2026-04-22 18:10:04 +08:00
2026-05-13 10:05:42 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-05-07 19:41:30 +08:00
2026-04-22 18:10:04 +08:00
2026-05-01 19:51:47 +08:00
2026-06-05 23:05:25 +08:00
2026-06-06 19:37:29 +08:00
2026-05-01 19:51:47 +08:00
2026-05-13 16:59:13 +08:00
2026-05-01 19:51:47 +08:00
2026-06-06 20:17:49 +08:00
2026-05-13 21:33:50 +08:00
2026-05-13 21:33:50 +08:00
2026-05-09 09:02:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-09 09:02:29 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-09 09:02:29 +08:00
2026-06-06 19:37:29 +08:00
2026-03-26 01:10:51 +08:00
2026-05-14 10:46:24 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00
2026-05-01 19:51:47 +08:00
2026-05-09 09:02:29 +08:00
2026-05-09 18:02:58 +08:00
2026-06-06 19:37:29 +08:00
2026-06-06 19:37:29 +08:00