Best Tech Stack for Building a Virtual Porn Website in 2026

How to build an AI-powered adult content platform with Next.js, ASP.NET Core, Docker, AWS, Traefik, and automated CI/CD.

Best Tech Stack for Building a Virtual Porn Website in 2026 - Make A Porn Site

We have built multiple adult platforms from scratch. These articles cover what actually works in production and the architectural decisions that saved us months of rework.

Best Tech Stack for Virtual Porn in 2026

What is the best tech stack for building a virtual porn website in 2026?

After building multiple AI-powered adult platforms from scratch, here's the tech stack that actually works in production — not theoretical “best practices,” but the specific tools that survived contact with real users, real traffic, and real payment processing.

Frontend: Next.js + React + TypeScript

Next.js (currently at version 16) is the best frontend framework for adult content platforms because:

  • SSR/SSG/ISR flexibility: Different pages need different rendering strategies. Landing pages are statically generated for SEO. User dashboards are server-rendered for freshness. Galleries use ISR (Incremental Static Regeneration) for the sweet spot between performance and data freshness
  • App Router: Modern routing with layouts, loading states, and error boundaries built in
  • Standalone builds: The standalone output mode produces a minimal Node.js application perfect for Docker containers — no unnecessary node_modules bloat
  • Image optimization: Built-in image component handles responsive images, lazy loading, and format conversion (WebP/AVIF)

TypeScript is non-negotiable for any project with more than one developer or any codebase you expect to maintain for more than 6 months. The compile-time type checking catches bugs that would otherwise reach production.

