diff --git a/404.html b/404.html index 5025e28..ba48c53 100644 --- a/404.html +++ b/404.html @@ -4,12 +4,36 @@

404 Not Found


The page has been deleted
+ diff --git a/index.html b/index.html index a5724a8..bb849b4 100644 --- a/index.html +++ b/index.html @@ -262,9 +262,9 @@
-

Born out of a deep distrust of Microsoft and Google, this project is my ongoing effort to self-host as much of my digital life as possible. Every device on my network is named after a Pokémon and assigned a local IP of 10.0.0.x, where x is its Pokédex number.

-

The primary server, Charizard, runs Unraid OS and manages a disk array totalling 44 TB. It hosts a Gitea instance for personal projects, a file server, and a media server, exposed to the internet through Nginx Proxy Manager with SSL certificates from Let's Encrypt.

-

An extension of the setup lives on Bulbasaur, a Raspberry Pi running Pi-hole for network-wide ad blocking and a WireGuard VPN server for secure remote access.

+

Born out of a deep distrust of Microsoft and Google, this project is my ongoing effort to self-host as much of my digital life as possible. Every device on my network is named after a Pokémon and assigned a local IP of 10.0.0.x, where x is its Pokédex number.

+

The primary server, Charizard, runs Unraid OS and manages a disk array totalling 44 TB. It hosts a Gitea instance for personal projects, a file server, and a media server, exposed to the internet through Nginx Proxy Manager with SSL certificates from Let's Encrypt.

+

An extension of the setup lives on Bulbasaur, a Raspberry Pi running Pi-hole for network-wide ad blocking and a WireGuard VPN server for secure remote access.

Charizard is turning five this year. In that time I've learned an enormous amount about networking, Linux administration, and the particular satisfaction of fixing something broken at 2 in the morning that nobody asked you to build in the first place.

diff --git a/script.js b/script.js index f606612..046e32c 100644 --- a/script.js +++ b/script.js @@ -728,3 +728,49 @@ arrange(CYCLE[pos]).finally(() => { busy = false; }); }); })(); + + +// ── Goat ────────────────────────────────────────────────────── +(function () { + console.log(` + %%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%% + %%%% %%%%%%%%%%% + %%% %%%%%%%%%%%%%%% + %% %%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%`); + + const FACTS = [ + `The word admiral comes from the Arabic "amir al bahr", which translates to "commander of the sea". Somewhere along the way into European languages, the bahr fell off, so the word we kept literally means "commander of the".`, + `The word stationery comes from (perhaps obviously) the word stationary. It's because book shops were some of the first shops to be in permanent buildings, since books are too heavy to carry around in a cart.`, + `The Wikipedia page for economist Guy Standing was the site of one of the biggest edit wars in Wikipedia history, started when an editor uploaded a picture with the description "Guy Standing sitting".`, + `The introduction of shipping containers, which hide their contents, dropped the number of alcohol bottles marked as "broken" by almost 100%.`, + `The words "chess" and "check" both come from the ancient Persian word "shah", meaning "king". "Check mate" comes from "shah maat", meaning "the king is dead".`, + `No one knows the origin of the character of Igor in the Frankenstein story. He's not in the original book, and his first known appearance is from the movie adaptation of a play. So it's not known if he originally appeared in the play or the movie.`, + `To avoid a binary overflow error, Swiss trains are not allowed to have exactly 256 axles.`, + ]; + console.log('Fun fact: ' + FACTS[Math.floor(Math.random() * FACTS.length)]); +})(); diff --git a/style.css b/style.css index 67ae202..a139034 100644 --- a/style.css +++ b/style.css @@ -836,6 +836,25 @@ footer { pointer-events: none; } +/* Body-text tooltips: dotted underline marks hover info + (dashed marks clickable, see .dnd-roll) */ +.text-tip { + position: relative; + cursor: help; + text-decoration: underline; + text-decoration-style: dotted; + text-decoration-thickness: 2px; + text-underline-offset: 3px; +} +/* List variant: newlines ( ) in the attribute become line breaks */ +[data-tip].text-tip--list:hover::after, +[data-tip].text-tip--list:focus-visible::after, +[data-tip].text-tip--list.tip-open::after { + white-space: pre-line; + text-align: left; + max-width: 300px; +} + .skills-cards { display: grid; grid-template-columns: repeat(2, 1fr); @@ -859,7 +878,17 @@ footer { position: relative; user-select: none; -webkit-user-select: none; + cursor: pointer; + text-decoration: underline; + text-decoration-style: dashed; + text-decoration-thickness: 2px; + text-underline-offset: 3px; + border-radius: 4px; + padding: 0 0.15em; + margin: 0 -0.15em; + transition: background 150ms ease; } +.dnd-roll:hover { background: var(--pink); } .die-scene { position: absolute; bottom: calc(100% + 10px);