dvxb.io — Devkumar Banerjee
Personal portfolio featuring a browser-based x86 virtual machine, retro terminal UI, and interactive shell with 36 commands.
- Interactive terminal — Built with xterm.js. Supports 36 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. - Portfolio AI assistant — Type
ai <prompt>to query the assistant via a Cloudflare Worker proxy to a Groq-hosted cloud model (default), with optional local ONNX models switchable throughai-model. Network access is required in both modes.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/db/about.txt). Supportscatandls. - Commands (36): 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. Inside the guest, re-mount idempotently:mountpoint -q /mnt || mount -t 9p host9p /mnt(a bare re-mount printsDevice or resource busy).
- 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.
The terminal sparkline command draws the commit-activity chart with
lightweight-charts,
loaded lazily from jsDelivr only when the command runs (never at page load).
Powered by TradingView Lightweight Charts™.