### Property Management: Vendor Portal Using Next.js

A vendor portal blueprint for property management built with Next.js on Ample.  
**Domain Schema:**  
- **Listings**: (reference, address, unit, rent, publishing_status, agency_id): rental listings with publishing status;  
- **Agencies**: (name, license_number, portfolio_size): management offices;  
- **Maintenance Vendors**: (name, trade, agency_id, status): vendors per office;  
- **Reports**: (agency_id, period, object_key, generated_at): portfolio reports per office;  
- **Document Access**: (document_id, principal_reference, role, granted_at): who may read which document.  
**Public Information**: available rentals, office contacts, application process.

**Kept out of scope until handling is reviewed**: tenant identity and payment history, inspection reports with personal data. Tenant data is personal and often regulated; only published listings and office-scoped reporting are modeled.

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  
- Property management: vendor portal using Next.js  
- Where can I host Property management: Vendor portal built with Next.js?  
- I need a genuinely specialized vendor portal workflow covering building/vendor access, maintenance status and property reporting.

### Infrastructure Requirements  
- **Compute**: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.  
- **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.  
- **S3-compatible object storage**: Buckets are S3-compatible with issued credentials; PutObject and GetObject are verified by canary. Other S3 operations are not verified.

### Workflow Steps  
1. **Model the property management domain**: Create the tables listings, agencies, maintenance_vendors, reports, document_access. Rental listings with publishing status lives in listings; keep the sensitive classes (tenant identity and payment history, inspection reports with personal data) out of this schema.  
2. **Workflow step 1**: Model vendors scoped to the agency with roles.  
3. **Workflow step 2**: Authorize document access by vendor and role (401, 403 negative tests).  
4. **Workflow step 3**: Store vendor documents in the private bucket.  
5. **Workflow step 4**: Deploy and verify the negative tests and an authorized download.  
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/private-document-library) and your own acceptance checks for the property management workflow.  
   - Command: `ample logs --kind build`

### Cost Estimate  
- **Currency**: USD  
- **Monthly Amount**: 10.0  
- **Basis**: size prices from pricing.toml (loaded by the API) at build revision 1ac5595375130d45290090e82ed0f554ccd45405-dirty  
- **Components**:  
  - App server (size: s-1vcpu-1gb, quantity: 1.0, monthlyAmount: 5.0)  
  - Managed PostgreSQL database (size: s-1vcpu-1gb, quantity: 1.0, monthlyAmount: 5.0)  
- **Note**: Always-on monthly price of the tested sizes; apps and databases auto-pause when idle. Buckets are allocation-priced per quota and not included.

### Limitations  
- No health, financial, privacy or other compliance claim is made. Tenant data is personal and often regulated; only published listings and office-scoped reporting are modeled.  
- Public content and synthetic examples only until actual data-handling requirements have been reviewed.  
- Verified on the node-22 template at s-1vcpu-1gb; region, request-duration limits and other sizes are unknown or unverified.  
- Managed PostgreSQL 16 only; extensions, connection limits and backup or restore procedures are not verified.

### Next Actions  
- **Action ID**: browse-catalog  
  - **Label**: Browse the catalog index  
  - **Operation ID**: catalog_index  
  - **Method**: GET  
  - **Relative Path**: /v1/catalog

- **Action ID**: search-recipes  
  - **Label**: Search published recipes by intent, stack and constraints  
  - **Operation ID**: search_recipes  
  - **Method**: POST  
  - **Relative Path**: /v1/catalog/search  
  - **Parameters**: {"body":{"limit":5,"query":"Property management: vendor portal using Next.js"}}

- **Action ID**: plan:page:blueprints:property-management:vendor-portal:next-js  
  - **Label**: 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:property-management:vendor-portal:next-js","recipeRevision":"r1"}}

- **Action ID**: auth-setup  
  - **Label**: Read the existing agent authentication setup  
  - **Operation ID**: existing_auth_setup  
  - **Method**: GET  
  - **Relative Path**: /mcp/setup

- **Action ID**: browse:industry:property-management  
  - **Label**: Browse Property management  
  - **Operation ID**: browse_node  
  - **Method**: GET  
  - **Relative Path**: /v1/catalog/nodes/industry%3Aproperty-management

- **Action ID**: browse:workload:vendor-portal  
  - **Label**: Browse Vendor portal  
  - **Operation ID**: browse_node  
  - **Method**: GET  
  - **Relative Path**: /v1/catalog/nodes/workload%3Avendor-portal

- **Action ID**: browse:stack:framework-next-js  
  - **Label**: Browse Next.js  
  - **Operation ID**: browse_node  
  - **Method**: GET  
  - **Relative Path**: /v1/catalog/nodes/stack%3Aframework-next-js

- **Action ID**: browse:intent:deploy-web-app  
  - **Label**: Browse Deploy web app  
  - **Operation ID**: browse_node  
  - **Method**: GET  
  - **Relative Path**: /v1/catalog/nodes/intent%3Adeploy-web-app
