SQLite has no Prisma enums, so removing the enum blocks also dropped the enum
*objects* the app imports from @prisma/client (LinkType.DOCUMENT_LINK, etc.),
crashing Next.js prerender ("Cannot read properties of undefined"). A
build-time step (after `prisma generate`) re-injects the 18 enum objects into
the generated client, so no app files change. Verified: local `next build`
now prerenders all 90 pages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drops the shared sql-0 postgres dependency in favor of an embedded SQLite
file (DATABASE_URL=file:/data/<db>), WAL-replicated to SeaweedFS by the
operator persistence sidecar — same pattern as esign (Documenso).
Schema changes for the sqlite connector:
- datasource provider postgresql -> sqlite; drop directUrl/shadowDatabaseUrl
- 18 enums -> String (values preserved as string defaults)
- scalar-list fields (String[]/Int[]) -> Json @default("[]") (arrays
round-trip through Prisma Json at runtime; next.config ignoreBuildErrors
keeps the type-only churn out of the build)
- strip pg-native @db.* attributes (@db.Text/@db.Timestamp)
- startup: prisma migrate deploy -> prisma db push (pg migration history is
postgres-specific; db push reconciles the sqlite schema idempotently)
CI: amd64-only (DOKS has no arm64); deploy:false — rollout is operator-managed
via the universe Service CR, never `kubectl set image`.
Verified: `prisma validate` + `prisma db push` materialize all 62 tables on a
fresh sqlite file. Source DB is empty (0 app rows), so cutover is data-safe.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Change redirect status from 301 to 302 (non-permanent, user-configurable)
- Remove backfill UPDATE entries from migration SQL
- Remove unnecessary sync-redirects cron endpoint
- Add URL validation: SSRF protection, edge config keyword blocklist,
protocol check, URL sanitization via shared validateRedirectUrl helper
- Add plan gating: require Business plan or higher for redirect URLs
(enforced on both API endpoints and UI)
- Clean up Redis redirect URLs on team deletion
- Clear redirect URLs (Postgres + Redis) on subscription cancellation
and on plan downgrade below Business
- Split redis.ts to avoid Prisma import in edge middleware context
- Gate DomainCard redirect UI based on plan (show upgrade prompt)
Co-authored-by: Marc Seitz <mfts@users.noreply.github.com>
- Add redirectUrl field to Domain model in Prisma schema
- Create migration for the new field
- Add Redis helper for domain redirect URL caching
- Update middleware to check Redis for redirect URL instead of hardcoded values
- Update domain API: GET includes redirectUrl, POST accepts redirectUrl, PUT updates redirectUrl
- Sync Redis on domain create, update, and delete
Co-authored-by: Marc Seitz <mfts@users.noreply.github.com>
Add team-level visitor groups that allow users to define named groups
of emails/domains once, then apply them to document and data room links.
New models:
- VisitorGroup: team-scoped named group with emails/domains list
- LinkVisitorGroup: many-to-many join table between Link and VisitorGroup
Co-authored-by: Marc Seitz <mfts@users.noreply.github.com>
- Rewrite lib/jackson.ts to match Dub's pattern: named export,
globalThis singleton, clientSecretVerifier, same DB connection
- Add jackson.prisma schema with jackson_index, jackson_store,
jackson_ttl tables (shared database, separate tables)
- Update migration to create Jackson tables alongside Team fields
- Rename connectionController → apiController across all consumers
- Switch all imports from default to named: { jackson }
- Remove unnecessary env vars (JACKSON_EXTERNAL_URL, SAML_PATH,
JACKSON_ENCRYPTION_KEY) — Jackson uses NEXTAUTH_URL and
NEXTAUTH_SECRET directly
Co-authored-by: Marc Seitz <mfts@users.noreply.github.com>
- Add icon and color columns to Folder and DataroomFolder models
- Create Prisma migration for new columns
- Add folder icon list (27 icons) and color palette (8 colors) constants
- Update API endpoints to validate and persist icon/color fields
- Create FolderIconPicker and FolderColorPicker UI components
- Update EditFolderModal with icon/color selection and live preview
- Update FolderCard components to display custom icons/colors
- Support both regular folders and dataroom folders
Closes PM-466
Co-authored-by: marcftone <marcftone@gmail.com>
This feature allows users to hide folders and documents from the All Documents
view without deleting them:
- Add hiddenInAllDocuments field to Document and Folder models
- Create API endpoints for hiding documents (/documents/hide) and folders
(/folders/hide)
- Update documents and folders APIs to exclude hidden items from All Documents
view
- Add "Hide from All Documents" action to document and folder dropdown menus
- Add bulk hide action to multi-select action panel
- Cascade hiding: when a folder is hidden, all subfolders and documents within
are also hidden
This is a non-destructive feature that only affects visibility in the All
Documents section. Hidden items remain accessible via Data Rooms and are not
deleted.
Resolves PM-465
This feature allows users to set a private, internal name for Data Rooms
that is only visible to the owner. This helps distinguish between multiple
data rooms that share the same public-facing name.
Changes:
- Add internalName field to Dataroom schema
- Create database migration for the new field
- Update API endpoints to support creating/updating internal names
- Search now includes internal names
- Update add-dataroom-modal with internal name input
- Display internal name in dataroom cards and headers
- Add internal name form in settings page