Skip to content

Commit 3f2c37b

Browse files
ferr079claude
andcommitted
feat: custom 404 page + updated humans.txt
- 404: ASCII "404" art, tagline, 3 navigation buttons, dark theme - humans.txt: updated stats (36 LXC, 13 playbooks, IronClaw, PBS backup, KV/D1, R2 CDN), added HTB profile + easter egg hint Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a3b1bed commit 3f2c37b

2 files changed

Lines changed: 120 additions & 13 deletions

File tree

public/humans.txt

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
11
/* TEAM */
2-
Human: Stephane Ferreira
2+
Human: Stéphane Ferreira
33
Role: DevSecOps Engineer, Infrastructure Architect
44
Location: France
55
GitHub: github.com/ferr079
6+
HTB: app.hackthebox.com/users/Ferr079
67
Site: pixelium.win
78

89
/* AI PARTNER */
9-
Name: Claude (Anthropic)
10+
Name: Claude (Anthropic, Opus 4.6)
1011
Role: Co-designer, narrator, permanent engineering partner
11-
Integration: Claude Code with MCP (Model Context Protocol)
12+
Integration: Claude Code with 6 MCP servers, persistent memory, custom skills
1213

1314
/* STACK */
14-
Framework: Astro 6
15+
Framework: Astro 6 (SSG + SSR hybrid)
1516
Hosting: Cloudflare Workers
16-
CSS: Pure CSS (zero framework, zero Tailwind)
17-
JS: ~15 lines vanilla (IntersectionObserver only)
18-
i18n: EN (default) + FR
17+
CDN: Cloudflare R2 (assets.pixelium.win)
18+
Data: Cloudflare KV (live stats) + D1 (uptime history)
19+
CSS: Pure CSS (zero framework)
20+
JS: Vanilla only — DynNum hydration, scroll reveal, terminal recordings
21+
i18n: EN (default) + FR (22 pages total)
1922

2023
/* INFRASTRUCTURE (what this site documents) */
21-
Virtualization: 3x Proxmox VE nodes, 30+ LXC containers
22-
Network: TechnitiumDNS (DoT), Traefik, step-ca (internal PKI)
23-
Security: Wazuh SIEM, CrowdSec IPS, Authentik SSO, Headscale VPN
24+
Virtualization: 3x Proxmox VE nodes, 36 LXC containers
25+
Network: TechnitiumDNS (DoT HA), Traefik, step-ca (internal PKI)
26+
Security: Wazuh SIEM, CrowdSec IPS, Authentik SSO, Headscale VPN, YubiKey FIDO2
2427
Observability: VictoriaMetrics, Loki, Beszel, Patchmon
25-
IaC: Ansible via Semaphore, Forgejo Runner CI/CD
26-
AI: OpenFang (Rust AIOps), OpenClaw (personal assistant)
28+
IaC: Ansible (13 playbooks) via Semaphore, Forgejo Runner CI/CD
29+
AI Agents: OpenFang Guardian (5 crons, 7 wrappers), veille-rss, PentAGI, IronClaw
30+
Backup: PBS automated (WOL, vzdump 33 CTs, prune, shutdown — 14 min cycle)
2731

2832
/* PHILOSOPHY */
29-
100% open source. 100% self-hosted. Zero external cloud dependency.
33+
100% self-hosted. Cloudflare edge only. Zero VPS.
3034
Security is not an add-on — it is the foundation.
35+
Every number on this site is live from the homelab.
36+
37+
/* EASTER EGGS */
38+
You found one. There are others.

src/pages/404.astro

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
---
2+
import Base from '../layouts/Base.astro';
3+
---
4+
5+
<Base title="404 — pixelium.win" description="Page not found." hideNav={false}>
6+
<main>
7+
<section class="notfound">
8+
<div class="container">
9+
<pre class="notfound-ascii" aria-hidden="true">
10+
██╗ ██╗ ██████╗ ██╗ ██╗
11+
██║ ██║██╔═══██╗██║ ██║
12+
███████║██║ ██║███████║
13+
╚════██║██║ ██║╚════██║
14+
██║╚██████╔╝ ██║
15+
╚═╝ ╚═════╝ ╚═╝</pre>
16+
<h1>Not found<span class="dot">.</span></h1>
17+
<p class="notfound-msg">This page doesn't exist — but the infrastructure does.</p>
18+
<div class="notfound-links">
19+
<a href="/" class="btn btn-primary">Homepage</a>
20+
<a href="/status" class="btn btn-secondary">Live status</a>
21+
<a href="/infrastructure" class="btn btn-secondary">Infrastructure</a>
22+
</div>
23+
</div>
24+
</section>
25+
</main>
26+
</Base>
27+
28+
<style>
29+
.notfound {
30+
min-height: 70vh;
31+
display: flex;
32+
align-items: center;
33+
justify-content: center;
34+
text-align: center;
35+
}
36+
37+
.notfound-ascii {
38+
font-family: var(--font-mono);
39+
font-size: 0.6rem;
40+
line-height: 1.15;
41+
color: var(--color-accent);
42+
opacity: 0.3;
43+
margin-bottom: 1.5rem;
44+
user-select: none;
45+
}
46+
47+
h1 {
48+
font-size: clamp(2rem, 5vw, 3.5rem);
49+
margin-bottom: 0.75rem;
50+
}
51+
52+
.dot {
53+
color: var(--color-accent);
54+
}
55+
56+
.notfound-msg {
57+
color: var(--color-text-muted);
58+
font-size: 1.1rem;
59+
margin-bottom: 2rem;
60+
font-family: var(--font-mono);
61+
}
62+
63+
.notfound-links {
64+
display: flex;
65+
gap: 1rem;
66+
justify-content: center;
67+
flex-wrap: wrap;
68+
}
69+
70+
.btn {
71+
font-family: var(--font-mono);
72+
font-size: 0.9rem;
73+
padding: 0.65rem 1.5rem;
74+
border-radius: 6px;
75+
text-decoration: none;
76+
transition: background 0.2s, border-color 0.2s;
77+
}
78+
79+
.btn-primary {
80+
background: var(--color-accent);
81+
color: var(--color-bg);
82+
font-weight: 600;
83+
}
84+
85+
.btn-primary:hover {
86+
background: var(--color-accent-hover);
87+
color: var(--color-bg);
88+
}
89+
90+
.btn-secondary {
91+
border: 1px solid var(--color-border);
92+
color: var(--color-text);
93+
}
94+
95+
.btn-secondary:hover {
96+
border-color: var(--color-accent);
97+
color: var(--color-accent);
98+
}
99+
</style>

0 commit comments

Comments
 (0)