Enterprise Digital Asset Management system with multi-tenant architecture, approval workflows, digital fingerprints, semantic tagging and analytics.
| Layer | Technology |
|---|---|
| Frontend | Next.js 16, React 19, TailwindCSS, shadcn/ui |
| Backend | NestJS, TypeScript |
| Database | MongoDB 6.0 (Mongoose ODM) |
| Object Storage | MinIO (S3-compatible) |
| Queue | Redis + BullMQ |
| Auth | Clerk (JWT-based) |
| Reverse Proxy | Nginx |
(Upload, Version, and Manage)
- Upload assets to MinIO/S3 compatible object storage
- Built-in asset lifecycle management
- Scalable and high-performance
(Version History Tracking)
- Automatically tracks all asset versions
- Prevents accidental data loss
- Access detailed version history and timeline
(FSM-based Approval)
- Controlled multi-state lifecycle
- In Review, Approved, Published stages
- Configurable review and approval rules
(Time-limited, JWT-signed Links)
- Generate secure JWT-signed links
- Set specific link expiration times
- Control access duration and secure external collaboration
(Asset & User Insights)
- Track asset creation, downloads, and approvals
- Visualize content performance and user engagement
- Gain insights to optimize workflow bottlenecks
(Complete Immutable Audit Trail)
- Log every user action and asset state change
- Create a complete, tamper-proof record
- Maintain full compliance documentation and security logs
(WebSocket Notifications)
- Instant notifications for approval state changes
- Real-time updates across user teams
- Keep all stakeholders synchronized and projects moving
(Origin Verification & Provenance)
- Embed digital fingerprints directly into the asset's binary data
- Verify whether scattered or disconnected assets originally belong to the DAM
- Provide a reliable mechanism for the platform to authenticate asset origin post-distribution
- Node.js 20+
- Docker & Docker Compose
- kubectl (for Kubernetes)
- Docker Desktop or Minikube (for local K8s)
Copy .env.example to .env and configure:
cp .env.example .envYou will need to add the following environment variables to your .env (or .env.local) file.
# -----------------------------------------------------------------------------
# Authentication (Clerk)
# -----------------------------------------------------------------------------
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
CLERK_PUBLISHABLE_KEY=
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard
# -----------------------------------------------------------------------------
# App & API Configuration
# -----------------------------------------------------------------------------
NEXT_PUBLIC_API_URL=http://localhost:3000/api/v1
BACKEND_HOST=127.0.0.1:3000
# -----------------------------------------------------------------------------
# Databases (MongoDB & Redis)
# -----------------------------------------------------------------------------
MONGO_URI=mongodb://root:rootpassword@kevlar-mongo:27017/kevlar?authSource=admin
REDIS_HOST=kevlar-redis
REDIS_PORT=6379
# -----------------------------------------------------------------------------
# Object Storage (MinIO)
# -----------------------------------------------------------------------------
MINIO_ENDPOINT=kevlar-minio
MINIO_PORT=9000
MINIO_EXTERNAL_ENDPOINT=localhost
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=adminpassword
MINIO_DEFAULT_BUCKET=kevlar-storage
MINIO_USE_SSL=false
# -----------------------------------------------------------------------------
# Security & DRM
# -----------------------------------------------------------------------------
DRM_SECRET_KEY=super_secure_unpredictable_drm_key_2026
| Service | Description |
|---|---|
| Clerk | Obtain your Publishable and Secret keys from your Clerk Dashboard. |
| MinIO & Mongo | Default credentials (admin/adminpassword & root/rootpassword) are pre-configured for local Docker setups. Change these before deploying to production. |
| DRM | Ensure DRM_SECRET_KEY is replaced with a strong, securely generated string in production environments. |
# Build and start all containers
docker-compose up -d --build
# View running containers
docker-compose ps| Service | URL | Credentials |
|---|---|---|
| Frontend (dev) | http://localhost:3001 | — |
| Backend API | http://localhost:3000 | — |
| MinIO Console | http://localhost:9001 | admin / adminpassword |
| MinIO S3 | localhost:9000 | admin / adminpassword |
docker-compose down
# Remove volumes (data)
docker-compose down -vdocker-compose up -d --build backendThe /k8s directory contains Kubernetes manifests for deployment.
- Kubernetes cluster (local via Minikube/kind or cloud)
- kubectl configured
# Apply manifests in order
kubectl apply -f k8s/secrets.yaml
kubectl apply -f k8s/mongodb-deployment.yaml
kubectl apply -f k8s/redis-deployment.yaml
kubectl apply -f k8s/minio-deployment.yaml
kubectl apply -f k8s/minio-setup-deployment.yaml
kubectl apply -f k8s/nginx-deployment.yaml
kubectl apply -f k8s/backend-deployment.yaml
# Or apply all
kubectl apply -f k8s/| Method | Endpoint | Description |
|---|---|---|
| POST | /assets/upload/init |
Get presigned upload URL |
| POST | /assets/upload/complete |
Create asset record |
| GET | /assets |
List assets |
| GET | /assets/:id |
Get asset detail |
| POST | /assets/:id/submit |
Submit for review |
| POST | /assets/:id/approve |
Approve asset |
| POST | /delivery/share |
Generate share link |
| GET | /delivery/resolve/:token |
Resolve share link |
| GET | /analytics/overview |
Dashboard stats |
| GET | /audit |
Audit logs |








