gethumanai-landing/sessions/2026-06-02.md

5.5 KiB
Raw Blame History

Session 2026-06-02

What was built

Full MVP of the humanAI landing page — repo creation through live deploy on VPS.


Commits (chronological)

Hash Summary
fc57413 feat: initial humanAI landing page
7b24a7f fix: use npm_default network (actual NPM network name on VPS)
50cc253 fix: deploy.sh uses ~/gethumanai-landing (no sudo needed on VPS)
6e63461 feat: add smoke tests to deploy.sh (curl container IP after up)
9e591d9 feat: expose port 8080 on host, add host-port smoke test in deploy.sh
3f5dd53 fix: smoke tests use localhost:8080 (port mapping creates ambiguous container IPs)
b7b1336 feat: visual redesign — gradient mesh, per-pillar accents, manifest slogans

Session 1 — Initial build

Brief: ~/gethumanai-landing-brief.md
Scope: MVP sections 15, 78 (hero, problem, how, offers, process, contact, footer).

Stack decisions:

  • Astro 6 static, built-in i18n routing (prefixDefaultLocale: false → PL at /, EN at /en/)
  • All copy in src/i18n/pl.json and src/i18n/en.json — zero hardcoded strings in components
  • Contact form via mailto: prefill (name/email/message → subject+body); // TODO: backend left in place
  • Security section code-complete but hidden behind SHOW_SECURITY = false flag

Infrastructure discoveries:

  • NPM (Nginx Proxy Manager) uses npm_default network, not npm_proxy
  • VPS user has no passwordless sudo → deploy dir is ~/gethumanai-landing, not /opt/
  • Port mapping (8080:80) adds a second Docker network to the container, making {{range .NetworkSettings.Networks}}{{.IPAddress}} return concatenated IPs → smoke tests must use localhost:8080, not the container IP
  • Forgejo repo created via docker exec -u git forgejo forgejo admin user generate-access-token with scopes write:repository,write:user

Smoke test checks (deploy.sh):

  1. GET / contains Ludzka strona AI
  2. GET /en/ contains The human side of AI
  3. GET / contains hreflang
  4. GET / contains mailto:oskar@gethumanai.com
  5. GET /en/ contains human review (Industry/Med conservative tone)
  6. curl -fsS -I http://localhost:8080 returns 200

Session 2 — Visual redesign + slogans

Brief: warm↔cool gradient palette, gradient mesh hero, per-pillar accents, two slogans.

Palette:

  • Warm: coral #e05c40, amber #f0924a
  • Cool: indigo #3d35c0, violet #7b39eb, teal #0b9688
  • Pillar accents: Home=coral, Business=indigo, Industry=teal, Med=violet

Changes per file:

Layout.astro

  • Added --c-coral/amber/indigo/violet/teal, --c-home/business/industry/med
  • --grad-main (coral→violet→teal), --grad-cta (coral→violet), --grad-sep
  • .btn-primary → gradient fill; .btn-outline → gradient border via padding-box/border-box
  • section + section::before → automatic gradient hairline separator
  • .grad-text utility class (background-clip: text)

Hero.astro

  • 4 radial blob divs (CSS-only, filter: blur(72px)) for mesh background
  • Inline SVG geometric line-art (concentric rings + node graph) positioned top-right
  • CSS dot-grid pattern bottom-left
  • h1_base + h1_highlight split → gradient applied only to "AI" word
  • Pillar tiles: border-top: 2.5px solid var(--pa) per-accent via CSS custom property --pa
  • Manifest strip: full-width gradient bg strip with --grad-main text
  • btn-outline uses background: linear-gradient(#fff,#fff) padding-box, var(--grad-cta) border-box

HowWeWork.astro

  • Per-card accent --fa variable (teal/indigo/violet)
  • Icon wrapped in 48×48 pill with color-mix(in srgb, var(--fa) 10%, transparent) bg
  • Human card gets how.human.tagline as a footnote with violet color

Offers.astro

  • --oa per-card accent variable
  • offer-topbar: 3px gradient bar at card top (var(--oa) → violet blend)
  • Icon wrapper pill with accent bg tint
  • conservative-note styled in card's own accent color
  • Abstract geometric SVG icons (waveform for Industry, pulse+doc for Med, node graph for Business, home+nodes for Home)

Process.astro

  • Step circles: individual linear-gradient backgrounds (coral→amber / violet→indigo / teal→indigo)
  • Connector: linear-gradient(to bottom, coral, violet, teal) at 30% opacity

Contact.astro

  • human-note badge: pill shape, gradient bg tint, contact.human_note string, person SVG icon
  • Email link: --grad-cta background-clip gradient text
  • Input focus: violet border + rgba(123,57,235,.1) box-shadow

New translation keys added:

  • hero.h1_base + hero.h1_highlight (split for gradient word)
  • manifest.slogan — "AI dla ludzi, przez ludzi" / "AI for people, by people"
  • how.human.tagline — "U nas zawsze rozmawiasz z człowiekiem" / "You always talk to a real person"
  • contact.human_note — same strings, used in contact section badge

WCAG AA notes:

  • Gradient text on H1 (font-size: clamp(2.4rem,7.5vw,4.2rem)) — large text threshold, all gradient stops ≥ 3:1 on white ✓
  • Body/muted text stays #6b6b65 on white (~4.5:1) ✓
  • White text on gradient CTA buttons — all gradient stops dark enough for white ✓

Open items / next steps

  • Configure NPM proxy host: gethumanai.comhttp://humanai-landing:80
  • Add SSL via Let's Encrypt in NPM
  • Replace // TODO: podłączyć backend in Contact.astro with real form endpoint
  • Set SHOW_SECURITY = true in Security.astro when ready to publish that section
  • Swap placeholder logo (.logo-icon in Nav.astro) for final brand asset
  • Consider adding og:image (1200×630 static PNG) for social previews