page:blueprints:digital agencies:client portal:next js

Digital agencies: client portal using Next.js

Summary

A client portal blueprint for digital agencies built with Next.js on Ample.

Domain schema:

Public information: services and case studies, team, contact.
Kept out of scope: unreleased creative and campaign plans, client analytics exports, brand credentials.

Technical basis verified on Next.js: A role-to-document access model with negative tests (401 without identity, 403 for the wrong role) and a private-bucket round-trip for the allowed role (private=ok).

Representative Queries

Resource Requirements

Infrastructure Requirements

  1. Compute

    • Status: verified
    • Summary: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.
  2. Postgres

    • Status: verified
    • Summary: Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.
  3. S3-compatible object storage

    • Status: verified
    • Summary: Buckets are S3-compatible with issued credentials; PutObject and GetObject are verified by canary. Other S3 operations are not verified.

Prerequisites

Workflow Steps

  1. Model the digital agencies domain
    Create the tables client_entities, engagements, approval_rounds, deliverables, document_access. Client brands lives in client_entities; keep the sensitive classes (unreleased creative and campaign plans, client analytics exports, brand credentials) out of this schema.
  2. Model client entities and engagement periods; every document belongs to one engagement.
  3. Authorize by client entity and role before any storage access (401 without identity, 403 for the wrong client).
  4. Store documents in the private bucket and stream them through the app.
  5. Deploy and verify the negative authorization tests and an authorized download.
  6. Run the synchronous deploy and read the result. Re-running with no change is a no-op.

Examples

Cost Estimate

Limitations