2026-06-02 17:24:37 +02:00
# humanAI landing page
Static bilingual landing page for **humanAI** (gethumanai.com).
Stack: Astro 6, static output, i18n PL (default `/` ) + EN (`/en/`), nginx in Docker.
---
## Local development
```sh
# Host: SATURN
npm install
npm run dev # dev server at http://localhost:4321
npm run build # build to ./dist/
npm run preview # preview built site at http://localhost:4321
```
## Docker local test
```sh
# Host: SATURN
2026-06-02 22:46:23 +02:00
# Create the network if it doesn't exist locally
docker network create npm_default 2>/dev/null || true
2026-06-02 17:24:37 +02:00
docker compose up --build
2026-06-02 22:46:23 +02:00
# site at http://localhost:8080
2026-06-02 17:24:37 +02:00
```
## Deploy to VPS
```sh
# Host: SATURN
./deploy.sh
```
The script:
1. Commits any pending changes and pushes to Forgejo (`oskar/gethumanai-landing`).
2026-06-02 22:46:23 +02:00
2. SSH-es to `ubuntu-4gb-hel1-1` , clones/pulls to `~/gethumanai-landing` , runs `docker compose up -d --build` .
3. Smoke-tests via `localhost:8080` — checks PL `/` , EN `/en/` , hreflang, mailto, EN conservative note, and HTTP headers. Exits non-zero with docker logs on any failure.
2026-06-02 17:24:37 +02:00
2026-06-02 22:46:23 +02:00
Container is on the `npm_default` external Docker network. In **Nginx Proxy Manager** add:
- Domain: `gethumanai.com` (+ `www` )
- Forward: `http://humanai-landing:80`
- SSL: Let's Encrypt
2026-06-02 17:24:37 +02:00
2026-06-02 22:46:23 +02:00
## Infrastructure
| Thing | Value |
|---|---|
| VPS host | `ubuntu-4gb-hel1-1` (Hetzner) |
| Container name | `humanai-landing` |
| Host port | `8080 → 80` |
| Docker network | `npm_default` (external, shared with NPM) |
| Git remote | `ssh://git@100.108.208.3:222/oskar/gethumanai-landing.git` |
| Deploy dir on VPS | `~/gethumanai-landing` |
## Project structure
2026-06-02 17:24:37 +02:00
```
src/
i18n/
2026-06-02 22:46:23 +02:00
pl.json # all Polish copy + slogans
en.json # all English copy + slogans
index.ts # t(locale) helper, getLangFromUrl, getAlternateUrl
2026-06-02 17:24:37 +02:00
layouts/
2026-06-02 22:46:23 +02:00
Layout.astro # HTML shell — meta, OG, hreflang, global CSS + gradient system
2026-06-02 17:24:37 +02:00
components/
2026-06-02 22:46:23 +02:00
Nav.astro # sticky nav, mobile hamburger, PL/EN switcher
Hero.astro # gradient mesh bg, geo SVG, gradient H1, manifest strip
Problem.astro # problem/contrast section
HowWeWork.astro # 3 differentiators with per-card accents
Offers.astro # 4 offer cards with per-pillar gradient accents
Process.astro # 3-step process with gradient step circles
Security.astro # hidden on MVP — toggle SHOW_SECURITY = true to enable
Contact.astro # mailto form, "zawsze rozmawiasz z człowiekiem" badge
Footer.astro # dark footer, nav links, copyright
2026-06-02 17:24:37 +02:00
pages/
2026-06-02 22:46:23 +02:00
index.astro # PL — /
2026-06-02 17:24:37 +02:00
en/
2026-06-02 22:46:23 +02:00
index.astro # EN — /en/
2026-06-02 17:24:37 +02:00
```
2026-06-02 22:46:23 +02:00
## Design system
CSS custom properties in `src/layouts/Layout.astro` :
| Token | Value | Use |
|---|---|---|
| `--c-coral` | `#e05c40` | warm accent 1 — Home pillar |
| `--c-amber` | `#f0924a` | warm accent 2 — blob decoration |
| `--c-indigo` | `#3d35c0` | cool accent 1 — Business pillar |
| `--c-violet` | `#7b39eb` | cool accent 2 — Med pillar |
| `--c-teal` | `#0b9688` | cool accent 3 — Industry pillar |
| `--grad-main` | coral→violet→teal 135° | gradient text, section accents |
| `--grad-cta` | coral→violet 135° | primary button, outline border |
| `--grad-sep` | transparent→coral→violet→transparent | section hairlines |
Global utilities: `.grad-text` , `.btn-primary` (gradient fill), `.btn-outline` (gradient border via `padding-box/border-box` ).
Section hairlines: automatic `section + section::before` pseudo-element in Layout.astro.
## Editing copy
All visible text lives in `src/i18n/pl.json` and `src/i18n/en.json` . Key paths:
- `hero.h1_base` + `hero.h1_highlight` — split for gradient on the "AI" word
- `manifest.slogan` — the strip between hero and problem section
- `how.human.tagline` — note on the "human in the loop" card
- `contact.human_note` — badge in the contact section
## Feature flags
2026-06-02 17:24:37 +02:00
2026-06-02 22:46:23 +02:00
| Flag | File | Default | Effect |
|---|---|---|---|
| `SHOW_SECURITY` | `Security.astro:6` | `false` | Reveals the security section |
2026-06-02 17:24:37 +02:00
## Swapping the logo
2026-06-02 22:46:23 +02:00
Logo text + SVG half-circle icon: `src/components/Nav.astro` (`.logo` / `.logo-icon` ).