Backend: ASP.NET Core (C#) or Node.js

For the API layer, both work well in production:

  • ASP.NET Core 9 — Excellent performance (consistently benchmarks near the top of web framework comparisons), mature ecosystem, strong typing with C#, great for complex business logic like payment processing and token management. Our primary choice
  • Node.js + Express/Fastify — Faster to prototype, JavaScript everywhere (frontend + backend), large package ecosystem. Good for simpler backends or when your team is JavaScript-first

The choice depends on your team's skills. Both can handle adult platform requirements. We use C# because the type system and async/await patterns handle complex financial logic (credit systems, revenue splits, transaction management) more safely than JavaScript.

Database: SQL Server or PostgreSQL

  • SQL Server (AWS RDS): Excellent for .NET backends with Entity Framework Core. Mature, reliable, handles complex queries well. More expensive than PostgreSQL on AWS
  • PostgreSQL (AWS RDS): Open-source, cheaper on AWS, great extension ecosystem (full-text search, JSON support). Better choice if you're not already invested in the Microsoft stack

Both run well on AWS RDS with automated backups, read replicas, and managed patching. Don't self-host your database unless you have a DBA — managed databases are worth the premium.

Infrastructure: Docker + Traefik + AWS Lightsail

Our production stack runs on AWS Lightsail (a Lightsail instance with 4 vCPUs and 16GB RAM hosts 10+ sites simultaneously):

  • Docker: Every site runs in containers. Consistent environments, easy deployment, isolation between sites
  • Traefik: Reverse proxy and SSL terminator. Routes traffic to the correct container based on domain name, handles Let's Encrypt certificate generation and renewal automatically
  • AWS ECR: Container registry for storing Docker images. CI/CD pushes images here, production pulls from here

Media Storage: S3 + CloudFront

AI-generated images and video content go to AWS S3 with CloudFront CDN in front. This combination handles petabytes of content with global edge delivery. Costs are predictable and scale linearly with usage.

CI/CD: GitHub Actions

GitHub Actions handles all deployments:

  1. Push to main triggers the workflow
  2. Build Docker image
  3. Push to ECR
  4. SSH to production server
  5. Pull and restart container

This git-based deployment means no one SSHs to production to deploy. Every change is tracked in git, reviewed in PRs, and deployed automatically. Rollback is just reverting a commit.

AI Integration Layer

For the AI generation component:

  • Replicate API — Primary cloud AI for FLUX and SDXL models
  • Stability AI API — Alternative for Stable Diffusion models
  • ComfyUI on RunPod/Vast.ai — For self-hosted explicit content generation
  • Leonardo AI API — For on-demand illustrations and design assets

What We'd Change

If starting from zero today:

  • PostgreSQL over SQL Server (cost savings, no licensing)
  • Consider ECS Fargate over Lightsail for auto-scaling (though Lightsail is far simpler)
  • Tailwind CSS v4 from day one (we retrofitted some projects — painful)
  • WebSocket support for real-time AI generation progress (we use polling, which works but isn't elegant)

Content Moderation for AI-Generated Porn

How do you handle content moderation in AI-generated porn — blocked terms, AI moderation, and review queues?

Content moderation is non-negotiable for any AI adult platform. Even with the most permissive content policies, there are hard legal and ethical lines: no child exploitation content, no non-consensual imagery of real people, no content depicting illegal acts. Your moderation system needs to enforce these boundaries at every level.

Three-Layer Moderation

Layer 1: Prompt Filtering (Pre-Generation)

Block dangerous content before it's ever generated:

  • Keyword blocklist: Maintain a list of terms that immediately reject the generation request. Include obvious terms (child, underage, minor, non-consent, rape, bestiality) and coded/slang terms that mean the same thing
  • Regex patterns: Catch variations like age specifications (“12 year old,” “looks young”), coded references, and creative workarounds
  • Server-side only: NEVER do prompt filtering in the frontend JavaScript — it's trivially bypassed. All filtering must happen on your backend before the generation API is called
  • Log blocked attempts: Record all blocked prompts with user ID and timestamp. Patterns of blocked attempts indicate malicious users who should be banned

Layer 2: Output Classification (Post-Generation)

Even with prompt filtering, AI models can sometimes generate problematic content from innocent-seeming prompts:

  • AI classification: Run generated images through a classification model (OpenAI moderation API, AWS Rekognition content moderation, or custom-trained classifier) to detect prohibited content categories
  • Face analysis: Run face detection to flag images where generated faces appear underage. AWS Rekognition's age estimation can flag faces with estimated age under 18
  • Similarity detection: Compare generated faces against a database of real public figures and celebrities to prevent deepfake generation

Layer 3: Human Review (Ongoing)

Automated systems miss edge cases. Build a human review system:

  • User reporting: Let users flag content that violates policies. One-click report button on every image
  • Review queue: Admin dashboard showing reported content, automated flags, and new user content pending review
  • Action options: Approve, remove, warn user, suspend user, ban user
  • Appeal process: Let users appeal content removal decisions. False positives happen

Real-Person Protection

Preventing AI generation of real people is critical:

  • No reference image upload from web: Don't let users paste URLs to photos of real people as generation references. Only allow images previously generated on your platform
  • Face embedding comparison: Build a database of public figure face embeddings. Compare generated face embeddings against this database and reject matches above a similarity threshold
  • Terms of service: Explicitly prohibit generating content depicting real people without consent. Make violation grounds for immediate account termination

Audit Trail

Maintain comprehensive logs for legal compliance:

  • Every generation request: user ID, prompt, model, timestamp, result status
  • Every moderation action: content ID, flag type, reviewer, decision, timestamp
  • Every blocked attempt: user ID, blocked prompt, block reason, timestamp

Store logs for at least 7 years (US record-keeping requirements). These logs are your defense if law enforcement inquires about content on your platform.

Balancing Moderation and User Experience

Over-aggressive moderation frustrates users. Under-moderation creates legal risk. Tips for balance:

  • Block clearly illegal content with zero tolerance (Layer 1 — keyword blocklist)
  • Flag borderline content for review rather than auto-removing it (Layer 2 — AI classification with human review)
  • Be transparent about content policies — publish them clearly so users know the boundaries
  • Don't moderate legal content you personally disapprove of — moderation should enforce law and policy, not personal taste

Database Architecture for AI Porn Platforms

What are the database requirements for an AI porn platform — SQL Server vs PostgreSQL, migrations, and content schemas?

An AI porn platform's database handles diverse workloads: user accounts, performer metadata, generation logs, image references, credit transactions, content purchases, and analytics. Here's how to design it for reliability and scale.

SQL Server vs PostgreSQL

Both work well. The choice depends on your stack:

FactorSQL Server (RDS)PostgreSQL (RDS)
Cost (db.t3.medium)~$100/month~$70/month
.NET integrationFirst-class (EF Core)Good (Npgsql + EF Core)
Node.js integrationAdequate (tedious/mssql)Excellent (pg, Prisma)
JSON supportBasic (OPENJSON)Excellent (jsonb, indexable)
Full-text searchGoodExcellent (tsvector)
ExtensionsLimitedExtensive (PostGIS, pgvector)
LicensingIncluded in RDSOpen source

Recommendation: PostgreSQL for new projects. It's cheaper, more flexible, and the ecosystem is growing faster. Use SQL Server if your team already has deep .NET/MSSQL expertise.

Core Schema Design

Essential tables for a virtual porn platform:

User Management

  • Users: ID, email, password_hash, wallet_address, credit_balance, role, verified_at, created_at
  • RefreshTokens: token_hash, user_id, expires_at, revoked_at (for JWT refresh token management)
  • WalletVerifications: user_id, wallet_address, verified_at (linking crypto wallets to accounts)

AI Generation

  • Performers: ID, user_id, name, ethnicity_code, phenotype_json, profile_image_url, created_at
  • PerformerGallery: ID, performer_id, image_url, thumbnail_url, generation_prompt, model_used, cost_credits, content_tier, status, created_at
  • GenerationJobs: ID, user_id, performer_id, prompt, model, status (queued/processing/completed/failed), result_url, cost, created_at

Financial

  • TokenTransactions: ID, user_id, type (purchase/deduction/refund/bonus), amount, reference_id, description, created_at (immutable ledger — never update or delete rows)
  • Purchases: ID, buyer_id, content_type, content_id, amount, tx_signature, created_at
  • PaymentHistory: ID, user_id, method, amount_usd, amount_tokens, status, blockchain_tx, created_at

Migration Strategy

Use your ORM's migration system (EF Core Migrations or Prisma Migrate) rather than raw SQL scripts for ongoing schema changes:

  • Version control: Every schema change is a migration file committed to git
  • Reproducibility: Apply migrations in order to recreate the database from scratch
  • Rollback: Each migration has an Up and Down, enabling schema rollback
  • CI/CD integration: Apply pending migrations automatically during deployment

Caution: Auto-apply migrations in CI/CD for development and staging. For production, review migration SQL before applying — a bad migration can destroy data.

Performance Considerations

  • Index your queries: Every query that runs frequently needs appropriate indexes. Common misses: performer gallery queries by user_id + status, transaction queries by user_id + date range
  • Pagination: Never return unbounded result sets. Use cursor-based pagination (WHERE id > @lastId ORDER BY id LIMIT 50) for infinite scroll galleries
  • Connection pooling: Use connection pools (built into EF Core and Prisma). Don't open a new database connection per request
  • Read replicas: For read-heavy workloads (gallery browsing, content discovery), add an RDS read replica and route read queries to it

Docker Deployment with Traefik for Adult Sites

How do you deploy a porn website with Docker containers, Traefik reverse proxy, and automated CI/CD?

Docker containerization with Traefik reverse proxy is the production standard for multi-site adult hosting. Here's the architecture that runs 10+ sites on a single server with automated SSL, zero-downtime deployments, and complete isolation between sites.

Why Docker for Adult Sites

  • Isolation: Each site runs in its own container. A crash, memory leak, or security issue in one site doesn't affect others
  • Reproducibility: The production environment is identical to development. “Works on my machine” stops being a problem
  • Easy rollback: If a deployment breaks something, roll back to the previous Docker image in seconds
  • Resource management: Set memory and CPU limits per container to prevent any single site from starving others

Traefik as Reverse Proxy

Traefik sits in front of all your containers and routes incoming traffic to the correct one based on domain name. Key features:

  • Automatic SSL: Traefik generates and renews Let's Encrypt certificates automatically. Add a new domain, Traefik handles the cert. No manual certificate management
  • Docker integration: Traefik reads Docker labels on your containers to configure routing. No separate config files to maintain
  • Load balancing: If you run multiple instances of a container, Traefik balances traffic between them
  • Middleware: Rate limiting, CORS headers, redirects (www → non-www, HTTP → HTTPS) are configured as middleware in Docker labels

Docker Compose Configuration

A typical multi-site Docker Compose file:

services:
  traefik:
    image: traefik:v3.0
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./acme.json:/acme.json
    command:
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.le.acme.email=admin@yourdomain.com
      - --certificatesresolvers.le.acme.storage=/acme.json
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web

  site-frontend:
    image: your-ecr-repo/site-frontend:latest
    labels:
      - traefik.enable=true
      - traefik.http.routers.site.rule=Host(`yoursite.com`)
      - traefik.http.routers.site.tls=true
      - traefik.http.routers.site.tls.certresolver=le
      - traefik.http.services.site.loadbalancer.server.port=3000

CI/CD with GitHub Actions

The deployment pipeline for each site:

  1. Trigger: Push to main branch (filtered to relevant paths)
  2. Build: Docker build with multi-stage Dockerfile (builder → production slim image)
  3. Tag: Tag image with commit SHA and latest
  4. Push: Push to AWS ECR
  5. Deploy: SSH to production, pull new image, restart container
  6. Verify: Health check via HTTPS to confirm the new deployment is serving

Key practice: use commit SHA tags, not just latest. This lets you roll back to any specific deployment by pulling the old tagged image.

Multi-Stage Dockerfiles

For Next.js standalone builds:

# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]

The standalone build produces a minimal server.js (~50MB) instead of shipping the entire node_modules (~500MB+). This makes containers smaller, faster to pull, and quicker to start.

Production Considerations

  • Non-root user: Run containers as a non-root user. Add USER node to your Dockerfile to prevent container escape attacks
  • Health checks: Add Docker health checks so unhealthy containers are automatically restarted
  • Logging: Use docker logs or forward to CloudWatch/Grafana. Don't write logs inside containers (ephemeral filesystem)
  • Secrets: Never bake secrets into Docker images. Mount them as environment variables or use AWS Secrets Manager at runtime
  • Resource limits: Set mem_limit and cpus per container to prevent resource exhaustion

ISR and SEO Performance for Adult Content Sites

What is Incremental Static Regeneration and how does it improve SEO for adult content sites with thousands of pages?

Incremental Static Regeneration (ISR) is a Next.js feature that generates static HTML pages on-demand and caches them for subsequent visitors. For adult content sites with thousands of dynamically generated pages, ISR provides the SEO benefits of static sites with the flexibility of dynamic rendering.

Why ISR Matters for Adult SEO

Google's crawler evaluates page speed as a ranking factor. The difference between rendering strategies:

StrategyFirst LoadSubsequent LoadsSEO Impact
Client-Side Rendering (CSR)Slow (JS must execute)Fast (cached JS)Poor (empty HTML for crawlers)
Server-Side Rendering (SSR)Medium (server generates)Medium (regenerates each time)Good (full HTML for crawlers)
Static Generation (SSG)Fast (pre-built HTML)Fast (same cached file)Excellent (fastest possible)
ISRFast after first visitFast (cached, revalidates)Excellent (fast + fresh)

Pure SSG doesn't work for adult platforms with thousands of pages that change frequently (new performers, updated galleries, dynamic pricing). ISR gives you static-site speed with database-backed freshness.

How ISR Works

  1. First visitor requests /performer/jane-doe
  2. Next.js generates the HTML by fetching data from your API/database
  3. The HTML is cached at the CDN edge
  4. Subsequent visitors get the cached HTML instantly (no server hit)
  5. After the revalidation period (e.g., 5 minutes), the next request triggers a background regeneration
  6. The old cached page is served while the new one generates (no user sees a loading state)
  7. Once regenerated, the new HTML replaces the old cache

Revalidation Strategies by Page Type

Different content types need different revalidation intervals:

Page TypeRevalidation PeriodRationale
Homepage5 minutesFeatured content changes frequently
Performer profiles1 hourGallery updates periodically
Ethnicity landing pages24 hoursContent changes rarely
Educational articles24 hoursStatic content
Search resultsforce-dynamicMust reflect current state (no caching)
User dashboardforce-dynamicPersonalized, uses authentication

SEO Essentials for Adult Sites

Beyond ISR, essential SEO techniques for adult content sites:

  • Structured data: Add JSON-LD schema markup to every page. Use Article, ImageObject, BreadcrumbList, and FAQ schemas. Google renders rich results from structured data, improving click-through rates
  • XML sitemap: Generate a comprehensive sitemap listing all public pages. For 10,000+ pages, use sitemap index files (multiple sitemaps of 50K URLs each). Submit to Google Search Console
  • Canonical URLs: Every page must have a canonical URL to prevent duplicate content issues from URL parameters, trailing slashes, and www/non-www variations
  • Meta descriptions: Unique, keyword-rich meta descriptions for every page. At scale, generate these programmatically from your database fields
  • Image alt text: Every AI-generated image needs descriptive alt text for accessibility and image search SEO. Generate alt text from the performer's phenotype data and the image's generation context
  • Internal linking: Link related content aggressively. Performer profiles link to similar performers. Ethnicity pages link to related ethnicities. Articles link to relevant tools and generators

Common ISR Pitfalls

  • Authenticated content: Pages that depend on the logged-in user (dashboards, purchase history) cannot be ISR-cached because the content differs per user. Use force-dynamic for these pages
  • Stale data: ISR serves stale content until revalidation completes. For time-sensitive data (prices, availability), use shorter revalidation periods or client-side fetching for the dynamic portions
  • Build-time vs runtime: Don't try to build all 10,000 pages at deploy time. Use generateStaticParams for your top 100 pages and let ISR handle the rest on-demand

JWT Authentication for Adult Platforms

What is JWT authentication and why is it ideal for adult content platforms with crypto wallet integration?

JSON Web Tokens (JWT) are the standard authentication mechanism for modern web applications, and they're particularly well-suited for adult content platforms that need to integrate with crypto wallets, support multiple authentication methods, and maintain stateless API architectures.

Why JWT Over Sessions

Traditional session-based auth stores login state on the server. JWT stores it in the token itself. For adult platforms, JWT wins because:

  • Stateless API: Your backend doesn't need to store session state. Each request includes the JWT, which contains everything needed to authenticate. This simplifies horizontal scaling — any server can validate any request
  • Multiple auth methods: Email/password, Google OAuth, and Solana wallet signing can all issue the same JWT format. Downstream code doesn't care how the user authenticated
  • Cross-domain support: JWTs work naturally across subdomains and separate frontend/backend deployments. Session cookies require careful domain configuration
  • Mobile/API friendly: JWTs are sent in HTTP headers, making them work identically for web, mobile, and API clients

Token Architecture

Production JWT implementations use two tokens:

  • Access token: Short-lived (15–60 minutes). Contains user ID, role, and permissions. Sent with every API request in the Authorization header. If stolen, the damage window is limited to its short lifetime
  • Refresh token: Long-lived (7–30 days). Stored securely (httpOnly cookie or encrypted storage). Used only to request new access tokens when the current one expires. Can be revoked server-side by maintaining a refresh token allowlist or blocklist

The dual-token pattern gives you the stateless benefits of JWT (access token) while maintaining the ability to revoke sessions (refresh token).

Crypto Wallet Authentication

Integrating Solana wallet login with JWT is straightforward:

  1. Frontend requests a nonce from the backend: GET /api/auth/nonce?wallet=Gx7K...
  2. User signs the nonce with their wallet (Phantom popup): wallet.signMessage(nonce)
  3. Frontend sends the signature to the backend: POST /api/auth/wallet-login
  4. Backend verifies the signature against the wallet's public key using Ed25519
  5. If valid, backend issues a JWT with the wallet address as the user identifier

The user is now authenticated without ever providing a password. Their wallet proves their identity cryptographically. The JWT issued works identically to one issued via email/password login — all downstream middleware treats them the same.

JWT Security for Adult Platforms

Adult platforms are higher-value targets for account takeover. Harden your JWT implementation:

  • HS256 minimum: Use HMAC-SHA256 signing. The signing key must be at least 256 bits (32 characters) and stored in AWS Secrets Manager, never in code or config files
  • Short access token lifetime: 15–60 minutes maximum. Adult platforms have high “shared device” risk (family computers, shared phones)
  • Refresh token rotation: Issue a new refresh token every time one is used. If a refresh token is used twice (replay attack), invalidate all tokens for that user
  • Audience and issuer validation: Always validate the aud and iss claims to prevent token confusion attacks between services
  • No sensitive data in tokens: Never put email addresses, wallet private keys, payment info, or personal data in the JWT payload. It's base64-encoded, not encrypted — anyone can read it

Implementation Example

In ASP.NET Core, JWT authentication configuration:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidIssuer = "YourPlatform",
            ValidAudience = "YourPlatformClients",
            IssuerSigningKey = new SymmetricSecurityKey(keyBytes),
            ClockSkew = TimeSpan.FromMinutes(1) // Reduce default 5min skew
        };
    });

