Personal site (https://bnied.dev)
  • JavaScript 81%
  • CSS 12.9%
  • HTML 6.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-31 01:51:16 +00:00
.forgejo/workflows ci: check the llms.txt generator too 2026-08-30 18:48:25 -07:00
assets Initial commit: terminal-aesthetic personal website 2026-04-11 15:53:44 -07:00
css fix: give the 404 page a heading 2026-08-30 18:48:25 -07:00
data fix: tidy the boot header on narrow viewports 2026-08-29 09:15:15 -07:00
deploy ops: recover the bnied.dev vhost into the repo 2026-08-31 01:09:29 +00:00
fonts feat: accurate Netscape 3.x chrome with working menu bar 2026-07-05 18:29:04 -07:00
img feat: add 'cat pictures' easter egg 2026-04-13 11:21:45 -07:00
js fix: don't clear a text selection on click 2026-08-30 18:48:25 -07:00
md refactor: move the generated markdown into md/, split roles out 2026-08-30 17:36:37 -07:00
test fix: don't clear a text selection on click 2026-08-30 18:48:25 -07:00
tools refactor: move the generated markdown into md/, split roles out 2026-08-30 17:36:37 -07:00
vendor/js-dos chore: drop the dangling source map references from js-dos 2026-08-30 14:45:36 -07:00
.gitignore chore: gitignore .superpowers/ brainstorm scratch 2026-06-02 15:49:13 -07:00
404.html fix: give the 404 page a heading 2026-08-30 18:48:25 -07:00
apple-touch-icon.png Initial commit: terminal-aesthetic personal website 2026-04-11 15:53:44 -07:00
favicon.ico Initial commit: terminal-aesthetic personal website 2026-04-11 15:53:44 -07:00
favicon.svg Initial commit: terminal-aesthetic personal website 2026-04-11 15:53:44 -07:00
index.html refactor: remove the two things that would need CSP 'unsafe-inline' 2026-08-30 13:49:20 -07:00
LICENSE.txt feat: startx boots an X11 session — twm, Netscape 3.x, xclock, xeyes 2026-07-04 23:44:50 -07:00
llms.txt refactor: move the generated markdown into md/, split roles out 2026-08-30 17:36:37 -07:00
package.json feat: add llms.txt 2026-08-30 17:24:26 -07:00
README.md ops: recover the bnied.dev vhost into the repo 2026-08-31 01:09:29 +00:00
robots.txt chore: add robots.txt 2026-08-30 16:42:12 -07:00

bnied.dev

CI

Personal website with a CRT terminal aesthetic. Visitors interact via a command prompt to explore resume content, run easter eggs, and play DOOM.

Commands

Command Description
about Bio and certifications
skills Technical expertise
experience Work history overview
experience <role> Drill into a specific role
projects Open-source projects
education Academic background
contact Email, GitHub, LinkedIn
resume Download a PDF resume, typeset client-side from live site data (no libraries; cat resume.txt for plain text)
theme <name> Switch color theme (green, amber, blue, high-contrast, colorblind)
figlet <text> Render big ASCII banner text
lolcat Rainbow-colorize output (best at the end of a pipe)
crt CRT effect intensity: off / on / max (persists)
help List all commands

Easter Eggs

Too many to list. Try some Linux commands and see what happens.

Pipes

Commands compose with | just like a real shell:

fortune | cowsay
figlet bnied | lolcat
echo hello | figlet | lolcat
cat about | cowsay
neofetch | lolcat

Pipeable commands: echo, fortune, cat <section>, figlet, cowsay, lolcat, neofetch, ls, uname, whoami, pwd, hostname, date, uptime, ps, free, df, yes, dmesg.

CRT effects

The phosphor-CRT look has three intensity levels, set with crt:

  • crt off — flat, plain terminal (max readability / low power)
  • crt on — default: curvature, bloom, glare, scanlines, phosphor afterglow
  • crt max — adds edge chromatic aberration and an occasional sync-roll

The choice persists across visits (localStorage). All levels honor prefers-reduced-motion: animations freeze, the static look remains, and the boot sequence collapses to near-instant.

Tech Stack

  • Vanilla HTML, CSS, JavaScript -- no frameworks, no build step
  • Fira Code font
  • js-dos for DOOM (self-hosted in vendor/js-dos/, loaded on demand)
  • Content stored in data/*.json, logic split across ES modules in js/

Structure

.
├── index.html
├── css/style.css
├── js/
│   ├── main.js              # entry point
│   ├── commands.js          # command dispatch
│   ├── pipeline.js          # pipe engine
│   ├── data.js              # loads JSON assets
│   └── easter-eggs/         # easter-egg handlers
├── data/
│   ├── sections.json        # resume sections
│   ├── experience.json      # per-role details
│   ├── help.json            # command help text
│   ├── fortunes.json        # fortune quotes
│   ├── ascii.json           # ASCII art assets
│   ├── easter-eggs.json     # easter egg data
│   └── figlet-font.json     # block font for figlet
├── assets/
│   └── doom.jsdos           # DOOM shareware bundle
├── vendor/
│   └── js-dos/              # self-hosted js-dos emulator (GPL-2.0)
└── img/                     # favicon variants

Running Locally

python3 -m http.server 8000
# open http://localhost:8000

Tests

Pure logic (figlet, cowsay, the pipe engine) and the render layer have unit tests run by Node's built-in runner — no dependencies, no build:

node --test

CI runs the same suite on every push and pull request; see .forgejo/workflows/test.yml.

Deploying

The site is static — serving the repo root is the whole deployment. One thing does need saying on the server, though: without a Cache-Control header, browsers cache JavaScript heuristically and keep running the previous build after a deploy. deploy/nginx-vhost.conf is the server block itself, and deploy/nginx-site.conf carries the caching, compression and header policy — install it and deploy/nginx-headers.conf as nginx snippets and include the first from the server block. Both files explain themselves; the short version is that root must be declared at server level, and the headers snippet is included per-location because nginx add_header does not merge across scopes.

Regenerate the derived files whenever section content changes — both are committed, and their tests fail if they drift from data/:

npm run noscript   # the <noscript> fallback inside index.html
npm run llms       # llms.txt and the md/ files it indexes

License

Original site code is 2-clause BSD. See LICENSE.txt for the full text and third-party attributions.

Third-party components

  • Fira Code -- SIL Open Font License 1.1 (self-hosted in fonts/)
  • Fixedsys Excelsior -- public domain (self-hosted in fonts/, used by the startx easter egg)
  • js-dos -- GPL v2 (self-hosted in vendor/js-dos/, see its README for version and upgrade notes)
  • DOSBox -- GPL v2 (bundled inside assets/doom.jsdos)
  • DOOM shareware WAD -- freely distributable shareware, (c) 1993 id Software (bundled inside assets/doom.jsdos)