page:blueprints:travel operators:reporting dashboard:next js

Travel operators: reporting dashboard using Next.js

Summary

A reporting dashboard blueprint for travel operators built with Next.js on Ample. Domain schema: listings (reference, destination, departure_dates, price_from, publishing_status, agency_id): trips as listings with publishing status; agencies (name, license_number, region): operators or branches; suppliers (name, type, agency_id, status): hotels and transport suppliers; reports (agency_id, period, object_key, generated_at): branch sales reports; exports (id, definition, object_key, row_count, generated_at, authorized_role): generated artifacts and who may download them. Public information: published trips and departure dates, destination guides, booking conditions. Kept out of scope until handling is reviewed: traveler passports and identity, payment details, supplier contracts. Passport and payment data are regulated; only published trips and branch reporting are modeled. Technical basis verified on Next.js: an export query rendered to a CSV artifact stored with metadata in a private bucket and returned only to an authorized caller (401 without token, export=ok rows=3).

Representative Queries

Resource Requirements

Infrastructure Requirements

  1. Compute
    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
    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
    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 travel operators domain
    Create the tables listings, agencies, suppliers, reports, exports. Trips as listings with publishing status lives in listings; keep the sensitive classes (traveler passports and identity, payment details, supplier contracts) out of this schema.

  2. Workflow step 1
    Model report definitions scoped to the agency.

  3. Workflow step 2
    Generate report artifacts from queries and store them with metadata.

  4. Workflow step 3
    Authorize downloads (401 without identity).

  5. Workflow step 4
    Deploy and verify an authorized export and the rejected anonymous request.

  6. Deploy
    Run the synchronous deploy once and read the result. Re-running with no change is a no-op.
    Command: ample deploy . --name --public --env S3_ENDPOINT=... --env S3_REGION=... --env S3_BUCKET=... --env S3_ACCESS_KEY_ID=... --env S3_SECRET_ACCESS_KEY=...

  7. Verify
    Run the pattern self-test(s) from the example (/p/generated-downloads) and your own acceptance checks for the travel operators workflow.
    Command: ample logs --kind build

Success Checks

  1. App responds on its public URL

    • Kind: http_get
    • Path: /
    • Expect: ample canary next js patterns
  2. generated-downloads self-test from the example

    • Kind: http_get
    • Path: /p/generated-downloads
    • Expect: see the pattern fixture checks

Limitations

Cost Estimate

Evidence Summary

Last Verified At

2026-09-21T02:34:39Z

Unknowns

Formats

Next Actions

  1. Browse the catalog index
    Operation ID: catalog_index
    Method: GET
    Relative Path: /v1/catalog
    Requires Authentication: false
    Requires Approval: false

  2. Search published recipes by intent, stack and constraints
    Operation ID: search_recipes
    Method: POST
    Relative Path: /v1/catalog/search
    Parameters:

    {
      "body": {
        "limit": 5,
        "query": "Travel operators: reporting dashboard using Next.js"
      }
    }
    

    Requires Authentication: false
    Requires Approval: false

  3. Prepare a side-effect-free deployment plan for an authorized project
    Operation ID: plan_deployment
    Method: POST
    Relative Path: /v1/catalog/plan
    Parameters:

    {
      "body": {
        "inputs": {},
        "projectId": "",
        "recipeId": "page:blueprints:travel-operators:reporting-dashboard:next-js",
        "recipeRevision": "r1"
      }
    }
    

    Requires Authentication: true
    Requires Approval: false

  4. Read the existing agent authentication setup
    Operation ID: existing_auth_setup
    Method: GET
    Relative Path: /mcp/setup
    Requires Authentication: false
    Requires Approval: false

  5. Browse Travel operators
    Operation ID: browse_node
    Method: GET
    Relative Path: /v1/catalog/nodes/industry%3Atravel-operators
    Parameters:

    {
      "nodeId": "industry:travel-operators"
    }
    

    Requires Authentication: false
    Requires Approval: false

  6. Browse Reporting dashboard
    Operation ID: browse_node
    Method: GET
    Relative Path: /v1/catalog/nodes/workload%3Areporting-dashboard
    Parameters:

    {
      "nodeId": "workload:reporting-dashboard"
    }
    

    Requires Authentication: false
    Requires Approval: false

  7. Browse Next.js
    Operation ID: browse_node
    Method: GET
    Relative Path: /v1/catalog/nodes/stack%3Aframework-next-js
    Parameters:

    {
      "nodeId": "stack:framework-next-js"
    }
    

    Requires Authentication: false
    Requires Approval: false

  8. Browse Deploy web app
    Operation ID: browse_node
    Method: GET
    Relative Path: /v1/catalog/nodes/intent%3Adeploy-web-app
    Parameters:

    {
      "nodeId": "intent:deploy-web-app"
    }
    

    Requires Authentication: false
    Requires Approval: false