← back to Stars of Design

docs/PLAN.md

99 lines

# StarsOfDesign — IMDb-Pro-class interior-designer directory

## Why
Steve has thousands of designer-flavored Gmail threads + 26 hand-curated
editorial profiles already in `data/designers.json`. Goal: stand the
broad directory on top — pulled from Steve's inbox + LinkedIn + public
trade rosters — with a **paid premium tier** modeled on IMDb Pro.

## Hard rules
1. **NEVER copy headshots without permission.** Default to `/img/made-with-ai.svg`. Real photos come from: (a) the claim flow upload, (b) Wikimedia Commons CC, (c) explicit press-kit grant.
2. **LinkedIn data via public Google search only.** No scraping LinkedIn itself (TOS). Store `linkedin.com/in/<slug>` URLs as references; never crawl the platform.
3. **Reply-thread signal only for candidate auto-promotion.** A name showing up in Steve's *reply* threads is a real contact. Newsletter-only addresses stay in `sod_email_candidates` until a human / LLM triages.
4. No email, DNS, destructive ops during the YOLO loop. Reversible per tick.

## Data sources (priority order)

| Source | Auth | Why |
|---|---|---|
| Steve's Gmail (steveabramsdesigns@gmail.com) | claude.ai Gmail MCP | reply threads = real contacts |
| info@designerwallcoverings.com | George agent (Mac2 :9850) | the canonical business inbox; currently 404, needs revival |
| ASID public directory | scrape | ~25k members, public listing |
| IIDA member directory | scrape | designer firms |
| AIA member directory | scrape | residential architects |
| LinkedIn (public search via Google CSE) | google CSE key in secrets | resolve `linkedin.com/in/` URLs per designer name + firm |
| Houzz Pro public | scrape | ~3M pro listings with portfolios |
| Pinterest public boards | embed only | aesthetic signature visualization |
| Existing data/designers.json | local | 26 editorial historic spine (Dorothy Draper, Sister Parish, Hadley, etc.) |

## Schema (in dw_unified, namespaced sod_*)
- `sod_designers` — individual person (name, email, city, role, bio, premium tier, made-with-ai or real headshot)
- `sod_firms` — design firm/studio entity
- `sod_designer_firm` — many-to-many history (designer X was Principal at firm Y 2018-2023)
- `sod_links` — every social/portfolio URL per designer/firm (LinkedIn, IG, Houzz, etc.) — collapsed-chip area on the profile page reads from this
- `sod_projects` — portfolio pieces (residential / hospitality / commercial / showhouse)
- `sod_email_candidates` — Gmail-extracted raw candidates BEFORE triage
- `sod_ingest_runs` — audit log per ingest job

## Premium upgrade tier (IMDb Pro analog)

**Free / basic** (anyone shows up here once we find them):
- Name, primary firm, city, role
- 1 LinkedIn link (if found via Google), no contact form
- Made-with-AI headshot placeholder, no portfolio gallery
- "Claim this profile" CTA

**Verified** ($9.99/mo or $99/yr — claimed + email-verified):
- Real headshot upload, real firm logo
- Custom bio, signature line, styles tags
- Contact form (we proxy email)
- Up to 6 portfolio entries
- Verified badge

**Flagship** ($29.99/mo or $299/yr):
- Unlimited portfolio entries with project case studies
- Press / award timeline
- Calendar booking link integration
- Featured rotation in city/style searches
- Newsletter-blast inclusion (when Steve runs them)

Stripe checkout already wired in big-red and other DW projects — reuse `STRIPE_SECRET_KEY` from secrets-manager.

## Profile page UX

**Top**: headshot + name + city + primary firm + "claim/edit" CTA
**Collapsed-chip area** (per Steve's spec) — folds open on click:
  - **Firm info** chip: name, city, website, founded year, size band
  - **Links** chip: LinkedIn, Instagram, Houzz, personal site, press articles — pulled from `sod_links`
  - **Past firms** chip: each prior firm with title + years
**Body**: bio, signature line, style tags
**Below the fold**: portfolio gallery (premium) OR claim CTA (basic)

## Tick plan

- **Tick 0 (this tick)** — PG schema, AI placeholder image, plan doc, Gmail ingest scaffold. Run a small recon to validate Gmail access works. **EXTENDS** the existing 26-designer editorial scaffold (don't replace it).
- **Tick 1** — Gmail bulk ingest: walk Steve's reply threads from last 5 years, populate `sod_email_candidates` with sender email + display name + signal_score. Target 1000-2000 unique candidates.
- **Tick 2** — LLM (Ollama qwen3:14b) triage on candidates → classify as `is_designer / is_firm / is_vendor / is_press / is_noise`. Promote yes-designers to `sod_designers`.
- **Tick 3** — Signature-block parser: extract role + city + firm name from each candidate's last seen signature.
- **Tick 4** — LinkedIn resolver: for each `sod_designers` row, hit Google CSE `site:linkedin.com/in "<name>" "<city>"` and store first result in `sod_links`.
- **Tick 5** — Firm matcher: extract unique firm names from designers, dedupe, populate `sod_firms`.
- **Tick 6** — ASID public directory scrape: ~25k members, populate as additional sod_designers (source='asid-public').
- **Tick 7** — IIDA public scrape.
- **Tick 8** — Houzz Pro public scrape.
- **Tick 9** — Profile page rebuild — render `/designer/:slug` with collapsed-chip layout (firm info / links / past firms).
- **Tick 10** — Claim flow: email verification, Stripe checkout, premium_extras editor.
- **Tick 11** — info@ Gmail ingest (once George is revived).

## Ports + processes
- `:9928` — starsofdesign (Mac2 dev, existing)
- prod: starsofdesign.com on Kamatera, nginx vhost ready, TLS pending DNS flip

## Files
- `server.js` — Express + EJS, the existing editorial-list scaffold (kept)
- `routes/public.js` — JSON-backed editorial list (kept)
- `data/designers.json` — 26 editorial seed entries (kept)
- `data/schema-pg.sql` — sod_* tables (new)
- `public/img/made-with-ai.svg` — universal placeholder (new)
- `scrapers/` — Gmail / LinkedIn / ASID ingest scripts (added per tick)
- `docs/PLAN.md` — this file