AIDA Labs · Library

AIDA Labs build standards

AIDA Labs · Library · Standard · Canonical v2, locked 4 October 2026

Every AIDA Labs site follows these rules.

Devices

  • Phones: iPhone 12 mini, 375 × 812 CSS px. Layouts switch to one column at 600 px and below. Three-box rows stack below 860 px.
  • Tablets: iPad mini, 744 × 1133 portrait and 1133 × 744 landscape. Two-column layouts stay two columns.
  • Before anything is published, every page is checked at 1440, 744, 1133 and 375 px wide:
    • no sideways scrolling
    • no clipped or overlapping text
    • no text spilling out of its box
    • no underlines inside button boxes
    • no script errors or missing files
    • nothing that only works on hover (a tap or the keyboard does the same thing)

Type and space

  • No text smaller than 14 px. Body text is 17 to 18 px.
  • Generous space, with content in cards or boxes rather than small text on empty pages.

Brand (canonical v1: "Paris dusk")

  • Theme: all page colours sit in the THEME block of shared/aidalabs-blue.css.
  • Background: #4A5E78 → #34445A. Cards #2B3A4E. Text #F3ECE4.
  • Accents: gold #D7AF59, light blue #7FA3C9, blue #49698C, navy #1F2A36.
  • Fonts: Georgia/Gelasio for headings, Calibri/Carlito for body text.
  • Fonts are self-hosted (Law 25, 11 October 2026): every site serves Gelasio, Fraunces, Work Sans and Source Sans 3 from its own /aida-fonts/ (source shared/aida-fonts/, SIL Open Font License). No page may load fonts.googleapis.com or fonts.gstatic.com: the build stops if one does (scripts/defont.py), and script 46 fixed the live sites.
  • Clickable boxes: the whole box is the button, with no underlines. They lift on hover and press on click. Details in AIDA Labs canonical design.

Delivery

  • Each deploy is a saved zsh script in scripts/. Mike runs every script himself.
  • Every deploy backs up the live folder first, tests nginx with automatic undo, and touches nothing outside its own site.
  • Every asset link carries a content version stamp, and every deploy checks that the live files match the Mac.
  • A preview is approved before anything goes live.
  • Sites that must look alike are deployed by one script (for example both blueprints with 14_update_blueprints.zsh), so they can't drift apart.
  • Copies of client sites are copies, not links. The original stays untouched as the backup.
  • Server config edits are made by small checked scripts that change only one named block. They stop without writing if the block isn't exactly as expected.
  • The library and toolbox are public (11 October 2026, no password). The library is a public edition: scripts/public_docs.py leaves out client documents and names, server addresses and paths, password files and internal service names, and the build stops if any survive. Script 48 scans again before publishing. The full documents stay in docs/ on the Mac.
  • No deploy installs a whole nginx file (11 October 2026). Scripts 08, 13, 20, 23 and 24 install only their own server blocks with scripts/server/nginx_merge_blocks.py; every other live block stays exactly as it is. 04 and 06 are retired. New scripts use nginx_merge_blocks.py or nginx_swap_block.py.
  • An approved version is locked: a read-only, checksummed copy goes in canonical/<date>_v<n>/. Changes after that make a new version.
  • Buttons and their text must keep a contrast of at least 4.5:1 (site buttons are 9:1 or better).
  • Every AIDA Labs product subdomain carries the AIDA LABS menu and the five site buttons; Sample Bank sites do not.
  • Client names never appear on product versions: product_names.py swaps them and the build stops if one survives.
  • Live data is read-only: each site may reach only named functions; everything else under /api/ returns 404. No person is ever named in a report.
  • Never share the same service name on a Docker network ("api" clash, 4 October 2026); give each data service its own name.
  • Passwords are sent to the server only as one-way hashes, never stored in scripts or documents.
  • Every live-data location includes the safety-net snippet (a server file); deploy scripts fail safe if it is missing.
  • Every data container uses restart unless-stopped; the Toronto watchdog checks them every minute.
  • Every script that changes the server must be safe to run twice (35 was not, and was fixed; 36 proves it).
  • nginx: never upload a whole site file. Swap one server block with scripts/server/nginx_swap_block.py, test with nginx -t, restore on failure. Copies of every live nginx file are in nginx/.
  • A site that copies another (jobs.aidalabs.ca, recruiters.aidalabs.ca) copies what is live, never the Mac files, and the deploy checks the copy file by file.
  • Commands with quotes go in a saved script; Mike pastes only zsh <path>.
  • Phone/tablet behaviour for the portal sites lives only in the shared AIDA mobile kit (aida-website-handoff/aida-mobile-kit/). Publish with 45_publish_aidalabs_sites.zsh.
  • Pictures are files, not base64 inside pages; content-named files can be cached for a year.
  • Videos (11 October 2026): every product page opens with its explainer video (captioned, no sound needed, poster until play, preload="none"). Videos are files served from the site, never embedded from another platform. Replace a video by copying the new .mp4 and poster into the site folders, rebuilding and publishing.
  • Menu order: the AIDA LABS menu lists Products first, then Company, then Client work.
  • Live pages newer than the Mac copies: a publish replaces a page only if the live copy is exactly the version the change was made to; otherwise it skips it and lists it, and the change is made on the server to the live page (scripts 53, 54, 56).

‹ Back to the library