phase: 05_update_projects_section
Build and Push Container / build-and-push (push) Successful in 16s

**Phase 05 final pass — all 4 tasks already complete; verified phase-level criteria + docs. Repo 100% green.**

- Verified: 6 `project-card fade-in` cards; order Brain of Reese → Reverse Proxy → Dynamic DNS → Local AI Stack → Deployment Automation → ServWaf; `src/index.html` diff hunks (lines 293–538) all inside `#projects` (286–542).
- `./build.sh` → `Build complete: dist/` (exit 0); `npm test` → **48 passed, 0 failed**; `bash .agents/validate.sh` → **exit 0** (48 E2E + `HEADER CHECK PASSED` on `/`, `/index.html`, hashed CSS via podman + repo-hygiene gates). No linter exists in this repo (no `lint` script/eslint config). Coverage: no JS/CSS touched — vacuous per phase spec; E2E is the binding gate.
- Completion criteria: card count 6 in `src/` **and** `dist/` ✅ · first card "Brain of Reese" with `…/Experimental/brain-of-reese` href in `dist/index.html` ✅ · `grep -c "Self-Hosted Services\|Kubernetes Cluster" src/index.html` = **0** ✅ · AI card has vLLM/Gufo/llama.cpp + LocalAI/LiteLLM/Langfuse, no "Ollama" ✅ · regression test present in `tests/e2e/01-page.spec.js` and passing ✅ · `./build.sh && npm test` green (48 ≥ 45) ✅ · no edits outside `#projects` ✅ · README/AGENTS consistent ✅.
- Docs: README **updated** (new paragraph stating what the E2E suite covers, incl. the six featured cards, so future content edits update the matching test). AGENTS.md **updated** (convention: the `#projects` grid is test-locked by `01-page.spec.js`). All other README claims re-checked against reality (Dockerfile builds `dist/` internally, `listen 8080`, snippet `include`s, `check-headers.sh` port/paths/output, `--bind 0.0.0.0` config, Node ≥20 engine floor, CI `main`+tag publishing) — consistent.
- Notable: `.agents/validate.sh` is still **untracked** though AGENTS.md/README reference it — harness should `git add` it (I ran no git index commands). `.agents/PLAN.md` §4/§5 still say "44 tests" (suite is 48 since Phases 04/05); PLAN.md is off-limits, so this drift needs an explicit user-approved edit. No live-infrastructure touched.
- Next pending phase: none in `.agents/phases/todo/` (05 was last). Remaining unphased audit items (L-3 CSP `unsafe-inline`, L-5 SSH-key labelling, L-7 CI pinning, L-8 build.sh CI check) would need new phases via `phase-authoring`.
This commit is contained in:
2026-10-23 01:32:52 -04:00
parent 2f6f2dc0b9
commit 1fe932cf39
28 changed files with 2454 additions and 93 deletions
@@ -0,0 +1,8 @@
**Phase 05 final pass — all 4 tasks already complete; verified phase-level criteria + docs. Repo 100% green.**
- Verified: 6 `project-card fade-in` cards; order Brain of Reese → Reverse Proxy → Dynamic DNS → Local AI Stack → Deployment Automation → ServWaf; `src/index.html` diff hunks (lines 293–538) all inside `#projects` (286–542).
- `./build.sh` → `Build complete: dist/` (exit 0); `npm test` → **48 passed, 0 failed**; `bash .agents/validate.sh` → **exit 0** (48 E2E + `HEADER CHECK PASSED` on `/`, `/index.html`, hashed CSS via podman + repo-hygiene gates). No linter exists in this repo (no `lint` script/eslint config). Coverage: no JS/CSS touched — vacuous per phase spec; E2E is the binding gate.
- Completion criteria: card count 6 in `src/` **and** `dist/` ✅ · first card "Brain of Reese" with `…/Experimental/brain-of-reese` href in `dist/index.html` ✅ · `grep -c "Self-Hosted Services\|Kubernetes Cluster" src/index.html` = **0** ✅ · AI card has vLLM/Gufo/llama.cpp + LocalAI/LiteLLM/Langfuse, no "Ollama" ✅ · regression test present in `tests/e2e/01-page.spec.js` and passing ✅ · `./build.sh && npm test` green (48 ≥ 45) ✅ · no edits outside `#projects` ✅ · README/AGENTS consistent ✅.
- Docs: README **updated** (new paragraph stating what the E2E suite covers, incl. the six featured cards, so future content edits update the matching test). AGENTS.md **updated** (convention: the `#projects` grid is test-locked by `01-page.spec.js`). All other README claims re-checked against reality (Dockerfile builds `dist/` internally, `listen 8080`, snippet `include`s, `check-headers.sh` port/paths/output, `--bind 0.0.0.0` config, Node ≥20 engine floor, CI `main`+tag publishing) — consistent.
- Notable: `.agents/validate.sh` is still **untracked** though AGENTS.md/README reference it — harness should `git add` it (I ran no git index commands). `.agents/PLAN.md` §4/§5 still say "44 tests" (suite is 48 since Phases 04/05); PLAN.md is off-limits, so this drift needs an explicit user-approved edit. No live-infrastructure touched.
- Next pending phase: none in `.agents/phases/todo/` (05 was last). Remaining unphased audit items (L-3 CSP `unsafe-inline`, L-5 SSH-key labelling, L-7 CI pinning, L-8 build.sh CI check) would need new phases via `phase-authoring`.
@@ -0,0 +1,455 @@
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:17] "GET /index.html HTTP/1.1" 200 -
Running 48 tests using 1 worker
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (1.2s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (483ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (455ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › experience timeline leads with Huntington National Bank role (478ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 5 [chromium] › tests/e2e/01-page.spec.js:49:5 › Page structure › featured projects show the six updated cards in order (503ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 6 [chromium] › tests/e2e/01-page.spec.js:78:5 › Page structure › profile image loads (461ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 7 [chromium] › tests/e2e/01-page.spec.js:86:5 › Page structure › server rack background is generated with a terminal unit (457ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 8 [chromium] › tests/e2e/01-page.spec.js:93:5 › Page structure › GPG section shows both fingerprints and key blocks (472ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 9 [chromium] › tests/e2e/01-page.spec.js:107:5 › Page structure › external links all carry rel="noopener" (492ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
✓ 10 [chromium] › tests/e2e/01-page.spec.js:116:5 › Page structure › hashed assets are referenced and served (480ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (499ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (515ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (521ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (523ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (567ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (530ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (567ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (536ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (517ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (535ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (574ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (530ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (535ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (618ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (514ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (577ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (859ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (509ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (525ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (542ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (544ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (534ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.2s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:37] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (527ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 36 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 37 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 38 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (577ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 39 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (578ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 40 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (594ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (452ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (539ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET / HTTP/1.1" 304 -
✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (573ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET / HTTP/1.1" 304 -
✓ 44 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (692ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 45 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (566ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 46 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (482ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 47 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:31:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
✓ 48 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (500ms)
48 passed (31.6s)
To open last HTML report run:

 npx playwright show-report

>> building image (podman)...
time="2026-10-23T01:32:51-04:00" level=warning msg="HEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format"
f888b4599c6d4393b180e153b9b8b76bf4fdc08c09ecd167c03e15565c043ca9
>> starting container on 127.0.0.1:18099...
>> checking headers...
OK: all security headers present on /
OK: all security headers present on /index.html
OK: all security headers present on /style.342793b0a19255e7ce615729a45053fe.css
HEADER CHECK PASSED
@@ -0,0 +1,20 @@
**Implemented**
- `src/index.html`: deleted the "Self-Hosted Services" `project-card` (code block + copy + tags + link) from `#projects`.
- Inserted the **Brain of Reese** card as the **first** card, immediately before "Reverse Proxy Infrastructure": hybrid-search code preview (`retrieve()` / pgvector ∪ full-text / `rrf_fuse`), RAG description, tech tags FastAPI · pgvector · Postgres · Playwright.
- `.project-links` block copied verbatim from the Reverse Proxy card with only the `href` changed to `https://gitea.reeseapps.com/Experimental/brain-of-reese` (confirmed live: HTTP 200).
- Matched the file's 16/20/24/28-space indentation and its `<span`-wrap style; rebuilt `dist/` via `./build.sh`.
**Tests / gate (100% green)**
- `./build.sh` → OK; `grep -c "project-card fade-in"` = 6 in both `src/index.html` and `dist/index.html`; `grep -c "Self-Hosted Services"` = 0 in both; `brain-of-reese` matches once, inside the new card.
- `npm test` → **47 passed** (baseline before my change was also 47 passed; suite is 47, not 44 — Phases 03/04 added tests. No coverage tooling in this repo; HTML-content-only task → coverage criterion vacuous).
- `bash .agents/validate.sh` → exit **0** (47 E2E passed + `HEADER CHECK PASSED` via podman + repo-hygiene gates).
- Rendered-DOM check against `dist/`: 6 cards, first = "Brain of Reese" with the brain-of-reese source link, zero page errors.
- `git diff` touches only lines inside `#projects` (hunks at 293 and 463) — About/Skills/other sections untouched.
**Docs:** no doc impact — neither `README.md` nor `AGENTS.md` enumerates project cards or the removed card.
**Notes**
- Phase-level criterion "Kubernetes Cluster absent" intentionally still unmet — that is task 02.
- Pre-existing uncommitted changes (`.agents/PLAN.md`, `AGENTS.md`, `package*.json` Playwright 1.63.0 re-pin, untracked `.agents/validate.sh`) left as-is; no git index/history commands run.
**Next pending task:** `.agents/phases/todo/05_update_projects_section/02_servwaf_card.md`
@@ -0,0 +1,446 @@
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:55] "GET /index.html HTTP/1.1" 200 -
Running 47 tests using 1 worker
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (513ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:56] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (515ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (485ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:57] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › experience timeline leads with Huntington National Bank role (489ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 5 [chromium] › tests/e2e/01-page.spec.js:49:5 › Page structure › profile image loads (453ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 6 [chromium] › tests/e2e/01-page.spec.js:57:5 › Page structure › server rack background is generated with a terminal unit (475ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:58] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 7 [chromium] › tests/e2e/01-page.spec.js:64:5 › Page structure › GPG section shows both fingerprints and key blocks (477ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 8 [chromium] › tests/e2e/01-page.spec.js:78:5 › Page structure › external links all carry rel="noopener" (475ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:47:59] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
✓ 9 [chromium] › tests/e2e/01-page.spec.js:87:5 › Page structure › hashed assets are referenced and served (471ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (508ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:00] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (529ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:01] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (540ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (502ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:02] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (584ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (523ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (553ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (517ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:04] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (528ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (558ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:05] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (549ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (536ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:06] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (543ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (512ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:07] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (585ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:08] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (551ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (566ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:09] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (862ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:10] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (544ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:11] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (561ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:12] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:13] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:14] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (541ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:15] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 36 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (533ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 37 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (587ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 38 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (612ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 39 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (581ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (441ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (578ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET / HTTP/1.1" 304 -
✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (608ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET / HTTP/1.1" 304 -
✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (780ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 44 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (693ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 45 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (680ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 46 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.9s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:48:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 47 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (1.2s)
47 passed (32.0s)
To open last HTML report run:

 npx playwright show-report

>> building image (podman)...
time="2026-10-23T00:49:29-04:00" level=warning msg="HEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format"
7a5cd2a48bd199bcefceb48e6954ccc4e9c18534daeb42db25ae93cf526b4ff2
>> starting container on 127.0.0.1:18099...
>> checking headers...
OK: all security headers present on /
OK: all security headers present on /index.html
OK: all security headers present on /style.342793b0a19255e7ce615729a45053fe.css
HEADER CHECK PASSED
@@ -0,0 +1,19 @@
**Implemented**
- Replaced the "Kubernetes Cluster" `project-card` in `src/index.html` (last slot of `#projects`) with the **ServWaf** card, exactly as specified: Go WAF copy, tech tags (Go/YAML/HTTP/3/Podman), declarative-rules code preview; deliberately **no** `project-links` block (closed source) — `project-meta` holds only `project-tech`.
- Rebuilt `dist/` via `./build.sh`.
**Verification (task completion criteria)**
- `grep -c "project-card fade-in"` → 6 in both `src/` and `dist/index.html`
- `grep -n "ServWaf"` matches the new card's comment + `<h3>`; `grep -c "Kubernetes Cluster"` → 0 in src and dist
- ServWaf card contains no `project-links` div and no `gitea.reeseapps.com` href (grid has 5 links across 6 cards)
- `npm test` → **47 passed** (full Playwright suite, 0 failed)
- `.agents/validate.sh` → **exit 0** (E2E suite + `scripts/check-headers.sh` printed `HEADER CHECK PASSED` + repo-hygiene gates)
- Coverage: >90% vacuously satisfied — HTML content only, no JS/CSS modified
**Docs:** no doc impact — README/AGENTS.md describe build/serve/test workflow, not featured-project content; nothing user-visible about setup/conventions changed.
**Notes**
- `k3s`/`Kubernetes` skill tags in the Skills section were left untouched (explicitly out of scope per phase criteria).
- Code-preview lines were wrapped to match the file's existing multi-line `<span>` formatting; content is byte-identical to the task's spec (`=~`, `\s`, regex strings preserved literally).
**Next pending task:** `05_update_projects_section/03_update_local_ai_stack.md`
@@ -0,0 +1,446 @@
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /index.html HTTP/1.1" 200 -
Running 47 tests using 1 worker
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:16] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (600ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (543ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:17] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (495ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › experience timeline leads with Huntington National Bank role (525ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 5 [chromium] › tests/e2e/01-page.spec.js:49:5 › Page structure › profile image loads (519ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 6 [chromium] › tests/e2e/01-page.spec.js:57:5 › Page structure › server rack background is generated with a terminal unit (458ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:19] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 7 [chromium] › tests/e2e/01-page.spec.js:64:5 › Page structure › GPG section shows both fingerprints and key blocks (466ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 8 [chromium] › tests/e2e/01-page.spec.js:78:5 › Page structure › external links all carry rel="noopener" (492ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
✓ 9 [chromium] › tests/e2e/01-page.spec.js:87:5 › Page structure › hashed assets are referenced and served (482ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (513ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (505ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (543ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (532ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (626ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (562ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (575ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (520ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (499ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (546ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (584ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (534ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (508ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (519ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (601ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (598ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (854ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (536ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (519ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (574ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (508ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (536ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 36 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (542ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 37 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (583ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:40] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 38 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (588ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 39 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (587ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (461ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (553ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET / HTTP/1.1" 304 -
✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (581ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET / HTTP/1.1" 304 -
✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (685ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 44 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (535ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 45 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (468ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 46 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 00:57:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 47 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (500ms)
47 passed (31.0s)
To open last HTML report run:

 npx playwright show-report

>> building image (podman)...
time="2026-10-23T00:58:49-04:00" level=warning msg="HEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format"
d795751dc9a73db0a7c7de30ea9e0b150e59b9078a281048efa867898cd7c2a9
>> starting container on 127.0.0.1:18099...
>> checking headers...
OK: all security headers present on /
OK: all security headers present on /index.html
OK: all security headers present on /style.342793b0a19255e7ce615729a45053fe.css
HEADER CHECK PASSED
@@ -0,0 +1,20 @@
**Task 03 — Local AI Stack card updated**
- `src/index.html` "Local AI Stack" card: `<p>` copy now reads "…vLLM, Gufo, and llama.cpp for inference, LiteLLM as a unified API proxy, Bifrost for model routing, and Langfuse for observability. Supports both CUDA and ROCm."
- Tech tags: `<span>Ollama</span>` → `<span>vLLM</span> <span>Gufo</span> <span>llama.cpp</span>` (final list: vLLM, Gufo, llama.cpp, LocalAI, LiteLLM, Langfuse).
- Code preview replaced with the `# Inference engines` / `engines = { vllm:cuda, gufo:rocm, llama.cpp:gguf }` / `# LiteLLM proxy for unified API` block.
- Skills-section "Ollama" mentions (lines 260/263) left untouched — outside `#projects` per phase criteria.
- Card count still 6; order unchanged: Brain of Reese → Reverse Proxy → Dynamic DNS → Local AI Stack → Deployment Automation → ServWaf.
Tests / gate:
- `./build.sh` → `Build complete: dist/` (6 `project-card fade-in` in both `src/` and `dist/index.html`).
- Per-card scan of `src/` + `dist/`: no "Ollama"; vLLM/Gufo/llama.cpp/LocalAI/LiteLLM/Langfuse/Bifrost all present.
- `npm test` → **47 passed** (0 failed).
- `.agents/validate.sh` → 47 E2E passed + `HEADER CHECK PASSED` (`/`, `/index.html`, hashed CSS) + hygiene checks, **EXIT=0**. No linter is configured in the repo.
- Coverage: no JS/CSS touched — vacuously satisfied per task spec.
Docs: **no doc impact** — README.md/AGENTS.md contain no references to project-card content, Ollama, or a hardcoded test count.
Decisions/deviations: none; used the task's HTML verbatim (preview keys are lowercase `"vllm"`/`"gufo"` as specified). Test count is 47, not 44, since Phase 04 added experience tests — all green.
Next pending task: `.agents/phases/todo/05_update_projects_section/04_projects_regression_test.md`.
@@ -0,0 +1,446 @@
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:37] "GET /index.html HTTP/1.1" 200 -
Running 47 tests using 1 worker
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (812ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (523ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (459ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › experience timeline leads with Huntington National Bank role (490ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:40] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 5 [chromium] › tests/e2e/01-page.spec.js:49:5 › Page structure › profile image loads (466ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 6 [chromium] › tests/e2e/01-page.spec.js:57:5 › Page structure › server rack background is generated with a terminal unit (475ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 7 [chromium] › tests/e2e/01-page.spec.js:64:5 › Page structure › GPG section shows both fingerprints and key blocks (468ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 8 [chromium] › tests/e2e/01-page.spec.js:78:5 › Page structure › external links all carry rel="noopener" (480ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
✓ 9 [chromium] › tests/e2e/01-page.spec.js:87:5 › Page structure › hashed assets are referenced and served (495ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (555ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (521ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (535ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (534ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (615ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (523ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (571ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (527ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (517ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (552ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (595ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (561ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:49] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (502ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (518ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:50] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (617ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:51] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (566ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:52] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (870ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (531ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:53] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (557ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:54] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (579ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (574ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:55] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (518ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:56] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:57] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (528ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:04:58] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 36 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:01] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 37 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (572ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 38 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (608ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:02] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 39 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (578ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (463ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (543ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET / HTTP/1.1" 304 -
✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (565ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:04] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET / HTTP/1.1" 304 -
✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (710ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:05] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 44 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (559ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 45 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (453ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:06] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 46 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:05:08] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 47 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (500ms)
47 passed (31.1s)
To open last HTML report run:

 npx playwright show-report

>> building image (podman)...
time="2026-10-23T01:06:11-04:00" level=warning msg="HEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format"
a7720c0363f94344fda7ff8068e66e14f0be9b09fb6d1e736919fcb4ee175645
>> starting container on 127.0.0.1:18099...
>> checking headers...
OK: all security headers present on /
OK: all security headers present on /index.html
OK: all security headers present on /style.342793b0a19255e7ce615729a45053fe.css
HEADER CHECK PASSED
@@ -0,0 +1,18 @@
Done — all green.
**Implemented**
- `tests/e2e/01-page.spec.js`: added `featured projects show the six updated cards in order` inside the existing `Page structure` describe block — asserts 6 cards, exact title order (Brain of Reese → ServWaf), Brain card's 4 tech tags + `/RAG chatbot/i` + `gitea…/Experimental/brain-of-reese` link, Local AI Stack tags, no "Ollama", ServWaf `/Web Application Firewall/i` with no `.project-links`, and both removed titles absent. No app-code changes.
**Tests / lint / coverage**
- `./build.sh` → `Build complete: dist/`; `npm test` → **48 passed** (0 failed, 47 pre-existing + 1 new).
- `bash .agents/validate.sh` → E2E 48 passed, `HEADER CHECK PASSED` (`/`, `/index.html`, hashed asset), hygiene checks clean, **exit 0**.
- No JS linter configured in this repo (no `lint` script / eslint config) — nothing to run. Coverage: test-only change, >90% vacuous per the task.
- Verified phase criteria on `dist/index.html`: 6 `project-card fade-in`, first card "Brain of Reese" with the Gitea href, `Self-Hosted Services|Kubernetes Cluster` = 0, AI card has vLLM/Gufo/llama.cpp and no "Ollama", ServWaf card has no `project-links`/gitea link.
**Docs:** no doc impact (test-only; README/AGENTS never described the project cards and stay accurate).
**Decisions / deviations**
- The task's verbatim `expect(ai.locator('.project-tech')).toContainText([...])` cannot pass: `toContainText` with a string array requires a multi-element locator (confirmed by a throwaway spec, since deleted). Replaced with the equivalent-but-stricter `expect(ai.locator('.project-tech span')).toHaveText(['vLLM','Gufo','llama.cpp','LocalAI','LiteLLM','Langfuse'])`, which covers both the new and retained tag assertions.
- Pre-existing doc drift (not editable by me): `PLAN.md` §5 and this task file say "44 tests"; the suite was already 47 before my test (Phase 04 added tests), so the completion criterion "45 tests" is stale — final pass should reconcile PLAN.md's count.
**Next pending task:** none in `05_update_projects_section` (task 4 was last) — phase final pass / validation.
@@ -0,0 +1,455 @@
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:19] "GET /index.html HTTP/1.1" 200 -
Running 48 tests using 1 worker
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (501ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (480ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › experience timeline leads with Huntington National Bank role (491ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 5 [chromium] › tests/e2e/01-page.spec.js:49:5 › Page structure › featured projects show the six updated cards in order (482ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 6 [chromium] › tests/e2e/01-page.spec.js:78:5 › Page structure › profile image loads (446ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 7 [chromium] › tests/e2e/01-page.spec.js:86:5 › Page structure › server rack background is generated with a terminal unit (459ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 8 [chromium] › tests/e2e/01-page.spec.js:93:5 › Page structure › GPG section shows both fingerprints and key blocks (487ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 9 [chromium] › tests/e2e/01-page.spec.js:107:5 › Page structure › external links all carry rel="noopener" (467ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
✓ 10 [chromium] › tests/e2e/01-page.spec.js:116:5 › Page structure › hashed assets are referenced and served (479ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (527ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (500ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (533ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (532ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (567ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (520ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (566ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (525ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (519ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (536ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (593ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (528ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (517ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (535ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (604ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (569ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (586ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (859ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (541ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (549ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (601ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (594ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (555ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:37] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (538ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 36 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 37 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (518ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 38 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (585ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 39 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (576ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 40 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (580ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (454ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (554ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET / HTTP/1.1" 304 -
✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (556ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET / HTTP/1.1" 304 -
✓ 44 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (681ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 45 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (569ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 46 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (473ms)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 47 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s)
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET / HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 -
[WebServer] 127.0.0.1 - - [23/Oct/2026 01:15:50] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 -
✓ 48 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (525ms)
48 passed (31.3s)
To open last HTML report run:

 npx playwright show-report

>> building image (podman)...
time="2026-10-23T01:16:53-04:00" level=warning msg="HEALTHCHECK is not supported for OCI image format and will be ignored. Must use `docker` format"
3d0cb7337c3237dd667afa11d108ea0d19b3abd5c4f49368c041cec6fc03dbe7
>> starting container on 127.0.0.1:18099...
>> checking headers...
OK: all security headers present on /
OK: all security headers present on /index.html
OK: all security headers present on /style.342793b0a19255e7ce615729a45053fe.css
HEADER CHECK PASSED
+8
View File
@@ -134,6 +134,14 @@ network call reintroduced into `src/` fails the suite. That test derives the
allowed origin from `baseURL` in `playwright.config.js`, so changing the port allowed origin from `baseURL` in `playwright.config.js`, so changing the port
there needs no test edit. there needs no test edit.
The suite (`tests/e2e/01-page.spec.js` … `05-menu.spec.js`) covers page
structure — sections, nav targets, the experience timeline and the six featured
project cards in their fixed order — the fake terminal's commands, history,
tab-completion and pranks, the vim simulator, the achievement unlocks and their
`localStorage` persistence, the mobile menu, and the fact that no request ever
leaves the test origin. Content changes to `src/index.html` (e.g. the featured
projects) are asserted there, so update the matching test with the content.
Always build before testing: the suite exercises the built artifact in `dist/`, Always build before testing: the suite exercises the built artifact in `dist/`,
never `src/`. `npm test` starts (or reuses) its own static server, so no manual never `src/`. `npm test` starts (or reuses) its own static server, so no manual
server is needed. Rebuild the image (`podman build`) after changing `src/`. server is needed. Rebuild the image (`podman build`) after changing `src/`.
+79 -93
View File
@@ -290,6 +290,48 @@
A selection of projects from my homelab and deployment infrastructure. A selection of projects from my homelab and deployment infrastructure.
</p> </p>
<div class="projects-grid" role="list" aria-label="Projects"> <div class="projects-grid" role="list" aria-label="Projects">
<div class="project-card fade-in" role="listitem">
<div class="project-preview">
<div class="code-block">
<div class="code-line"><span class="code-comment"># Hybrid search: pgvector cosine ∪ Postgres full-text</span></div>
<div class="code-line"><span class="code-keyword">def</span> <span class="code-function">retrieve</span>(<span class="code-variable">query</span>, <span class="code-variable">k</span>=<span class="code-variable">5</span>):</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-variable">vec</span> = <span class="code-function">pgvector</span>.<span
class="code-function">cosine</span>(<span class="code-variable">query</span>)</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-variable">fts</span> = <span class="code-function">postgres</span>.<span
class="code-function">full_text</span>(<span class="code-variable">query</span>)</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-variable">chunks</span> = <span class="code-function">rrf_fuse</span>(<span class="code-variable">vec</span>, <span class="code-variable">fts</span>,
<span class="code-variable">k</span>)</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-keyword">return</span> <span class="code-function">llm</span>.<span
class="code-function">chat</span>(<span class="code-function">document</span>(<span class="code-variable">chunks</span>))</div>
<div class="code-line">&nbsp;</div>
</div>
</div>
<div class="project-info">
<h3>Brain of Reese</h3>
<p>A chippy, honest RAG chatbot over homelab documentation — git repositories, local
directories, and uploaded archives. Hybrid search (pgvector cosine ∪ Postgres
full-text search, Reciprocal Rank Fusion) feeds the whole relevant document to a
self-hosted LLM and streams back a grounded answer; when it has no notes it
admits it and suggests questions it can answer.</p>
<div class="project-meta">
<div class="project-tech">
<span>FastAPI</span>
<span>pgvector</span>
<span>Postgres</span>
<span>Playwright</span>
</div>
<div class="project-links">
<a href="https://gitea.reeseapps.com/Experimental/brain-of-reese" title="Source" target="_blank"
rel="noopener">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div>
</div>
</div>
</div>
<div class="project-card fade-in" role="listitem"> <div class="project-card fade-in" role="listitem">
<div class="project-preview"> <div class="project-preview">
<div class="code-block"> <div class="code-block">
@@ -382,32 +424,26 @@
<div class="project-card fade-in" role="listitem"> <div class="project-card fade-in" role="listitem">
<div class="project-preview"> <div class="project-preview">
<div class="code-block"> <div class="code-block">
<div class="code-line"><span class="code-keyword">from</span> <span <div class="code-line"><span class="code-comment"># Inference engines</span></div>
class="code-string">ollama</span> <span class="code-keyword">import</span> <span <div class="code-line"><span class="code-variable">engines</span> = {</div>
class="code-function">Client</span></div> <div class="code-line">&nbsp;&nbsp;<span class="code-string">"vllm"</span>: <span class="code-string">"cuda"</span>, <span class="code-comment"># high-throughput serving</span></div>
<div class="code-line">&nbsp;&nbsp;<span class="code-string">"gufo"</span>: <span class="code-string">"rocm"</span>, <span class="code-comment"># Strix Halo inference</span></div>
<div class="code-line">&nbsp;&nbsp;<span class="code-string">"llama.cpp"</span>: <span class="code-string">"gguf"</span>, <span class="code-comment"># CPU/GPU fallback</span></div>
<div class="code-line">}</div>
<div class="code-line">&nbsp;</div> <div class="code-line">&nbsp;</div>
<div class="code-line"><span class="code-variable">client</span> = <span <div class="code-line"><span class="code-comment"># LiteLLM proxy for unified API</span></div>
class="code-function">Client</span>(<span
class="code-string">"http://localhost:11434"</span>)</div>
<div class="code-line"><span class="code-variable">response</span> = <span
class="code-variable">client</span>.<span class="code-function">chat</span>(</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-variable">model</span>=<span
class="code-string">"llama3"</span>,</div>
<div class="code-line">&nbsp;&nbsp;<span class="code-variable">messages</span>=[...]</div>
<div class="code-line">)</div>
<div class="code-line">&nbsp;</div>
<div class="code-line"><span class="code-comment"># LiteLLM proxy for unified API</span>
</div>
</div> </div>
</div> </div>
<div class="project-info"> <div class="project-info">
<h3>Local AI Stack</h3> <h3>Local AI Stack</h3>
<p>Complete local AI infrastructure: Ollama and LocalAI for inference, LiteLLM as a unified API <p>Complete local AI infrastructure: vLLM, Gufo, and llama.cpp for inference, LiteLLM as a
proxy, Bifrost for model routing, and Langfuse for observability. Supports both CUDA and unified API proxy, Bifrost for model routing, and Langfuse for observability. Supports
ROCm.</p> both CUDA and ROCm.</p>
<div class="project-meta"> <div class="project-meta">
<div class="project-tech"> <div class="project-tech">
<span>Ollama</span> <span>vLLM</span>
<span>Gufo</span>
<span>llama.cpp</span>
<span>LocalAI</span> <span>LocalAI</span>
<span>LiteLLM</span> <span>LiteLLM</span>
<span>Langfuse</span> <span>Langfuse</span>
@@ -469,85 +505,35 @@
<div class="project-card fade-in" role="listitem"> <div class="project-card fade-in" role="listitem">
<div class="project-preview"> <div class="project-preview">
<div class="code-block"> <div class="code-block">
<div class="code-line"><span class="code-comment"># Self-hosted services</span></div> <div class="code-line"><span class="code-comment"># ServWaf — declarative rules</span></div>
<div class="code-line"><span class="code-keyword">- Immich</span> <span <div class="code-line"><span class="code-variable">ratelimit</span>:</div>
class="code-comment"># Photo/video management</span></div> <div class="code-line">&nbsp;&nbsp;<span class="code-variable">per_ip</span>: <span
<div class="code-line"><span class="code-keyword">- Jellyfin</span> <span class="code-string">20 rps, burst 40</span></div>
class="code-comment"># Media streaming</span></div> <div class="code-line"><span class="code-variable">rules</span>:</div>
<div class="code-line"><span class="code-keyword">- Nextcloud</span> <span <div class="code-line">&nbsp;&nbsp;- <span class="code-keyword">deny</span> <span
class="code-comment"># Cloud storage & sync</span></div> class="code-variable">if</span> <span class="code-variable">user_agent</span> =~
<div class="code-line"><span class="code-keyword">- Gitea</span> <span <span class="code-string">"curl|wget"</span></div>
class="code-comment"># Git service</span></div> <div class="code-line">&nbsp;&nbsp;- <span class="code-keyword">flag</span> <span
<div class="code-line"><span class="code-keyword">- Matrix</span> <span class="code-variable">if</span> <span class="code-variable">body</span> =~ <span
class="code-comment"># Chat protocol</span></div> class="code-string">"(?i)union\s+select"</span></div>
<div class="code-line"><span class="code-keyword">- Home Assistant</span> <span <div class="code-line"><span class="code-variable">ai</span>:</div>
class="code-comment"># Smart home</span></div> <div class="code-line">&nbsp;&nbsp;<span class="code-variable">endpoint</span>: <span
<div class="code-line"><span class="code-keyword">- Pi-hole</span> <span class="code-string">"http://aipi.reeseapps.com/v1"</span></div>
class="code-comment"># DNS ad blocking</span></div>
</div> </div>
</div> </div>
<div class="project-info"> <div class="project-info">
<h3>Self-Hosted Services</h3> <h3>ServWaf</h3>
<p>A diverse fleet of self-hosted services: Immich for photos, Jellyfin for media, Nextcloud for <p>A network Web Application Firewall written in Go, sitting in line between clients
storage, Matrix for chat, Home Assistant for IoT, and more. Each running as rootless Podman and the origin. Declarative YAML rules (user agent, IP/CIDR, URL and body
containers with SELinux awareness.</p> regexes), per-IP rate limiting, attack-pattern inspection (SQL injection, XSS,
path traversal, CRLF, scanner probes), opt-in self-hosted local-AI verdicts,
TLS termination, and an opt-in HTTP/3 (QUIC) edge.</p>
<div class="project-meta"> <div class="project-meta">
<div class="project-tech"> <div class="project-tech">
<span>Immich</span> <span>Go</span>
<span>Jellyfin</span> <span>YAML</span>
<span>Nextcloud</span> <span>HTTP/3</span>
<span>Matrix</span> <span>Podman</span>
</div>
<div class="project-links">
<a href="https://gitea.reeseapps.com/services/homelab" title="Source" target="_blank"
rel="noopener">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div>
</div>
</div>
</div>
<div class="project-card fade-in" role="listitem">
<div class="project-preview">
<div class="code-block">
<div class="code-line"><span class="code-comment"># Kubernetes with k3s</span></div>
<div class="code-line"><span class="code-keyword">- metallb</span> <span
class="code-comment"># L2 load balancer</span></div>
<div class="code-line"><span class="code-keyword">- longhorn</span> <span
class="code-comment"># Distributed storage</span></div>
<div class="code-line"><span class="code-keyword">- traefik</span> <span
class="code-comment"># Ingress gateway</span></div>
<div class="code-line"><span class="code-keyword">- external-dns</span> <span
class="code-comment"># Route53 integration</span></div>
<div class="code-line"><span class="code-keyword">- grafana</span> <span
class="code-comment"># Metrics dashboards</span></div>
<div class="code-line"><span class="code-keyword">- minecraft</span> <span
class="code-comment"># Game server</span></div>
</div>
</div>
<div class="project-info">
<h3>Kubernetes Cluster</h3>
<p>k3s and k0s Kubernetes clusters with MetalLB for L2 failover, Longhorn for distributed
storage, Traefik/Nginx ingress, cert-manager with Route53 DNS challenge, and Helm charts for
service deployment.</p>
<div class="project-meta">
<div class="project-tech">
<span>k3s</span>
<span>Kubernetes</span>
<span>Helm</span>
<span>MetalLB</span>
</div>
<div class="project-links">
<a href="https://gitea.reeseapps.com/services/homelab" title="Source" target="_blank"
rel="noopener">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
</svg>
</a>
</div> </div>
</div> </div>
</div> </div>
+29
View File
@@ -46,6 +46,35 @@ test.describe('Page structure', () => {
await expect(nimbisManager.locator('.timeline-date')).toHaveText('Jan 2022 – Apr 2026'); await expect(nimbisManager.locator('.timeline-date')).toHaveText('Jan 2022 – Apr 2026');
}); });
test('featured projects show the six updated cards in order', async ({ page }) => {
const cards = page.locator('#projects .project-card');
await expect(cards).toHaveCount(6);
const titles = await cards.locator('.project-info h3').allTextContents();
expect(titles).toEqual([
'Brain of Reese',
'Reverse Proxy Infrastructure',
'Dynamic DNS Service',
'Local AI Stack',
'Deployment Automation',
'ServWaf',
]);
// Brain of Reese leads, with its source link
const brain = cards.first();
await expect(brain.locator('.project-tech span')).toHaveCount(4);
await expect(brain).toHaveText(/RAG chatbot/i);
await expect(brain.locator('a[href="https://gitea.reeseapps.com/Experimental/brain-of-reese"]')).toBeAttached();
// Local AI Stack: Ollama replaced by vLLM, Gufo, llama.cpp
const ai = cards.nth(3);
await expect(ai.locator('.project-tech span')).toHaveText(['vLLM', 'Gufo', 'llama.cpp', 'LocalAI', 'LiteLLM', 'Langfuse']);
await expect(ai).not.toContainText('Ollama');
// ServWaf is closed source — description only, no source link
await expect(cards.last()).toHaveText(/Web Application Firewall/i);
await expect(cards.last().locator('.project-links')).not.toBeAttached();
// removed cards are gone from the grid
expect(titles).not.toContain('Self-Hosted Services');
expect(titles).not.toContain('Kubernetes Cluster');
});
test('profile image loads', async ({ page }) => { test('profile image loads', async ({ page }) => {
const img = page.locator('#about img'); const img = page.locator('#about img');
await expect(img).toBeVisible(); await expect(img).toBeVisible();