No framework, no build step
Vanilla ES modules, hand-written DOM code, one stylesheet. Nothing transpiles or bundles. The source on GitHub is the source the browser runs.
Try a different filter.
This portfolio is also one of the projects. No framework, no build step, no bundler — every line ships to the browser exactly as written. Here is what runs underneath it.
Vanilla ES modules, hand-written DOM code, one stylesheet. Nothing transpiles or bundles. The source on GitHub is the source the browser runs.
Three.js is committed into the repository instead of pulled from a CDN at runtime. A CDN outage or a compromised package cannot change what this page loads — the dependency is pinned to bytes I reviewed.
The molten backdrop is a custom GLSL fragment shader — layered value noise and directional waves that react to scroll velocity and pointer position. No shader library, no post-processing stack.
script-src 'self' with a SHA-256 hash allow-listing the single inline block the page needs. No unsafe-inline. The cost is real and documented in the markup: change that block and the hash has to be recomputed.
Particle count, shadow-map resolution, pixel ratio, blur radius and scroll smoothing are tiered by device. Mobile runs a lighter scene with a faster scroll lerp so the camera never trails a touch flick.
The hero is a fixed WebGL canvas; a tall spacer drives a scroll fraction the render loop reads each frame. The 3D scene never unmounts — it blurs and settles in place while the project grid scrolls over it as normal document flow.
It is keyboard-navigable throughout: every overlay traps and restores focus, there is a real skip link, and asynchronous states announce through aria-live. Read the source →