AIDA Labs: site map, server layout and scripts
AIDA Labs · Library · Reference · Canonical v2, locked 4 October 2026
Server and data
- AIDA Labs Quebec (OVH VPS, nginx 1.28 on Ubuntu) serves every site. Run by OVHcloud's Canadian company, Hébergement OVH Inc., Beauharnois QC.
- DNS and HTTPS: Cloudflare, all records proxied, Flexible SSL (sites listen on port 80). Removing Cloudflare (Let's Encrypt + WireGuard) is a later step.
- Caching: every asset link carries
?v=<content hash>; pages sendCache-Control: no-cache. - Deploy access: Mike runs saved zsh scripts on AIDA Labs Toronto with the deploy key. AI never reaches the servers, Docker, databases or crontab.
Sites
| Address | Server folder | nginx file | Source on Mac | Palette | Notes |
|---|---|---|---|---|---|
| aidalabs.ca, www | root-portal | aidalabs-production | aidalabs.ca/ | Paris dusk | Home: section menu, See it working (4 panels), Proudly Canadian, guardrails, founder; /about, /how-we-build, /aida-portal (section menu, Live job data), /blueprint |
| consulting.aidalabs.ca | consulting | aidalabs | consulting.aidalabs.ca/ | Paris dusk | Consulting and Professional Services, 9-section menu, 21 detail pop-ups |
| products.aidalabs.ca | products | aidalabs | products.aidalabs.ca/ | Paris dusk | Card deck, 6 products, fits one screen |
| projects.aidalabs.ca | projects | aidalabs | projects.aidalabs.ca/ | Paris dawn | Project Plans and Blueprints: the Sample Bank plan on the page |
| hub.aidalabs.ca | hub | aidalabs | hub.aidalabs.ca/ | Paris morning | Sample Bank Intelligence Hub, live (product db), no notice screen |
| blueprint.aidalabs.ca | blueprint | aidalabs | blueprint.aidalabs.ca/ | Paris night | Sample Bank Project Blueprint, live |
| portal.aidalabs.ca | portal | aidalabs | portal.aidalabs.ca/ | Paris morning | Sample Bank portal + installable app (café icon) |
| database.aidalabs.ca | database | aidalabs | database.aidalabs.ca/ | Paris morning | Database Analytics and Insights (product db) |
| jobs-data.aidalabs.ca | jobs-data | aidalabs | jobs-data.aidalabs.ca/ | Paris dusk | Live, read-only job-market data |
| jobs.aidalabs.ca | jobs | aidalabs | jobs.aidalabs.ca/ (nginx block); kit in aida-website-handoff/aida-mobile-kit/ | AIDA Job Search | Copy of aida-job-search.ca + AIDA mobile kit + 3D trading cards; pictures as cached files (2026-10-11); script 45 |
| recruiters.aidalabs.ca | recruiters | aidalabs | recruiters.aidalabs.ca/ (nginx block) | Recruiter Services | Copy of recruiter.aida-job-search.ca + sign-in pages; pictures as cached files (2026-10-11); script 45 |
| toolbox.aidalabs.ca | toolbox | aidalabs | toolbox.aidalabs.ca/ | Paris dusk | Canonical components. No password (Mike, 11 October 2026): kept obscure instead, not indexed and not linked |
| library.aidalabs.ca | library | aidalabs | library.aidalabs.ca/ | Paris dusk | These documents. No password (Mike, 11 October 2026; script 47): kept obscure instead, not indexed and not linked |
Every AIDA Labs product subdomain (not the Sample Bank ones) has the AIDA LABS menu top left in its own palette, and the same five buttons top right, 124 × 40 px: Portal · Projects · Hub · Get the app (café icon) · AIDA LABS. Main-header pages have breadcrumbs.
nginx files
| File | Covers |
|---|---|
| aidalabs | consulting, products, projects, hub, blueprint, portal, database, jobs-data, jobs, recruiters, toolbox, library (a folder on the Mac) |
Rule (2026-10-10): never upload a whole nginx file. Deploys swap one server block with scripts/server/nginx_swap_block.py, show the diff, run nginx -t and restore the old file on failure. (A stale whole-file upload briefly dropped several sites that day.)
Later: move the remaining Sample Bank blocks into the client-sites nginx file, aidalabs.ca into aidalabs, add a 00-default block.
Folders on AIDA Labs Toronto (a folder on the Mac)
Scripts (a folder on the Mac, copy on Quebec in a server file)
| Script | What it does | Changes |
|---|---|---|
| 01–14 | Sources, first deploys, library/toolbox (08), Sample Bank hub and blueprint set-up, 14_update_blueprints | see v1 |
| 18_fetch_intelligence | Attempted download (no network on Mac shell) | No |
| 21_create_product_db | Product database + API (Sample Bank) | Toronto Docker |
| 22_describe_job_db | Structure of the job database (no rows) | No |
| 23_deploy_product_sites | hub, blueprint, portal, database + nginx aidalabs | Quebec |
| 24_deploy_main_and_consulting | aidalabs.ca, consulting, products, projects, jobs-data | Quebec |
| 25_check_aidalabs_live | Read-only live check of aidalabs.ca | No |
| 26_screenshot_portals | Headless Chrome screenshots of the portals | No |
| 27_jobs_data_api | jobs_api functions + aidalabs_jobs_api container | Toronto db + Docker |
| 28_check_live_data | Read-only check of every live-data path | No |
| 32_lock_canonical_v2 | Library deploy check, scripts copied to Quebec, canonical v2 snapshots on both machines | Both |
| 33_fix_api_name_clash | Jobs service renamed so only the Sample Bank service answers to "api"; 30-request test | Toronto Docker |
| 35_rock_solid | Safety net on Quebec (last good API answer kept 60 days, served if Toronto fails), watchdog on Toronto (launchd, every minute), restart-always, warm-up, 20-request test. Safe to re-run | Both |
| 36_repair_nginx | Repairs/normalises the safety-net lines and storage definition; tests, reloads, checks every site. Safe to re-run | Quebec nginx |
| 38_check_aidalabs_nginx | Read-only: which nginx file answers each address; live file vs Mac copy | No |
| 39_check_toolbox_library_live | Read-only: toolbox and library blocks, password files, webroots | No |
| 41_update_recruiter_original | recruiter.aida-job-search.ca: portal fix, phone/tablet layer, sign-in on the subdomain (2026-10-10) | Quebec |
| 42_cleanup_stale_nginx | Copies every live nginx file to nginx/; deleted stale backups and uploads (2026-10-10) | Quebec |
| 43_check_recruiter_live | Read-only: recruiter site files, sign-in pages, portal script | No |
| 45_publish_aidalabs_sites (replaced 37, 40 and 44, deleted 2026-10-11) | One step: recruiter (publish_recruiters.sh), jobs, recruiters (copies via server/build_site_copy.py), library (rebuild + publish). Each changed site backed up (two newest kept); unchanged sites left alone; only the two copy nginx blocks, only if they differ. Name sites to do fewer. Safe to re-run | Quebec |
| 49_publish_projects_page | projects.aidalabs.ca only: "See it in the Project Blueprint" opens blueprint.aidalabs.ca, not the Sample Bank copy (2026-10-11) | Quebec |
| 50_publish_videos | Explainer videos on aidalabs.ca, products.aidalabs.ca (Watch links + player window), aida-job-search.ca, recruiter.aida-job-search.ca; uploads videos/ folders; checks each live page is the expected version first; then script 45 (jobs, recruiters) (2026-10-11) | Quebec |
| 51_publish_home_video_top | Superseded by 52 before it ran -- do not run | — |
| 52_publish_menu_and_video_top | Video first on aidalabs.ca, aida-job-search.ca, recruiter.aida-job-search.ca; "Products" first in the AIDA LABS menu on every page whose live copy matches the Mac (manifest in backups/); then script 45 (jobs, recruiters, library). Skips, never overwrites, a page that differs (2026-10-11) | Quebec |
| 53_menu_order_on_live | Same menu reorder done on the server, on the live hub, blueprint, portal and toolbox pages (they were newer than the Mac copies) (2026-10-11) | Quebec |
| 54_publish_menu_page_videos | Explainer video on the pages the menu opens (portal, projects, blueprint, hub, /aida-portal, /about, consulting), added on the server to each live page with menu_videos.py; all or nothing (2026-10-11) | Quebec |
| 55_check_hub_video | Read-only: which folder serves hub.aidalabs.ca and whether its page has the video | No |
| 56_publish_hub_video_top | hub.aidalabs.ca: video first, like the other pages (replaced the 54 button) (2026-10-11) | Quebec |
| menu_order.py | AIDA LABS menu: Products, then Company, then Client work. Used by build_from_consulting.py on every page it writes (not Sample Bank) and by 52/53 on built or live pages | — |
| menu_videos.py | The explainer video blocks for the menu pages (one rule per page, anchor + block). Used by build_from_consulting.py (write) and by 54/56 on the live pages; the build stops if a menu page ends up without its video | — |
| server/build_site_copy.py | Builds one copy: pictures to /aida-media (content-named, cached a year), kit on chosen pages, proof that every change undoes to the live file byte for byte | — |
| server/nginx_swap_block.py | Replaces exactly one server block in an nginx file (used by 37, 40, 41 and publish_toolbox) | — |
| build_from_consulting.py | Builds every site (Mac only); product_names.py swaps client names | No |
AIDA portal sites (2026-10-11): after changing the kit, the recruiter generator, the job-seeker site or the docs, run a folder on the Mac (or name only recruiter, jobs, recruiters, library).
Explainer videos (2026-10-11): six captioned videos, no voice, in a folder on the Mac (sources, posters, template/ to make more). Site copies: shared/videos/ (built into aidalabs.ca/videos and products.aidalabs.ca/videos; every other AIDA Labs page plays them from products.aidalabs.ca), aida-website-handoff/videos/ (aida-job-search.ca/videos) and recruiters-site/videos/ (recruiter.aida-job-search.ca/videos). Where they show: first thing on aidalabs.ca, aida-job-search.ca, recruiter.aida-job-search.ca and every page the AIDA LABS menu opens (portal, projects, blueprint, hub, /aida-portal, /about, consulting); "Watch" links on products.aidalabs.ca. No video for database.aidalabs.ca (Mike's call). To replace a video: render it, copy the .mp4 and -poster.jpg into those folders, rebuild, publish.
AIDA LABS menu order (2026-10-11): Products, then Company, then Client work, on every AIDA Labs page (scripts/menu_order.py). Sample Bank sites unchanged.
Normal update: edit → python3 scripts/build_from_consulting.py (run inside 17/23/24) → preview → run 17 (Sample Bank), 23 (products), 24 (main sites).
Brand and standards
Palettes, components and rules: AIDA Labs canonical design and AIDA Labs build standards (v2).