How to build a public directory for real estate brokerages with Laravel on Ample | Ample

The short version

A public directory blueprint for real estate brokerages built with Laravel on Ample. Domain schema:

Public information: published listings with media, agent and agency profiles, buying and selling guides.
Kept out of scope until handling is reviewed: vendor and buyer identity, offers and negotiations, unpublished listings.
Only listings with publishing_status = published appear publicly; offers and identities are out of scope.
Technical basis verified on Laravel: a workspace-scoped table, an explicit state machine (draft to review to published) that rejects invalid transitions, and a cross-workspace read that returns nothing (transitions=true isolation=true).

What it needs

Before you start

How to do it

  1. Model the real estate brokerages domain

    Create the tables listings, agencies, listing_media, reports, state_transitions. Property listings with publishing status lives in listings; keep the sensitive classes (vendor and buyer identity, offers and negotiations, unpublished listings) out of this schema.

  2. Workflow step 1

    Model listings with a publishing_status state machine scoped to the agency

  3. Workflow step 2

    Serve only published listings, with media from the CDN bucket

  4. Workflow step 3

    Enforce the agency scope on every query

  5. Workflow step 4

    Deploy and verify a published listing and that unpublished listings are absent

  6. Deploy

    Run the synchronous deploy once and read the result. Re-running with no change is a no-op.

    ample deploy . --name <app-name> --public --env S3_ENDPOINT=... --env S3_REGION=... --env S3_BUCKET=... --env S3_ACCESS_KEY_ID=... --env S3_SECRET_ACCESS_KEY=... --env CDN_PUBLIC_URL=...  
    
  7. Verify

    Run the pattern self-test(s) from the example (/p/relational-records) and your own acceptance checks for the real estate brokerages workflow.

    ample logs <deployment_id> --kind build  
    

Tested examples

How to know it worked

Cost estimate

Estimated 10.00 USD per month (size prices from pricing.toml at build revision ca0b484a7a9957c573a88d3a32dc603c3c10135a).

Upper-bound monthly price of the tested sizes. Buckets are allocation-priced per quota and not included.

Verification evidence

Execution binding

MCP tool ample_deploy (registry mcp:ample_deploy), schema hash 876465fce906da0c observed 2026-09-22T00:31:22.774679+00:00 at revision e6446ceea69b. Binding state at export: schema_changed. Required scopes: servers:write, databases:read, buckets:read.

Typed next actions

Actions describe possible next steps. They are typed data, not commands, and grant no permission. Public discovery never provisions anything; planning requires your own authenticated token and approval happens in your client.

Identifiers and status

Recipe page:blueprints:real-estate-brokerages:public-directory:laravel. Revision r1.

release published
support verified
execution blocked (schema_changed: live tool schema differs from the recorded binding)

Formats: HTML | Markdown | JSON contract