The handoff doc used drawbar.io; the real Drawbar site is drawbar.farm. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LbhPvfSERrnuY5jdhAdB7v
jpaul.io
The personal hub landing page at the root of 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 annginx:alpineimage.docker-compose.yml— runs that image behind Traefik..gitea/workflows/build.yml— CI: build the image and publish it on push tomain.
Design
Dark-mode only, GitHub-dark-slate palette, terminal-panel motifs. Matches the brand used across 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)
- Push to
main→ Gitea Actions builds thenginx:alpineimage and publishes it. - The deploy host pulls the image over HTTPS.
- 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.