# jpaul.io The personal hub landing page at the root of [jpaul.io](https://jpaul.io) — who I am, what I make, and where to find me. Not a blog, not a portfolio: a hub. ## Contents - **`index.html`** — the whole site. One self-contained file, no build step. The avatar and favicon are inlined as data URIs; the only external assets are the Google Fonts (Inter + JetBrains Mono). Zero JavaScript. - **`favicon.svg`** — green `$` / amber `_` cursor mark on the GitHub-dark-slate ground. - **`Dockerfile`** — bakes the site into an `nginx:alpine` image. - **`docker-compose.yml`** — runs that image behind Traefik. - **`.gitea/workflows/build.yml`** — CI: build the image and publish it on push to `main`. ## Design Dark-mode only, GitHub-dark-slate palette, terminal-panel motifs. Matches the brand used across [jpaul.me](https://www.jpaul.me), the AI Workflow course cards, and the YouTube channel. Responsive; cards stack to one column below 720px; hero stays readable at 375px. ## Deploy — automated (push to main → live) 1. **Push to `main`** → Gitea Actions builds the `nginx:alpine` image and publishes it. 2. The deploy host **pulls** the image over HTTPS. 3. **Watchtower** recreates the container with the new image. No bind mounts — the running container always matches what CI built. Runs behind Traefik: `websecure` entrypoint, an HTTP-01 cert, and `Host(jpaul.io) || Host(www.jpaul.io)` with the cert domains named explicitly (a compound rule won't auto-populate them). First run on the host: `docker compose up -d`. After that, editing the site is just commit → push to `main`; CI and Watchtower do the rest.