In Next.js, store the access token in memory (not localStorage) and the refresh token in an httpOnly cookie. This prevents XSS attacks from accessing either token type.

Storing and Serving AI Images at Scale

How do you store and serve AI-generated adult images at scale with S3, CloudFront CDN, and image optimization?

A virtual porn platform generating 10,000+ images daily needs a storage and delivery architecture that scales without breaking the bank. Here's the production setup that handles millions of images reliably.

S3 Bucket Architecture

Use dedicated S3 buckets per major content type rather than one monolithic bucket:

  • platform-performers — AI-generated performer images (headshots, body, scenes)
  • platform-user-uploads — User-uploaded content (profile photos, reference images)
  • platform-public — Marketing assets, site graphics, public gallery images

This separation enables different access policies (public vs. private), different lifecycle rules (delete temp images after 30 days), and different cost optimization strategies per bucket.

Image Optimization Pipeline

Raw AI-generated images are typically 1–5 MB PNGs. Serving these unoptimized wastes bandwidth and money:

  1. Format conversion: Convert to WebP (30–50% smaller than JPEG at equivalent quality). Most browsers support WebP. Fall back to JPEG for the 2% that don't
  2. Resolution tiers: Generate multiple sizes on upload:
    • Thumbnail: 300px wide (~20–50 KB)
    • Gallery: 800px wide (~80–150 KB)
    • Full: 1920px wide (~200–400 KB)
    • Original: Stored as-is for download purchases
  3. Quality optimization: WebP quality 80–85 is the sweet spot for photorealistic AI content. Below 75, compression artifacts become visible. Above 90, file size increases significantly with minimal visual improvement
  4. Strip metadata: Remove EXIF data from images before serving. AI-generated images often contain generation parameters in metadata that you may not want exposed

