humanai-web/README.md
oskar aedc0dd2b7 fix(i18n): dopisek roboczy na /platforma EN + known issues w README
workingName: "before launch" -> "before publication", zgodnie z ustaleniem.

README dostaje sekcję Known issues z odłożoną świadomie sprawą: og:* w
surowym HTML zostaje po polsku na trasach /en, bo index.html jest jednym
statycznym dokumentem dla każdej ścieżki. Scrapery Open Graph nie wykonują
JS, więc runtime'owa podmiana title/description ich nie dotyczy. Ten sam
rdzeń problemu dotyczy hreflang, który jest identyczny na każdej podstronie.
Fix dla obu to prerendering index.html per język.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 17:01:30 +02:00

1.9 KiB

humanAI — landing page

React + Vite static site, served by nginx in the humanai-landing Docker container, behind Nginx Proxy Manager on the nginxproxymanager_default network.

Development

npm install
npm run dev

Deploy

./deploy.sh

The script builds images locally, pushes them to piha.local via the piha Docker context, and runs smoke tests against the mailer endpoint.

Mailer

The mailer/ directory contains a standalone Express microservice that handles the contact form. It runs as humanai-mailer on the same Docker network as NPM so it can be proxied without exposing any port to the host.

Manual steps required before first deploy

(a) Create a Fastmail app-password and write credentials to mailer.env on the deploy machine:

# mailer.env  (never commit this file)
SMTP_USER=youruser@fastmail.com
SMTP_PASS=your-app-password

(b) In Nginx Proxy Manager → Proxy Host for gethumanai.pl → Custom Locations:

Field Value
location /api
scheme http
forward hostname humanai-mailer
port 3000

Known issues

Open Graph metadata is Polish on /en routes. index.html is a single static document served for every path (try_files … /index.html), so og:title, og:description and og:url are baked in Polish. App.tsx rewrites document.title and meta[name="description"] at runtime, which browsers and JS-executing crawlers honour — but Open Graph scrapers (Facebook, LinkedIn, Slack) read the raw HTML and will show Polish copy when an /en link is shared.

hreflang alternates are the same on every page. All routes advertise the same pl / en / x-default triple pointing at the two homepages, so /privacy claims the homepage as its alternate.

Both have one root cause and one fix: prerender a per-language index.html instead of serving one document for every route.