# pratham-taikar/cloudinary-saas-v2 architecture

> Architecture diagram of the GitHub repository pratham-taikar/cloudinary-saas-v2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pratham-taikar/cloudinary-saas-v2
- Repository: https://github.com/pratham-taikar/cloudinary-saas-v2

## Overview

EasyUploads is a media-processing SaaS for creators: users upload images or videos, use transformation tools, and retrieve optimized media; subscription limits govern usage, while billing upgrades plans and dashboard APIs expose account history. The README documents Cloudinary edge processing and delivery, but most feature-page implementations were not sampled, so transformation-page wiring is shown only where documented. The sampled routes establish upload authorization, plan checks, persistence, and payment verification.

Main entry points: [`app/api/image-upload/route.ts`](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/image-upload/route.ts) (Image upload API), [`app/api/video-upload/signature/route.ts`](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/signature/route.ts) (Video signature API), [`app/api/video-upload/route.ts`](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/route.ts) (Video metadata API), [`app/api/razorpay/verify/route.ts`](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/razorpay/verify/route.ts) (Verify payment API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["User experience"]
  node_home["Landing<br/>[page.tsx]"]
  node_authpages["Sign in / up<br/>[page.tsx]"]
  node_dashboard["Usage dashboard<br/>[page.tsx]"]
end

subgraph group_media["Media workflows"]
  node_imagefeatures["Image tools<br/>[page.tsx]"]
  node_effects["Image effects<br/>[page.tsx]"]
  node_genbg["Generative fill<br/>[page.tsx]"]
  node_social["Social resizing<br/>[page.tsx]"]
  node_videopage["Video upload<br/>[page.tsx]"]
  node_imageapi["Image upload API<br/>[route.ts]"]
  node_signature["Video signature API<br/>[route.ts]"]
  node_videoapi["Video metadata API<br/>[route.ts]"]
end

subgraph group_billing["Plans and billing"]
  node_plans["Plan limits<br/>[services.ts]"]
  node_pricing["Plan selection<br/>[page.tsx]"]
  node_checkout["Checkout page<br/>[page.tsx]"]
  node_orderapi["Create order API<br/>[route.ts]"]
  node_verifyapi["Verify payment API<br/>[route.ts]"]
end

subgraph group_data["Persistence"]
  node_userapi["User profile API<br/>[route.ts]"]
  node_videosapi["Video history API<br/>[route.ts]"]
  node_paymentsapi["Payment history API<br/>[route.ts]"]
  node_subscription["Cycle reset logic<br/>[subscription.ts]"]
  node_dbconn["Database connection<br/>[db.ts]"]
  node_users[("User records<br/>[user.models.ts]")]
  node_videos[("Video records<br/>[video.models.ts]")]
  node_payments[("Payment records<br/>[payment.models.ts]")]
end

node_visitor(("Visitor / user"))
node_cloudinary["Cloudinary"]
node_cdn["Media CDN"]
node_razorpay["Razorpay"]
node_clerk["Clerk identity"]

node_visitor -->|"opens"| node_home
node_visitor -->|"authenticates"| node_authpages
node_visitor -->|"uses tools"| node_imagefeatures
node_visitor -->|"applies filters"| node_effects
node_visitor -->|"prompts fill"| node_genbg
node_visitor -->|"resizes media"| node_social
node_visitor -->|"uploads video"| node_videopage
node_visitor -->|"chooses plan"| node_pricing
node_visitor -->|"views account"| node_dashboard
node_authpages -->|"authenticates"| node_clerk
node_imagefeatures -.->|"transforms media"| node_cloudinary
node_effects -.->|"transforms media"| node_cloudinary
node_genbg -.->|"generates background"| node_cloudinary
node_social -.->|"resizes media"| node_cloudinary
node_cloudinary -->|"delivers media"| node_cdn
node_videopage -->|"requests signature"| node_signature
node_signature -->|"checks identity"| node_clerk
node_signature -->|"connects"| node_dbconn
node_signature -->|"reads usage"| node_users
node_signature -->|"checks limit"| node_plans
node_signature -->|"signs upload"| node_cloudinary
node_videopage -->|"uploads video"| node_cloudinary
node_videopage -->|"submits metadata"| node_videoapi
node_videoapi -->|"checks identity"| node_clerk
node_videoapi -->|"connects"| node_dbconn
node_videoapi -->|"reads / updates"| node_users
node_videoapi -->|"checks limit"| node_plans
node_videoapi -->|"creates record"| node_videos
node_imagefeatures -->|"uploads image"| node_imageapi
node_imageapi -->|"checks identity"| node_clerk
node_imageapi -->|"connects"| node_dbconn
node_imageapi -->|"reads / updates"| node_users
node_imageapi -->|"checks limit"| node_plans
node_imageapi -->|"uploads image"| node_cloudinary
node_pricing -->|"continues to"| node_checkout
node_checkout -->|"requests order"| node_orderapi
node_orderapi -->|"checks identity"| node_clerk
node_orderapi -->|"prices plan"| node_plans
node_orderapi -->|"creates order"| node_razorpay
node_checkout -->|"completes payment"| node_razorpay
node_checkout -->|"submits signature"| node_verifyapi
node_verifyapi -->|"checks identity"| node_clerk
node_verifyapi -->|"verifies payment"| node_razorpay
node_verifyapi -->|"connects"| node_dbconn
node_verifyapi -->|"updates plan"| node_users
node_verifyapi -->|"records payment"| node_payments
node_dashboard -->|"loads profile"| node_userapi
node_dashboard -->|"loads videos"| node_videosapi

click node_home "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/page.tsx"
click node_authpages "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(auth)/sign-in/%5B%5B...sign-in%5D%5D/page.tsx"
click node_dashboard "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/user-dashboard/page.tsx"
click node_imagefeatures "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/remove-background/page.tsx"
click node_effects "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/add-effects/page.tsx"
click node_genbg "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/gen-background/page.tsx"
click node_social "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/social-share/page.tsx"
click node_videopage "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/video-upload/page.tsx"
click node_imageapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/image-upload/route.ts"
click node_signature "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/signature/route.ts"
click node_videoapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/route.ts"
click node_plans "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/services.ts"
click node_pricing "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(billings)/billings/page.tsx"
click node_checkout "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(billings)/checkout/page.tsx"
click node_orderapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/razorpay/order/route.ts"
click node_verifyapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/razorpay/verify/route.ts"
click node_userapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/user/route.ts"
click node_videosapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/videos/route.ts"
click node_paymentsapi "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/user/payments/route.ts"
click node_subscription "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/subscription.ts"
click node_dbconn "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/db.ts"
click node_users "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/user.models.ts"
click node_videos "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/video.models.ts"
click node_payments "https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/payment.models.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_home,node_authpages,node_dashboard,node_visitor toneBlue
class node_imagefeatures,node_effects,node_genbg,node_social,node_videopage,node_imageapi,node_signature,node_videoapi toneAmber
class node_plans,node_pricing,node_checkout,node_orderapi,node_verifyapi toneMint
class node_userapi,node_videosapi,node_paymentsapi,node_subscription,node_dbconn,node_users,node_videos,node_payments toneRose
class node_cloudinary,node_cdn,node_razorpay,node_clerk toneIndigo
```

## Components

### User experience

- [Landing](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/page.tsx): `app/page.tsx`
- [Sign in / up](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(auth)/sign-in/%5B%5B...sign-in%5D%5D/page.tsx): `app/(auth)/sign-in/[[...sign-in]]/page.tsx`
- [Usage dashboard](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/user-dashboard/page.tsx): `app/(app)/user-dashboard/page.tsx`

### Media workflows

- [Image tools](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/remove-background/page.tsx): `app/(app)/remove-background/page.tsx`
- [Image effects](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/add-effects/page.tsx): `app/(app)/add-effects/page.tsx`
- [Generative fill](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/gen-background/page.tsx): `app/(app)/gen-background/page.tsx`
- [Social resizing](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/social-share/page.tsx): `app/(app)/social-share/page.tsx`
- [Video upload](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(app)/video-upload/page.tsx): `app/(app)/video-upload/page.tsx`
- [Image upload API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/image-upload/route.ts): `app/api/image-upload/route.ts`
- [Video signature API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/signature/route.ts): `app/api/video-upload/signature/route.ts`
- [Video metadata API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/video-upload/route.ts): `app/api/video-upload/route.ts`

### Plans and billing

- [Plan limits](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/services.ts): `lib/services.ts`
- [Plan selection](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(billings)/billings/page.tsx): `app/(billings)/billings/page.tsx`
- [Checkout page](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/(billings)/checkout/page.tsx): `app/(billings)/checkout/page.tsx`
- [Create order API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/razorpay/order/route.ts): `app/api/razorpay/order/route.ts`
- [Verify payment API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/razorpay/verify/route.ts): `app/api/razorpay/verify/route.ts`

### Persistence

- [User profile API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/user/route.ts): `app/api/user/route.ts`
- [Video history API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/videos/route.ts): `app/api/videos/route.ts`
- [Payment history API](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/app/api/user/payments/route.ts): `app/api/user/payments/route.ts`
- [Cycle reset logic](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/subscription.ts): `lib/subscription.ts`
- [Database connection](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/lib/db.ts): `lib/db.ts`
- [User records](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/user.models.ts): `models/user.models.ts`
- [Video records](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/video.models.ts): `models/video.models.ts`
- [Payment records](https://github.com/pratham-taikar/cloudinary-saas-v2/blob/main/models/payment.models.ts): `models/payment.models.ts`

### Other components

- **Visitor / user**
- **Cloudinary**
- **Media CDN**
- **Razorpay**
- **Clerk identity**

## Connections

- Visitor / user → Landing: opens
- Visitor / user → Sign in / up: authenticates
- Visitor / user → Image tools: uses tools
- Visitor / user → Image effects: applies filters
- Visitor / user → Generative fill: prompts fill
- Visitor / user → Social resizing: resizes media
- Visitor / user → Video upload: uploads video
- Visitor / user → Plan selection: chooses plan
- Visitor / user → Usage dashboard: views account
- Sign in / up → Clerk identity: authenticates
- Image tools → Cloudinary: transforms media
- Image effects → Cloudinary: transforms media
- Generative fill → Cloudinary: generates background
- Social resizing → Cloudinary: resizes media
- Cloudinary → Media CDN: delivers media
- Video upload → Video signature API: requests signature
- Video signature API → Clerk identity: checks identity
- Video signature API → Database connection: connects
- Video signature API → User records: reads usage
- Video signature API → Plan limits: checks limit
- Video signature API → Cloudinary: signs upload
- Video upload → Cloudinary: uploads video
- Video upload → Video metadata API: submits metadata
- Video metadata API → Clerk identity: checks identity
- Video metadata API → Database connection: connects
- Video metadata API → User records: reads / updates
- Video metadata API → Plan limits: checks limit
- Video metadata API → Video records: creates record
- Image tools → Image upload API: uploads image
- Image upload API → Clerk identity: checks identity
- Image upload API → Database connection: connects
- Image upload API → User records: reads / updates
- Image upload API → Plan limits: checks limit
- Image upload API → Cloudinary: uploads image
- Plan selection → Checkout page: continues to
- Checkout page → Create order API: requests order
- Create order API → Clerk identity: checks identity
- Create order API → Plan limits: prices plan
- Create order API → Razorpay: creates order
- Checkout page → Razorpay: completes payment
- Checkout page → Verify payment API: submits signature
- Verify payment API → Clerk identity: checks identity
- Verify payment API → Razorpay: verifies payment
- Verify payment API → Database connection: connects
- Verify payment API → User records: updates plan
- Verify payment API → Payment records: records payment
- Usage dashboard → User profile API: loads profile
- Usage dashboard → Video history API: loads videos
