hatch-surf/site
Senior Web Designer 478e2818b9
Some checks failed
CI / go (push) Has been cancelled
CI / docker (push) Has been cancelled
CI / lint-go (push) Has been cancelled
CI / lint-docs (push) Has been cancelled
CI / check-paperclip (push) Has been cancelled
Deploy static site / Deploy to GitHub Pages (push) Has been cancelled
Deploy static site / Deploy via Docker to hatch.surf (push) Has been cancelled
ELF-457: add slot 3 rotating tagline above hero sub on hatch.surf
Three taglines rotate every 3.5s with a subtle 700ms opacity crossfade
between the H1 and the hero sub on the hatch.surf landing page:
  1. Inspect any request. Mock any response. (default, in initial HTML)
  2. Your HTTP bin, on your machine.
  3. Send. Capture. Mock. No signup.

Implementation:
- site/index.html: <div class='hero-tagline' aria-live=polite> with three
  <p class='hero-tagline-item'> children stacked; default #1 has
  is-active class and no aria-hidden (for SEO + no-JS users)
- site/style.css: .hero-tagline uses position:relative with fixed
  height: 1.7em (no CLS during rotation); absolute children crossfade
  via transition: opacity 700ms var(--ease-out); font: JetBrains Mono
  weight 500 in var(--text-secondary); clamp(0.85rem, 2.2vw, 1rem)
  so mobile (375px+) fits the longest tagline on one line
- site/main.js: initRotatingTagline() in the existing IIFE; setInterval
  every 3500ms swaps is-active and aria-hidden between siblings;
  early-returns if prefers-reduced-motion is set, so the default
  tagline stays visible without animation
- Spacing: H1 mb-sp-6, tagline mb-sp-6, sub mb-sp-8 keeps the
  existing 24px/24px/32px rhythm unchanged below the headline

Note: site/index.html (not the Next.js app under app/ + components/)
is what hatch.surf/nginx actually serves. The Next.js work from
the earlier failed run was reverted.
2026-06-26 19:47:54 +02:00
..
blog feat(site): add anime.js v4 magic background, remove Three.js 2026-06-24 09:14:46 +02:00
brand Add static site for hatch.sh with blog post 2026-06-23 09:53:50 +02:00
.dockerignore Dockerize hatch.surf homepage 2026-06-24 07:52:29 +02:00
docker-compose.yml feat(site): integrate landing page redesign source code into repository 2026-06-25 03:41:14 +02:00
Dockerfile Dockerize hatch.surf homepage 2026-06-24 07:52:29 +02:00
index.html ELF-457: add slot 3 rotating tagline above hero sub on hatch.surf 2026-06-26 19:47:54 +02:00
main.js ELF-457: add slot 3 rotating tagline above hero sub on hatch.surf 2026-06-26 19:47:54 +02:00
README.md feat(site): integrate landing page redesign source code into repository 2026-06-25 03:41:14 +02:00
style.css ELF-457: add slot 3 rotating tagline above hero sub on hatch.surf 2026-06-26 19:47:54 +02:00

Hatch Static Site

This directory contains the static site for hatch.surf.

Structure

site/
├── index.html              # Landing page
├── style.css               # Global styles
├── blog/
│   ├── index.html          # Blog index
│   └── why-we-are-building-hatch/
│       └── index.html      # Blog post
└── brand/
    ├── og/
    │   └── default.png     # Open Graph image
    └── favicon/
        ├── favicon.ico
        └── favicon-*.png   # Various sizes

Deployment

The site is deployed via Docker to the hatch.surf server. Static files are baked into the Docker image — no host directory mounting required.

Docker Deployment

The GitHub Actions workflow (deploy-site.yml) automatically:

  1. Builds a Docker image with static files baked in
  2. Pushes the image to the server
  3. Restarts the container

Manual Deployment

# From repo root
./scripts/deploy-site.sh

# Dry run
./scripts/deploy-site.sh --dry-run

DNS Configuration

To point hatch.surf to your server:

  1. Add A record pointing to your server IP
  2. Enable HTTPS via Caddy or Let's Encrypt

Architecture

The deployment uses:

  • Docker image: nginx:alpine with static files baked in
  • No host mounts: Image is self-contained, no /var/www dependency
  • Caddy: Optional reverse proxy for TLS termination
  • Port 3000: Internal port, proxied by Caddy on 80/443

Local Development

To preview the site locally:

cd site
python3 -m http.server 8000
# Open http://localhost:8000

Or with Node.js:

npx serve site

Docker

To run the site in Docker:

cd site
# Build and run with docker compose
docker compose up -d

# Or build and run with docker
docker build -t hatch-homepage .
docker run -d -p 3000:80 hatch-homepage

The site will be available at http://localhost:3000

To stop the container:

docker compose down
# Or
docker stop $(docker ps -q --filter ancestor=hatch-homepage)

SEO Checklist

  • H1 = title
  • Meta description ≤ 160 chars
  • Primary keyword in first 200 words
  • OG image set
  • Internal link to repo
  • Canonical URL set
  • Semantic HTML
  • Mobile responsive
  • Fast loading (static HTML/CSS)

Adding New Posts

  1. Create a new directory under blog/
  2. Create an index.html file with the post content
  3. Update blog/index.html to include the new post
  4. Follow the same HTML structure as existing posts