Personal portfolio site. A single, self-contained index.html with a live WebGL
shader background, a custom-GLSL morphing 3D object, a cinematic HUD overlay, and
a type system built around the "Art & Science" idea (Fraunces serif + JetBrains Mono).
No build step. No dependencies to install. Three.js loads from a CDN at runtime.
Just open index.html in any modern browser. That's it.
If your browser blocks the CDN font/script over file://, run a tiny local server:
# Python 3
python3 -m http.server 8000
# then visit http://localhost:8000- On GitHub, click New repository. Name it (e.g.
art-and-science). Create it. - On the empty repo page, click uploading an existing file.
- Drag in
index.html,README.md, and.nojekyll. Commit. - Go to Settings → Pages. Under Build and deployment, set
Source: Deploy from a branch, Branch:
main/root. Save. - Wait ~1 minute. Your site is live at
https://YOUR-USERNAME.github.io/art-and-science/.
# from inside this folder
git remote add origin https://github.com/YOUR-USERNAME/art-and-science.git
git branch -M main
git push -u origin mainThen enable Pages as in step 4 above.
The initial commit author is a placeholder. To use your own identity:
git config user.name "Your Name" && git config user.email "you@email.com"thengit commit --amend --reset-author --no-editbefore pushing.
In Settings → Pages → Custom domain, add your domain and follow the DNS steps.
GitHub creates a CNAME file for you.
Everything lives in index.html.
| What | Where | Notes |
|---|---|---|
| Contact email | search b@brandonwalowitz.com |
appears twice (button + mailto:) |
| Social links | <footer> |
|
| Disciplines | const DISCIPLINES (top of <script>) |
edit names + descriptions |
| Credits marquee | const CREDITS |
add/remove client names |
| About facts | .facts block in HTML |
plain text |
| Colors | :root CSS variables |
--bg, --ink, accents |
| Share preview image | og:image meta (commented in <head>) |
add once you have a 1200×630 image |
The gallery under the client scroll and every individual project page are driven by
one array called PROJECTS in projects-data.js.
To add or edit a project: copy one { ... } block in projects-data.js and
change its fields. Keep each slug unique, because it becomes the page filename
(your-slug.html). Then regenerate the standalone pages:
node generate-project-pages.mjsproject.html is the reusable source template. The generator creates one project
HTML file for every entry, while the homepage and project pages share the same
external project data.
| Field | Used by | Notes |
|---|---|---|
slug |
both | URL id, lowercase-with-dashes |
title, category, year, summary |
gallery + page | |
accent: ["#hex","#hex"] |
both | gradient for placeholder cover/frames |
cover: "img/x.jpg" |
both | optional real cover image; replaces the gradient |
coverFit, coverPosition, coverBackground |
both | optional cover-crop controls |
intro, body: [...], details: [["k","v"]] |
page only | the case-study copy |
shots: [{image:"img/a.jpg"},{video:"YOUTUBE_ID"}] |
page only | supports images or YouTube embeds |
wide, fit, position, background, aspect |
page only | optional per-frame layout controls |
For images, place files in images/, commit them, and reference them as
cover:"images/project/cover.jpg" or shots:[{image:"images/project/01.jpg"}].
The restored archive projects intentionally include more work than the final
portfolio may need. Remove an object from projects-data.js and regenerate when
you decide to cut a project.
- Background field:
bgFragGLSL: palette + domain-warp amounts. - 3D object:
blobVertcontrols displacement (disp),blobFragcontrols the iridescent fresnel coloring. Mesh detail auto-lowers on mobile ininitGL().
- Vanilla HTML/CSS/JS, no framework
- Three.js r128 (CDN) for WebGL + custom shaders
- Graceful fallback to a gradient background if WebGL is unavailable
- Respects
prefers-reduced-motion; pauses rendering when the tab is hidden
Built in-house. © Brandon Walowitz, Art & Science.