Café Fausse knowledge map

Not the restaurant. MVP = official SRS freeze.

Stack

In plain English: This page is the architecture companion for the two public hostnames: the Knowledge map at knowledge.cafe.artof.link (GitHub Pages) and the restaurant app at cafe.artof.link (React + JSX, Flask, PostgreSQL). Pictures here show the same design on two deploy targets — local (dev) and MSAIE staging — not a florist essay, Path B, 14 hats, Kafka/BFF, or 3DX Lab. Grade floor stays official FR-1..FR-18 / NFR-1..NFR-9; this companion cites those IDs only when a row links the freeze. The official SRS PDF is the source of truth; docs/srs.md is the working freeze. It does not invent FR-19 or NFR-10. If this page and the freeze disagree, the freeze wins.

  1. This knowledge map at knowledge.cafe.artof.link — GitHub Pages. Explains the project. Does not take reservations.
  2. The restaurant app at cafe.artof.link — React + Flask + PostgreSQL. Weekend Lightsail staging (#57), not forever production. Permanent hosting is still Future #22.

They do not share a load balancer. GitHub only. Short labels: Glossary.

flowchart TB
  Map["This map — GitHub Pages
knowledge.cafe.artof.link"] App["Restaurant — weekend staging #57
cafe.artof.link"] Later["Not yet — Future #22
Permanent hosting"] Map --> App App -.-> Later

Two hostnames, two jobs. This map does not take reservations.

Probe date: 2026-09-05 Europe/Berlin (this session) for hostname rows. Journey / NFR evidence stays the 2026-09-02 records on Coverage.

Two hostnames

HostnameJobThis session
knowledge.cafe.artof.linkThis knowledge mapHTTPS GET 200. HTTP 301 to HTTPS. TLS VERIFY_OK. CN/SAN match. Let’s Encrypt, expires 2026-11-30. Pages cname matches. https_enforced=true. Cert approved.
cafe.artof.linkPrefer live share this session (Lightsail staging)HTTPS GET 200 (SPA + /operator + /api/health). TLS CN/SAN cafe.artof.link. DNS A <STAGING_IP>. #57 weekend window — not production forever. Longer-term hosting stays #22.

They do not share a load balancer. This site is not the shop.

Knowledge surface — Café Fausse Knowledge

Allowlisted markdown under knowledge/ is built to static HTML (knowledge/build.py) and published as GitHub Pages (workflow .github/workflows/knowledge-site.yml). There is no CMS. No GitLab Pages.

Implementation surface — Café Fausse App

Local (dev) vs AWS MSAIE staging

On camera: say cafe.artof.link is the staging environment for the MSAIE project (temporary — not production forever). Full architect table + why/how questions: Local vs AWS. Lightsail / Caddy / Route53 names stay on this page — not in NATURAL spoken lines.

Same design, two deploy targets. React + JSX → Flask → PostgreSQL. Fail-closed without a database. Newsletter is store-only (do not claim outbound SES).

Local (dev)AWS MSAIE staging
What was usedClone on cts-ai at C:\projects\code\aea-interactive-designDeployed staging at cafe.artof.link — MSAIE project staging
ExplanationCoding, iteration, and CI-adjacent work without touching the shared demoShared public HTTPS host graders (and the team) can open; same product surface Meghna walks
RationaleFast local iterateProve the same stack on a public HTTPS host; one URL for the talk
ImplementationVite + Flask + local PostgresCaddy (TLS) → Flask → on-box Postgres (MSAIE staging) (host tip 73d202d; not a shared RDS)

Talk spine pointer: Part 2 UX/business · Part 3 architecture why/how · Part 4 coding why/how · Part 5 honesty. See Parts 3–5 materials. Architect visuals: Part 3 HLD + Meghna FE/BE · Part 4 coding overview. Developer inventory (API / schema / FE/BE): Developer system map.

Same usecase, three depths: Part 2 UX = frontend view (what Meghna shows) · Part 3 Architecture = view behind it (HLDs + FE/BE flow) · Part 4 Coding = how it is actually implemented (forms/functions/FE/BE/API/DB).

Architect dual-env HLD (behind the UX)

On camera: cafe.artof.link is MSAIE staging (temporary — not production forever). Same design, two deploy targets. Notes: Part 3 HLD + flow. Older as-is / AWS staging SVGs stay below as history / probe archive.

PROTOTYPE visuals — not Quantic submit.

Local (dev) — Vite / Flask / local Postgres on cts-ai. Coding and iteration. Not the shared demo URL.

Local setup (dev): Vite React frontend, Flask API with key routes, local PostgreSQL, shared freeze.json. Fail-closed without DB. Not the shared demo URL.

Fallback raster: hld-local-720.png.

MSAIE staging — browser → DNS/TLS → Flask + built SPA → on-box Postgres (MSAIE staging) — not a shared RDS. Knowledge Pages is a separate hostname. Newsletter store-only.

MSAIE staging at cafe.artof.link: Knowledge Pages separate; browser to DNS/TLS to Flask+SPA to on-box Postgres. ELB wildcard out of cut. Newsletter store-only.

Fallback raster: hld-aws-msaie-720.png.

Meghna FE↔BE flow (behind the UX)

What Meghna clicks vs what hits Flask. Home / Gallery / Menu read the freeze at build — not GET /api/menu. Booking = GET /api/slots?date= then POST /api/reservations. Newsletter optional POST /api/newsletter store-only. Notes: Part 3 HLD + flow.

Meghna demo path: Home Gallery Menu from freeze at build (no /api/menu). Reservations GET /api/slots then POST /api/reservations. Newsletter optional POST /api/newsletter store-only.

Fallback raster: flow-part2-fe-be-720.png.

Part 4 coding overview (implementation of that flow)

Forms · functions · frontend · backend · API · DB. Static pages import freeze.json; booking goes through slots + reservations; newsletter is store-only. Notes: Part 4 coding overview. Plain English: freeze.json (why / how / scope).

Part 4 coding overview: Home Menu Gallery About import freeze.json (not /api/menu). Reservations form GET /api/slots then POST /api/reservations to Postgres. NewsletterForm POST /api/newsletter store-only. Backend modules under Flask. Fail-closed without DB.

Fallback raster: flow-coding-overview-720.png.

AWS staging facts (this weekend)

Owner-probed implementation, not a second product. This session this agent also GET 200 on https://cafe.artof.link/ (~0.04s), /operator 200, /api/health 200 {"ok":true}; DNS A <STAGING_IP>; TLS CN/SAN cafe.artof.link, Let’s Encrypt notAfter=2026-12-04.

FactStatus
Lightsailcafe-fausse-staging, us-east-1, small_3_0 (~$12/mo), IP <STAGING_IP>
DNSRoute53 cafe.artof.link A → that IP, TTL 60. Overrides the *.artof.link ELB wildcard. That wildcard is not Café Fausse.
EdgeCaddy + Let’s Encrypt HTTPS
AppFlask + built React SPA on the instance
DatabaseOn-box Postgres (MSAIE staging) on the Lightsail instance — not a shared RDS.
Prefer sharehttps://cafe.artof.link/ (+ /operator, /api/health)
Interim backuphttps://<STAGING_IP_DASHED>.sslip.io/ (same IP; not the primary paste)
Stale tunnelsshaky-deer-drive.loca.lt, happy-glasses-film, real-goats-shop
IAMcts account <AWS_ACCOUNT_ID>
WindowStaging stays up until Quantic scoring is done, or the owner overrides tear-down (owner lock 2026-09-09). Knowledge Pages stay up the same window. Whether Quantic graders need the host up for video evaluation remains Unknown until the owner shares correspondence (#57).
/operatorRead-only recording helper. Not FR-19. Not an admin console.
NewsletterStore/register FR-15 / FR-16 only. No outbound mailer in the SRS MVP.
Permanent hostingStill Future #22. #57 does not close it.

History / probe archive (prefer hld-aws-msaie for the architect cut): AWS staging SVG.

Café Fausse AWS staging (history / probe archive): Knowledge Pages, Route53 A to Lightsail, Caddy, Flask+SPA, on-box Postgres; ELB wildcard out of cut

As-is HLD (history / probe archive)

What is true now: knowledge Pages is live; prefer https://cafe.artof.link/ as the weekend Lightsail staging share (#57) — not production forever; the restaurant code still lives on main (local Vite / Flask / cafe-pg).

flowchart TB
  subgraph K["Café Fausse Knowledge — live this session"]
    MD["knowledge/*.md"] --> PY["knowledge/build.py"]
    PY --> GHA["GitHub Actions → GitHub Pages"]
    GHA --> KH["knowledge.cafe.artof.link"]
  end
  KH -.-> P["HTTPS GET 200 · HTTP 301 to HTTPS"]
  subgraph N["Staging share this session — not production forever"]
    CAFE["cafe.artof.link"] --> R53["Route53 A TTL 60 → STAGING_IP"]
    R53 --> CADDY["Caddy + Let's Encrypt"]
    CADDY --> APP["Flask + built React SPA"]
    APP --> BOXPG["PostgreSQL on the instance"]
  end
  subgraph L["Local MVP on main"]
    VITE["Vite :5173"] --> FLASK["Flask :5000"]
    FLASK --> PG["cafe-pg PostgreSQL"]
  end

Static copy (renders if Mermaid JS is blocked): as-is SVG — history / probe archive. Prefer local HLD + MSAIE staging HLD for the architect cut. Same probe facts in more detail: AWS staging SVG (also archive).

Café Fausse as-is (history / probe archive): knowledge Pages live, cafe.artof.link is weekend Lightsail staging, local Vite/Flask/Postgres still on main

To-be HLD (permanent vs staging keep-up)

Knowledge stays GitHub Pages. Weekend staging is live this session and stays up until Quantic scoring is done, or the owner overrides tear-down (owner lock 2026-09-09). Knowledge Pages stay up the same window. Whether Quantic graders need the host up for video evaluation remains Unknown until the owner shares correspondence. Permanent restaurant hosting remains Future #22 and stays dashed.

flowchart LR
  subgraph K2["Knowledge — already published"]
    PAGES["GitHub Pages"] --> KH2["knowledge.cafe.artof.link"]
  end
  subgraph S["Weekend staging — kept until Quantic scoring"]
    B["Browser"] --> HOST["cafe.artof.link Lightsail #57"]
    HOST --> RE["React SPA"]
    RE --> API["Flask"]
    API --> DB["Postgres on the instance"]
  end
  subgraph R["Permanent hosting — still Future #22"]
    HOST -.-> FUT["Dashed on purpose · not production forever"]
  end

Static copy: to-be SVG.

Café Fausse to-be: knowledge Pages plus weekend staging vs dashed permanent hosting

CI/CD (this repo)

Archify (Documented)

Same-origin Archify HTML under `/archify/` after Pages deploy. Documented aid — not Live. Thin Knowledge Pages ratchet map (freeze → PR → MRC COMMENT → New Bot → probe). Source: `knowledge/archify/`. Companion wording on Honesty.

Honesty