# Maine operator microsites (Skynet Flow five-operator story)

Static, guest-facing sites in the same spirit as **`briarwood-motor-inn-site/`** (no embedded Forge console; optional `operatorConsoleUrl` link only).

**Operator how-to (narration + demo + Danni discovery questions):** [`danni-skynet-flow-howto.html`](danni-skynet-flow-howto.html) — linked from the hub [`index.html`](index.html).

Each folder includes:

- `SITE_RESEARCH.md` — paste official URLs, hours, and facts scraped from **live Facebook / website** (keep updated).
- `docs/UAIR_FORGE_DESIGN_SELF_IMPROVE.md` — run **UAIR-Forge** with `--working-dir` set to that folder for layout, a11y, and copy checks.

| Folder | Business | Notes |
|--------|-----------|--------|
| `../briarwood-motor-inn-site` | Briarwood Motor Inn | Canonical Lincoln lodging site (existing). |
| `why-not-stop-site` | Why Not Stop (convenience / fuel) | Facebook + [whynotstopdeli.org](https://www.whynotstopdeli.org/). |
| `why-not-stop-deli-site` | Why Not Stop Deli / Krispy Krunch | Primary CTA [whynotstopdeli.org](https://www.whynotstopdeli.org/) + Facebook. |
| `high-street-market-site` | High Street Market | [high-street-market.com](https://high-street-market.com/) + Facebook. |
| `danni-express-mart-site` | Dani's Express Mart | [Facebook / Dani's Express Mart](https://www.facebook.com/people/Danis-Express-Mart/61577333265805/). Pickup demo: ~600 SKUs from `js/danis_sku_input.cjs` — rebuild `js/danis-pickup-sku-catalog.js` with `node scripts/bake-danis-pickup-catalog.cjs` from that folder. |
| `pats-pizza-site` | Pat's Pizza Lincoln | New concept site for online pickup ordering, fast menu changes, ingredient/vendor order management, Sam's Club / US Foods / Sysco / local supplier lanes, and Clover bridge while the Clover contract remains active. |

Skynet Flow (Forge) technical docs remain in **`sqv-forge/README.md`** — not duplicated on these marketing pages.

## UAIR-Forge self-improve (L0)

If `uair-forge` is not on `PATH`, use the release binary from the monorepo:

```bash
export UAIR_FORGE_WORKSPACE=/home/johnharris/workspace
UF=/home/johnharris/workspace/skynet-idp-refactorx/refactorx3/consolidatedRepo/uair-forge-cli/target/release/uair-forge
"$UF" self-improve readiness --working-dir /home/johnharris/workspace/maine-skynet-flow-operator-sites/high-street-market-site \
  --preset node_check_js --append-verdict
```

Readiness lines append to `/home/johnharris/workspace/.uair-forge/self-improve/readiness_reports.jsonl` (workspace root store).

## Production on sqv.ai

When the corporate stack runs with **`refactorx3/apps/sqv-website`** Docker Compose, nginx serves this directory at:

**https://sqv.ai/maine-skynet-flow-operator-sites/**

- Hub: [`index.html`](index.html) (lists all operator folders, including **Briarwood Motor Inn** at `briarwood-motor-inn-site/`).  
- Secure intake shell: **https://sqv.ai/maine-skynet-flow-operator-sites/secure-intake/** renders the blank business/municipal onboarding form. Saving uses the authenticated `sqv-website` backend endpoint `/api/skynet-secure-intake/submissions`; filled submissions must stay outside this public static folder. Set `SKYNET_SECURE_INTAKE_SUBMISSIONS_DIR` on the web app host if the secure storage directory differs from `/home/johnharris/workspace/skynet-secure-intake/submissions`.
- Briarwood: **https://sqv.ai/maine-skynet-flow-operator-sites/briarwood-motor-inn-site/** (source lives in sibling repo `../briarwood-motor-inn-site` next to this checkout; merged on deploy by `skynet-idp-refactorx/scripts/ovh-rsync-maine-operator-sites.sh`).  
- Dani’s: **https://sqv.ai/maine-skynet-flow-operator-sites/danni-express-mart-site/**
- Pat's Pizza: **https://sqv.ai/maine-skynet-flow-operator-sites/pats-pizza-site/**

For local `file://` preview of the hub with Briarwood, create a symlink once: `ln -sfn ../briarwood-motor-inn-site briarwood-motor-inn-site` from this repo root (not committed).

Compose mounts the workspace folder by default (`MAINE_OPERATOR_SITES_DIR` in `docker-compose.yml`). On a host where the repo layout differs, set `MAINE_OPERATOR_SITES_DIR` to an absolute path to this directory before `docker compose up`.

Alternatively, from `apps/sqv-website` run **`./scripts/sync-maine-operator-sites-public.sh`** to rsync into `public/maine-skynet-flow-operator-sites/` (ignored in git — ship via CI step or commit if you prefer a frozen snapshot).

### OVH host (Caddy on `sqv.ai`, not Docker nginx)

If production uses **systemd Caddy** on the OVH VPS (`refactorx3/Caddyfile.production.ovh`), static files must live at **`/var/www/maine-skynet-flow-operator-sites/`** on that host, and the Caddyfile must **`handle`** that path **before** the Remix SPA `try_files {path} /index.html` catch-all.

From **`skynet-idp-refactorx`** (SSH key at `./ovhcloud` by default):

```bash
export OVH_HOST=ns1025473.ip-15-204-107.us
./scripts/ovh-rsync-maine-operator-sites.sh
./scripts/ovh-push-caddyfile-production-ovh.sh
```

Set `MAINE_OPERATOR_SITES_DIR` if this repo is not a sibling of `skynet-idp-refactorx`. For SSH, `ovh-rsync-maine-operator-sites.sh` uses `OVHCLOUD_KEY` if set; otherwise `skynet-idp-refactorx/ovhcloud`, else `~/.ssh/ovh_ns1025473`, else `~/.ssh/ovhcloud`. Override `OVHCLOUD_KEY` when your key lives elsewhere.

**Caching:** Caddy (OVH) and nginx (Compose) send **`Cache-Control: public, max-age=31536000, immutable`** for images, video, audio, fonts, and PDFs under this path, and a **short TTL + `stale-while-revalidate`** for HTML, CSS, and JS so copy and `site-data.js` updates still land without renaming assets. After replacing a binary with the same filename, bump deploy or use a query-string cache-bust if needed.

## Git push (this folder is its own repo)

This directory is a **standalone git repository** so you can push operator HTML without the full monorepo.

```bash
cd /path/to/maine-skynet-flow-operator-sites
git remote add origin <YOUR_GIT_URL>   # e.g. git@gitlab.com:sqv/maine-skynet-flow-operator-sites.git
git push -u origin main
```

On the **sqv.ai** host, clone or pull that repo to the path referenced by **`MAINE_OPERATOR_SITES_DIR`** (or the default sibling of `skynet-idp-refactorx`), then reload nginx / `docker compose up -d nginx`.

## Mirroring Facebook highlights (photos / posts / video thumbs)

Dani’s site lists concrete Facebook photo and post URLs. To **download copies** into `danni-express-mart-site/assets/facebook-mirror/` and refresh the JPEG thumbnails the cards use, see **`scripts/README-FACEBOOK-MIRROR.md`** and run:

```bash
./scripts/download-facebook-assets.sh --cookies-from-browser firefox
```

There is no supported way to mirror an **entire** Facebook page or photo tab from this static repo alone; add URLs you care about to **`scripts/facebook-mirror.manifest`** (or use `./scripts/extract-facebook-urls.py --yt-dlp` for hints).

**Without Facebook login**, use **`./scripts/materialize-offline-facebook-thumbs.sh`** to build highlight JPEGs from committed `danni-express-mart-site/assets/` art (not Meta’s CDN files).