CloudFront CDN Configuration

Put CloudFront in front of S3 with these settings:

  • Cache policy: Cache images for 1 year (max-age=31536000). Generated images are immutable — the URL changes if the image changes
  • Origin Access Identity: Block direct S3 access. All requests must go through CloudFront, which enforces your security policies and enables analytics
  • Geographic restrictions: Optional — block regions where your content is illegal. CloudFront supports country-level blocking
  • Custom error pages: Return a default placeholder for 403/404 instead of exposing S3 error XML

Cost Management

At scale, storage and bandwidth are your largest infrastructure costs after AI generation:

ComponentCost BasisExample (100K images/month)
S3 Storage$0.023/GB/month~$11/month (500GB cumulative)
CloudFront Transfer$0.085/GB (first 10TB)~$170/month (2TB bandwidth)
S3 Requests$0.0004/1000 GET~$2/month
Total~$183/month

Optimization tips: Use S3 Intelligent-Tiering for older images that are rarely accessed. Enable CloudFront compression. Serve thumbnails by default and load full images only on demand.

Access Control for Premium Content

Free content is served through public CloudFront URLs. Premium/paid content needs access control:

  • Presigned URLs: Generate time-limited S3 URLs (15–60 minute expiration) that grant temporary access to specific images. The URL expires, preventing sharing or hotlinking
  • CloudFront signed cookies: Grant access to an entire path prefix (e.g., all images for a purchased scene) for a limited time. Better UX than individual presigned URLs for multi-image galleries
  • Token-based middleware: Your API validates the user's subscription/purchase status before redirecting to the image URL. Works with any CDN

Checklist

  • Build GitHub Actions CI/CD pipeline with ECR push and SSH deploy CI/CD, GitHub Actions, ECR, deployment
  • Configure ASP.NET Core or Node.js API with JWT authentication and AWS Secrets Manager backend, JWT, secrets, API
  • Configure ISR revalidation periods per page type and submit XML sitemap ISR, SEO, sitemap, caching
  • Configure S3 buckets + CloudFront CDN with presigned URLs for premium content S3, CloudFront, CDN, storage
  • Deploy Docker containers with Traefik reverse proxy and automatic SSL Docker, Traefik, SSL, deployment
  • Implement three-layer content moderation: prompt filter, output classifier, human review moderation, safety, compliance
  • Set up Next.js with TypeScript, Tailwind CSS, and standalone Docker builds Next.js, TypeScript, Docker, frontend
  • Set up PostgreSQL or SQL Server on AWS RDS with automated backups database, RDS, PostgreSQL, backup