ALEX 3.0 Core · Build Spec

Status: design — not yet built

ALEX Listing Package

Drop in the folder the photographer sent. Get back the processed images, the written copy, the property website, the flyer, the PDFs and the first email series — without touching a single one of them individually.

Today an agent runs six tools by hand between the studio’s delivery and a live listing: correct the images, size them, write the copy, build the site, build the flyer, queue the emails. Each one works. The seam between them is the work, and it is the part that gets skipped at 9pm on a Tuesday. This specifies removing the seams: one input, one approval, everything else generated.

The one input

What the agent actually does.


Drop the studio’s delivery — ZIP, folder, or share link, exactly as it arrived. Confirm the address the system read back. Approve the result. That is the whole interaction. No renaming, no pre-cropping, no re-uploading the same photo into four tools.

What comes out

Seven artifacts, from one drop.


1

Processed image set

Every frame corrected, oriented, and cut to every size the other six outputs need.

2

Written copy

Narrative sections grounded in the actual photos, plus a short-form description and email subject lines.

3

Property website

Published, editable in the browser, with its own short URL.

4

One-page flyer

Print-ready and screen-ready, sharing the site’s hero and price.

5

Rendered PDFs

Site and flyer, re-rendered from the published HTML.

6

Email series, queued

Four campaigns, merge fields filled, left as drafts.

7

A review page

One URL showing all of the above for approval.

The pipeline

Ten stages. Two of them involve a human, on purpose.


1

Ingest the drop

One input: the studio’s delivery as it arrives — a ZIP, a folder, or a Drive/Dropbox share link. Mixed contents are expected and sorted automatically: high-res stills, HEIC from a phone, floor-plan PDFs, drone frames, video, and the studio’s own contact sheet. Nothing is renamed by hand.

new — ingest_package.py
2

Identify the property, once

Address resolved from the folder name, the sidecar, or EXIF GPS, then matched to a live ListingId. The agent confirms the address on screen before anything is generated — the one human checkpoint at the front, because a wrong address poisons all seven outputs.

resolve_address() already exists in generate_listing_site.py
3

Normalize every frame

EXIF orientation applied and stripped, colour and exposure auto-correction, horizon leveling, and HEIC/PNG converted to a working master. This is the server-side twin of the in-browser Image Auto-Correct, so it can run headless on 60 frames without anyone sitting there.

port of public/image-autocorrect.html
4

Crop and fit to the ladder

Each master is cut once per destination — hero, gallery, flyer print, email, social — at the aspect ratios in the table below, with a safe-margin crop that never trims into the frame edge furniture. Print derivatives keep 300 dpi; web derivatives get a WebP plus a JPEG fallback under a size budget.

new — crop_ladder.py
5

Sequence and pick the hero

Order follows the studio’s own delivery order, which is already shot in walk-through sequence; the hero defaults to the first exterior front. No automatic room labelling — photo room labels are off across this project pending training data and are not being re-enabled here. The agent can drag to reorder in the review step.

see: photo room labels OFF
6

Write the copy

Gemini 2.5 Flash reads the actual processed photos plus the MLS facts and returns three to six grounded narrative sections, a short-form description for the flyer, and email subject lines. Grounding rule is already enforced: only what is visible in the photos or stated in the facts. MLS Public Remarks are carried verbatim and never rewritten.

ai_rich_content() / ai_listing_copy() in generate_listing_site.py
7

Build the artifacts

Property website, one-page flyer, the standalone bundle, the editor pair, and the rendered PDFs — produced from the same manifest so the flyer and the site cannot disagree about which photo is the hero or what the price is.

generate_listing_site.py · build_standalone.py · _build_editable.py
8

Queue the email series

The four campaigns — New Listing Outreach, Showing Confirmed, Showing Follow-up, Open House Invite — rendered with merge fields already filled from the listing and the new site URL, and left as drafts. The pipeline never sends on its own.

listing_emails.py
9

Publish, sync, and gate

One command propagates to all eight places the content lives — canonical file, both Hosting sites, both editor copies, PDFs, bundle, derived flyer copy, short URLs, VERSION stamp — then runs the 52-check verification gate. Exit 0 is the evidence, not a clean upload.

sync_property.py --apply · verify_property.py
10

Hand back one review page

A single URL listing every artifact with a thumbnail, the copy for approval, and the four email drafts. Nothing is client-facing until the agent approves it there, and a short link is minted only on approval.

new — /package/<slug> review view

Crop ladder

One master frame, eight derivatives. Proposed sizes.


DestinationAspectPixelsFormatWeight
Site hero16:92400 × 1350WebP + JPEG≤ 320 KB
Site gallery3:21600 × 1067WebP + JPEG≤ 180 KB
Flyer — print4:3300 dpi at placed sizeJPEGno budget
Flyer — screen4:31200 × 900JPEG≤ 140 KB
Email header2:11200 × 600JPEG≤ 100 KB
Social feed1:11080 × 1080JPEG≤ 140 KB
Social vertical4:51080 × 1350JPEG≤ 160 KB
Video poster16:91280 × 720JPEG≤ 90 KB

What exists, what has to be built

Most of the back half is already running in production.


buildPackage ingest — ZIP / folder / share-link, mixed media sorted
buildServer-side auto-correct (the headless twin of Image Auto-Correct)
buildCrop ladder and derivative writer, one master to eight destinations
buildAsset manifest the site, flyer and emails all read from
buildReview-and-approve page, and the short link minted on approval
existsMLS fetch and address resolution by ListingId or free-text address
existsMultimodal AI copy grounded in the actual photos
existsProperty website generation, two house styles
existsFlyer generation and browser editing
existsStandalone bundle, editor pair, PDF rendering
existsFour-template email series with merge fields
existsEight-copy sync and the 52-check publish gate

Five new pieces, seven existing ones wired differently. The scope is the front half of the pipeline and the review page — not a rewrite of anything that works today.

Guardrails

The rules the pipeline inherits, and does not get to relax.


Phasing

Each phase ends at something demonstrable.


1

Phase 1 — the front half

Ingest, normalize, crop ladder, manifest. Ends when a drop from the studio produces a complete, correctly sized asset set and nothing downstream has changed yet.

2

Phase 2 — wire it through

Point the existing site, flyer and email generators at the manifest instead of MLS-hosted photos. Ends when one command turns a drop into a published site and flyer through the normal sync and gate.

3

Phase 3 — the review page

The single hand-back URL, drag-to-reorder, copy approval, email drafts, short link on approval. Ends when the agent’s whole involvement is: drop the folder, confirm the address, approve.

This is a specification, not a shipped feature. Nothing described here has been built yet; the existing tools it composes — site builder, flyer builder, image auto-correct, email series, sync and gate — are live today and are listed individually on the capability pages.
See the capability list →