dvxb.io — Devkumar Banerjee
Personal portfolio featuring a browser-based x86 virtual machine, retro terminal UI, and interactive shell with 25+ commands.
- Interactive terminal — Built with xterm.js. Supports 25+ commands (whoami, neofetch, cat, ls, vm, echo, clear, history, crt, noise, weather, hn, md, about, fortune, cowsay, matrix, ai, etc.) with ANSI truecolor output, tab completion, command auto-correction, and a virtual filesystem.
- x86 VM in browser — Uses the v86 WebAssembly emulator to boot a Buildroot Linux image. Runs in the terminal with full serial console. Type
vmto start. - Neofetch-style dashboard — Displays ASCII art (pixel portrait), system info, resume highlights (education, research, work, skills, certs), and a 16-color block palette on boot and via
neofetch/cv. - Local AI assistant — Type
ai <prompt>to run Transformers.js (WASM/WebGPU) models directly in-browser. No server round-trip.ai-modelslists available models. - Thought orbs — Dotted 3D marks on a plain 2D canvas, ported from thinking-orbs (MIT). A scan-sweeping globe shows while an
aimodel downloads, then an undulating ribbon tumbles while it generates; the mark in front ofdvxb.ioin the nav bar is a lattice sphere that scrambles and clicks back to solved. Both pause offscreen and fall back to a static frame underprefers-reduced-motion. - Hacker News reader —
hnfetches and displays the top 30 HN stories with scores and comment counts in a formatted ANSI table. - Weather forecast —
weatherfetches your location (browser geolocation or IP fallback) and displays current conditions from Open-Meteo.-ffor Fahrenheit. - Markdown viewer —
md <url>opens any markdown URL in a fullscreen rendered viewer (marked + DOMPurify, dark theme, GFM). - CRT / noise overlays —
crttoggles scanline overlay,noisetoggles SVG turbulence grain texture for a retro CRT feel. - Buildroot Linux VM — Boots a real Linux kernel inside the terminal. Networking via HTTP fetch backend (no raw TCP). 9p virtio filesystem mounts
/mntfrom a static rootfs. - 3D particle background — Three.js GPU-accelerated particle system with connection lines, mouse interaction, and shader-based rendering.
- Scroll animations — Anime.js powers section reveals on scroll, social link hover effects, skill bar fill animations, and magnetic text.
- Aura orbs — Floating blurred radial gradients that drift behind content sections via CSS animations.
- Projects section — 4 spotlight cards (TheAggieMap, PCPG Analyzer, Doctor-Robot/TIDALHack, Neural-Networks-From-Scratch) with 3D tilt hover, shimmer sweep, and "View More on GitHub" links.
- Generated resume pages —
/resume,/cv, and/man/(a man-page styled resume plus thedvxb.io(7)site manual) are built in CI from the private Full-CV TeX source via a custom LaTeX→HTML parser.assets/resume.pdfandassets/cv.pdfare compiled with Tectonic — nothing resume-related is committed. - Contact section — GitHub, LinkedIn, Keybase, resume/CV (HTML + PDF), and GPG public key download.
- Responsive design — CSS token-based design system with mobile breakpoints.
├── index.html Main page
├── css/
│ ├── tokens.css Design tokens (colors, spacing, typography)
│ ├── base.css Reset, global styles
│ ├── components.css Section styles (hero, projects, contact, etc.)
│ ├── layout.css Grid, sidebar, footer
│ ├── terminal.css Terminal container, xterm overrides
│ ├── doc.css Generated resume/man page styles
│ └── responsive.css Media queries
├── js/
│ ├── main.js Entry point — initializes all modules
│ ├── terminal.js xterm.js setup, mode switching (local/v86)
│ ├── shell.js Virtual filesystem, command handler, neofetch, ASCII art
│ ├── v86-launcher.js v86 config, boot/stop VM, serial I/O
│ ├── three-particles.js Three.js particle system
│ ├── animations.js Anime.js scroll reveals, hover effects, skill bars
│ ├── orb.js Dotted thought-orb marks (nav bar + AI status)
│ └── nav.js Section navigation, scroll spy, mobile menu
├── tools/
│ ├── tex2html.mjs Custom LaTeX → HTML parser (throws on unknown macros)
│ ├── roff2html.mjs Man page (roff) → HTML renderer
│ ├── build.mjs Generates resume.html, cv.html, man/ from Full-CV
│ └── build-pdf.mjs Compiles assets/*.pdf with Tectonic
├── templates/
│ ├── shell.html Themed page template (particles + glass nav)
│ └── man.html Terminal-style template for man pages
├── assets/
│ ├── resume.pdf Generated by build-pdf.mjs (not committed)
│ ├── cv.pdf Generated by build-pdf.mjs (not committed)
│ ├── gpg.asc GPG public key
│ └── v86/
│ ├── v86_all.js v86 emulator library
│ ├── v86.wasm v86 WebAssembly binary
│ ├── seabios.bin BIOS firmware
│ ├── vgabios.bin VGA BIOS firmware
│ ├── buildroot-bzimage.bin Buildroot Linux kernel + initrd
│ ├── 9p-rootfs/ 9p virtio shared filesystem
│ │ ├── src/ Source files for rootfs
│ │ ├── out/ Generated fs.json + .bin blobs
│ │ └── rebuild.sh Regenerate out/ from src/
│ └── cors-proxy-worker.js Cloudflare Worker for VM HTTP networking
└── dvxb.io.7 Man page source for /man/dvxb.io.7
resume.html, cv.html, man/index.html, and man/dvxb.io.7.html are generated
from the private aptitudepi/Full-CV repo and committed nowhere — they exist only
inside the Pages artifact.
tools/tex2html.mjsparses the Full-CV macros (\resumeItem,\resumeSubheading,\section, inline math,itemize, …). It throws aTexParseErroron anything it can't render, which lets CI detect content the parser has grown out of sync with.tools/roff2html.mjsrendersdvxb.io.7into a terminal-styled man page.tools/build.mjswraps each body intemplates/shell.html(particles + glass nav) ortemplates/man.html(terminal theme).FULL_CV_DIRpoints at the checkout.tools/build-pdf.mjsstrips the pdfTeX-only lines (\pdfgentounicode,\input{glyphtounicode}) and compilesassets/resume.pdf/assets/cv.pdfwith Tectonic.
- Virtual filesystem — A
Mapof paths to content strings (e.g.,/home/devkumar/about.txt). Supportscatandls. - Commands (25+): whoami, hostname, date, uptime, pwd, uname, cat, ls, echo, clear, neofetch, resfetch, about, fortune, cowsay, help, history, crt, noise, weather, hn, md, cv, matrix, vm, ai, ai-models
- Neofetch — Renders ASCII art alongside system and resume info lines. The art is a 52-row pixel portrait with per-pixel ANSI true color.
- Boot sequence — On page load, prints simulated kernel messages, then runs neofetch and shows the prompt.
- Auto-correction — Mistyped commands are caught with Levenshtein distance ≤ 2 and suggest the closest match.
- Tab completion — Tab cycles through command names, VFS paths, and
./-prefixed files. Bell on no match. - Command history — Up/down arrows cycle through previous commands.
historyprints the full list.
- Uses the V86 constructor with WASM, a 64MB heap, NE2000 network via
fetchbackend, 9p filesystem from a static JSON manifest, and BIOS/VGA BIOS/kernel images. - Serial I/O:
serial0-output-bytecallback writes to xterm,serial0-inputsends keystrokes (including control characters) from the terminal. - Ctrl+C, Ctrl+D, and other control codes pass through to the VM's serial port.
- The 9p
host9p on /mntboot message is cosmetic — the mount succeeds despite the duplicate-attempt warning.
- The VM uses the v86
fetchnetwork backend, which proxies HTTP/HTTPS through the browser'sfetch()API. - A Cloudflare Worker (
cors-proxy-worker.js) deployed at0.supernovadkb.workers.devacts as a CORS proxy, restricted by origin allowlist (dvxb.io,*.dvxb.io,localhost:*). - Only HTTP/HTTPS is supported — raw TCP (telnet, SSH) is not available due to browser
fetch()limitations.
- Renders 600 particles with velocity, age, and seed attributes per vertex in a custom BufferGeometry.
- Two shader programs: update (position/velocity integration) and render (smooth circles with fading).
- Mouse hover creates a repulsion/attraction force. Connection lines drawn between nearby particles.
- Uses a GPU
transformFeedbackpattern for all computation on the GPU — no CPU physics loop.
revealelements fade up in a staggered cascade viaIntersectionObserver.- Skill bars animate from 0 to target width with Anime.js
scaletransforms. - Social links spring-scale on hover.
- Magnetic text — Section headings subtly shift toward cursor with lerped spring physics via
requestAnimationFrame. - Aura orbs — Per-section
::before/::afterradial gradients withfilter: blur(60px)and slow CSS drift animation. - Galaxy button circle-morph — Contact buttons morph from circle to full-width on click with Anime.js.
- MagicCard 3D tilt — Project cards rotate toward cursor with spring physics, sibling dimming, and shimmer sweep.
Token-based design: tokens.css defines color palette (slate-gray, blue, violet, green), spacing scale (4px base), font stack, and breakpoints. Component styles import these tokens via CSS custom properties.
python3 -m http.server 8000
# Open http://localhost:8000No build step required for the main page — the site uses ES module <script type="module"> natively.
To regenerate the resume/CV pages locally (needs a Full-CV checkout beside this repo):
bun tools/build.mjsThis writes resume.html, cv.html, and man/ (all gitignored). The PDF build
additionally needs tectonic on the PATH:
The 9p rootfs is compiled from assets/v86/9p-rootfs/src/. After modifying source files:
cd assets/v86/9p-rootfs
./rebuild.shThis regenerates out/fs.json and out/*.bin (content-addressed blobs).
Deployed via GitHub Pages from the main branch with a custom domain (dvxb.io)
and CNAME record. The Pages artifact is built entirely in CI — static.yml checks
out aptitudepi/Full-CV (needs the FULL_CV_PAT secret, a fine-grained PAT with
Contents: Read on that repo only), runs the generators, and uploads the result.
A daily schedule rebuilds so the resume/CV track Full-CV changes without a site push.
After each successful deploy, CI generates sitemap.xml from
tools/site-urls.mjs, publishes an IndexNow key
file from the INDEXNOW_KEY secret, and POSTs that same URL list to
api.indexnow.org (Bing, Yandex, and other partners — not Google). Committed
robots.txt points crawlers at the generated sitemap for every engine,
including Google.
Built with v86, xterm.js, Three.js, Anime.js, and Cloudflare Workers.