This repository contains the source for apurve.xyz, a static single-page personal portfolio for Apurve Karanwal.
The site is intentionally dense and playful. It is not just a profile page. It mixes portfolio content with a faux operating-system aesthetic, interactive overlays, mini-games, ambient animation systems, browser-audio feedback, keyboard-triggered easter eggs, a fake terminal, an AR viewer, and several hidden "toy" features.
This README is written as both:
- a product/feature document explaining what the website does
- a maintenance document explaining how the current implementation works
- 1. Project Overview
- Project Preview
- Feature Matrix
- 2. Stack and Dependencies
- 3. Repository Layout
- 4. Running the Site Locally
- 5. High-Level Experience Flow
- 6. Full Section-by-Section Content Map
- 7. Every Visible Control and What It Does
- 8. Hidden Features, Secret Modes, and Easter Eggs
- 9. CLI Terminal Command Reference
- 10. Mini-Games and Interactive Systems
- 11. External Integrations and Browser APIs
- 12. DOM and ID Reference
- 13. Styling and Visual System
- 14. JavaScript Architecture and Behavior Map
- 15. Link and Asset Inventory
- 16. Maintenance Guide
- 17. Known Quirks and Current Limitations
Suggested additions for future polish:
- hero section screenshot
- Pong modal screenshot
- CLI terminal screenshot
- Matrix mode screenshot
- radio player screenshot
- AR modal screenshot
If you want to turn this README into a public-facing showcase, create a docs/ or assets/readme/ folder and add:
assets/readme/hero.png
assets/readme/pong.png
assets/readme/cli.png
assets/readme/matrix.png
assets/readme/radio.png
assets/readme/ar.png
Then add standard Markdown image blocks such as:
| Area | Present | Notes |
|---|---|---|
| Static portfolio content | Yes | Main portfolio sections are all in index.html |
| Responsive layout | Yes | Tailwind utilities plus custom CSS |
| Custom theme system | Yes | Root color variables in styles.css |
| Animated preloader | Yes | Fake boot/loading sequence |
| Typewriter hero subtitle | Yes | Started after preloader finishes |
| Live time/date panel | Yes | Updates once per second |
| Social/profile links | Yes | GitHub, Discord, X, LinkedIn, Medium |
| Resume download flow | Yes | Modal-confirmed download |
| Project repo launcher modal | Yes | Featured repo links route through code modal |
| Pong mini-game | No | Removed |
| CLI terminal overlay | Yes | Portfolio shell commands (whoami, ls, cat, etc.) |
| Konami code | No | Removed |
| Boss fight | No | Removed |
| Matrix mode | No | Removed |
| CRT mode | No | Removed |
| Dark-web mode | No | Removed |
| Self-destruct effect | No | Removed |
| Sandbox JS executor | No | Removed |
| Heist mini-game | No | Removed |
| Custom cursor and trail | Yes | Mouse-following cursor system |
| Ambient particle/canvas systems | Yes | Spiderweb, glyphs, lines, particles |
| Lo-fi draggable radio | Yes | Hidden YouTube-backed playback |
| AR viewer | Yes | model-viewer with remote astronaut model |
| Backend/API data layer | No | No app backend or fetch usage |
| Persistent state | No | All UI/game state resets on refresh |
| Build pipeline | No | Static files only |
| Automated tests | No | No testing setup in repo |
The website is a static cyberpunk / retro-console themed portfolio built with plain HTML, CSS, and JavaScript.
Primary goals of the site:
- present Apurve Karanwal's profile, projects, and credentials
- showcase personality through an intentionally gamified interface
- turn ordinary portfolio actions into interactions
- hide several surprise features for users who explore the page
Core user-facing content areas:
- hero/profile section
- key skills
- open-source contributions
- featured projects
- academic/university projects
- embedded systems / IoT work
- Hela Labs ambassador section
- experience
- certifications
- education and awards
- blogs / Medium stories
- hobbies / interests
- contact CTA
Core experience-enhancement systems:
- animated preloader
- live time/date panel
- terminal-style project repo launcher
- resume confirmation modal
- Pong mini-game
- pseudo-shell CLI
- Matrix override sequence
- boss fight click-game
- sandbox code injector
- password guessing heist mini-game
- draggable lo-fi radio
- AR viewer
- audio feedback
- custom cursor and trail
- CRT mode
- dark-web mode
- self-destruct animation
index.htmlstyles.cssscript.js
This repo has:
- no framework
- no bundler
- no package manager manifest
- no build step
- no backend
It is a static frontend.
From index.html:
- Tailwind CDN:
https://cdn.tailwindcss.com - Google Fonts
Inter - Google Fonts
Press Start 2P - Google Fonts
Space Mono - Font Awesome
6.5.2 - Three.js
r128 model-viewer3.1.1
Loaded dynamically by script.js:
- YouTube IFrame API:
https://www.youtube.com/iframe_api
- DOM APIs
- Canvas 2D API
- SVG DOM APIs
- Web Audio API
- Intersection Observer API
requestAnimationFramesetInterval/setTimeoutwindow.open- responsive
resizehandlers
- no
fetch - no REST or GraphQL calls
- no authentication
- no cookies
- no
localStorage - no
sessionStorage - no service worker
- no client-side router
.
|-- CNAME
|-- index.html
|-- README.md
|-- resume.pdf
|-- script.js
|-- styles.css
`-- wa.png
index.html
- contains the entire page structure
- contains all visible sections
- defines every modal, overlay, canvas, floating widget, and interactive anchor/button
- loads all third-party CSS/JS resources
styles.css
- defines the color palette
- defines the pixel/block visual language
- contains modal, overlay, game, animation, cursor, and responsive styling
- contains multiple special-mode styles such as CRT, glitch, and hidden-feature presentation
script.js
- contains all runtime behavior
- builds animated background elements
- powers modals, CLI, games, secret modes, audio, radio, AR, and easter eggs
resume.pdf
- downloadable resume asset
wa.png
- hero/profile image
CNAME
- custom domain record pointing to
apurve.xyz
No install step is required.
Open index.html in a browser.
Using Python:
python -m http.server 8080Then visit:
http://localhost:8080
Serving locally is useful because some embedded features behave more predictably over HTTP than with a raw file:// URL.
What the user sees from first load:
- Preloader overlay blocks the page.
- Progress bar fills with fake staged loading text.
- Preloader fades out and scrolling becomes available again.
- Hero subtitle starts typewriting.
- Ambient visuals continue running in the background.
- Hover/click audio becomes available if the user unmutes.
- The user can browse standard portfolio sections.
- If they explore further, they can discover games, terminal commands, hidden sequences, and special modes.
There is no login, no onboarding, and no data entry requirement. The site is discoverable immediately.
This section documents what content currently exists in the page, in order.
Brand text:
APURVE.DEV
Header actions:
- Resume
- GitHub
- Discord
- X
- Medium
- Pong
- CLI
Contains:
- circular profile image from
wa.png - main title
APURVE KARANWAL - typewriter subtitle
- primary CTA
> EXECUTE_WORK_VIEW - secondary CTA
AR MODE
Typewriter text:
> **[STATUS: ONLINE]** Aspiring Full-Stack Developer | IoT Engineer. Turning ideas into interactive systems.
Displays:
STATUS: NOMINALUPTIME: 74:12:05- live time
- live date
LOCATION: ASIA/DELHI
Also contains the classified trigger area:
- warning label
- red secret button
- Konami-code hint text
Current visible skills:
- Python
- FastAPI
- Node.js
- JavaScript
- HTML5
- CSS3
- Express.js
- Git/GitHub
- Docker
- Cloudinary
- Multer
- MySQL
- SQLite
- IoT
- NodeMCU
- Arduino
- MongoDB
Current cards:
FOSS-Community/progress-trackercoming soon...coming soon...
Documented contribution for the first card:
- improve error handling
- add Node.js check
- auto
.htmlextension - wrap in
main()
Current cards, in displayed order:
- PNGProtect
- memepage
- pyOCR
- mdfmt
- Cha-Ching!
- RAG PIPELINE
- WOMEN SAFETY SYSTEM
- CipherVault
- TextForge
- HOME AUTOMATION
- Expense Tracker
- COVID-19 TRACKER
- SMART IRRIGATION
- Securo
- Shirt Smith
- coming soon...
- coming soon...
- coming soon...
These cards are special because their > VIEW_REPOSITORY buttons do not open immediately. They route through the code-session modal first.
Current cards:
- CS50 Python
- Web Development Fundamentals
- Design Thinking
- coming soon...
- coming soon...
- coming soon...
Current bullet cards:
- Women Safety System
- Alcohol Detection System
- Smart Plant Monitoring System
- Bluetooth Remote Control Car
- Keypad Door Unlock System
- Awaken Driver Glasses
Contains:
HELA LABStitleRegional Ambassadorlabel- descriptive ecosystem/ambassador copy
- CTA
> ACCESS_PORTAL - CTA
[?] INQUIRE
Professional track items:
- IoT & Robotics Project Developer (Personal)
- Active Member: FOSSCU-K
- Active Member: Geek Room KIET (GRK)
- Active Member: Google Developer Group (GDG)
Certifications items:
- CS50P - Introduction to Programming with Python
- Inspire MANAK Award (2x)
Current cards:
- B.TECH (IT), KIET Group of Institutions, 2025-2029
- FIRST PRIZE WINNER, Bansuri Mahotsav 2022
Current article cards:
Single Threaded architecture of RedisComing SoonComing Soon
Current published article date shown:
11 May 2026
Section also includes:
> VISIT_MEDIUM
Current interests named in text:
- piano
- songs/music
- PC games
- books
Contains:
- large call-to-action heading
- invitation to collaborate or hire
- button
> SEND_MESSAGE_EMAIL
Contains:
System Status: OK. Built by Apurve with heart | All rights reserved 2025- hidden red nuke button in the lower-right corner
This section is intentionally exhaustive.
DOM id:
resume-download-btn
Behavior:
- default anchor download is intercepted
- opens the resume modal instead
- modal message is randomized from a small set of humorous lines
- confirm creates a temporary anchor and downloads
resume.pdf - downloaded filename is forced to
Apurve_Karanwal_Resume.pdf
Close paths:
- click
> ABSOLUTELY! DOWNLOAD NOWto download - click
> MAYBE LATER...to cancel - click outside modal to close
Opens:
https://github.com/ApurveKaranwal
Opens:
https://discord.com/users/1365348956074147860
Opens:
https://x.com/Apurve_Karanwal
Opens:
https://www.linkedin.com/in/apurvekaranwal/
Opens:
https://medium.com/@apurvekaranwal282
DOM id:
pong-game-btn
Behavior:
- opens Pong modal
- resets score to
0 - 0 - resets speed level to
1x (Normal) - resets ball to center
- starts the game loop
- resizes the canvas to fit container width on smaller screens
DOM id:
cli-mode-btn
Behavior:
- opens terminal overlay
- focuses terminal input
- prints welcome banner
Behavior:
- links to
#projects - scrolls to Featured Projects
DOM id:
ar-mode-btn
Behavior:
- opens
#ar-modal - shows
model-viewerwith remote astronaut model
DOM id:
secret-override-btn
Behavior:
- triggers Matrix override sequence directly
Scope:
- only on
.project-cardlinks whose text includesVIEW
Behavior:
- prevents direct navigation
- finds the enclosing project card title
- opens the code modal
- simulates coding/session boot lines
- reveals the modal repo button after the final line
- modal repo button opens the original GitHub link in a new tab
Behavior:
- regular outbound links
- no special modal flow
Behavior:
- regular outbound links
Behavior:
- regular outbound links to Medium
Behavior:
- opens
https://helalabs.com
Behavior:
- opens default mail client using
mailto:apurvekaranwal2025@gmail.com
Behavior:
- opens default mail client to the same email address
Footer hidden red button
DOM id:
nuke-btn
Behavior:
- starts self-destruct countdown
- visually drops major page elements after countdown finishes
DOM id:
audio-toggle
Behavior:
- initializes audio context on first use
- switches between muted and unmuted state
- swaps icon classes between volume-off and volume-on
8. Hidden Features, Secret Modes, and Easter Eggs
Exact key sequence:
ArrowUp ArrowUp ArrowDown ArrowDown ArrowLeft ArrowRight ArrowLeft ArrowRight b a
Behavior:
- sequence is tracked globally
- if
startBossFightexists, the boss fight begins - after boss defeat, Matrix sequence starts
- if not available, Matrix starts directly
Triggered by:
- secret red button
- CLI command
matrix - Konami code -> boss fight -> win
Sequence flow:
- page gets
ui-shakeandui-glitchclasses - short delay
- hacking terminal overlay appears
- logs print one by one:
INITIATING OVERRIDE PROTOCOL...BYPASSING MAINFRAME FIREWALL...DECRYPTING AES-256 KERNEL...ACCESS GRANTED.WAKING UP...
- hacking terminal hides
- Matrix rain begins on full-screen canvas
- achievement popup appears
Matrix rain details:
- glyph source combines Katakana, uppercase Latin letters, and digits
- draw interval runs every
30ms - mouse proximity changes nearby characters to bright white and scatters them slightly
- clicking the Matrix canvas closes the effect once
Achievement popup:
- title
Achievement Unlocked - description
The Red Pill
Triggered by:
- Konami code
Behavior:
- overlay displays a ghost icon as the boss
- health starts at
10 - health bar width reflects health
- boss moves left/right with random vertical jitter
- each click does one damage
- at zero health:
- movement stops
- explosion class is applied
- overlay closes
- Matrix starts after short delay
Triggered by typing:
retro
Behavior:
- toggles
crt-modeonbody
Triggered by typing:
tor
Behavior:
- toggles
dark-web-modeonbody - attempts to rename selected headings
- changes header resume label to
DECRYPT DOSSIER - toggling off restores the resume label and any captured heading text
Triggered by:
- clicking hidden red footer button
Behavior:
#nuke-overlaybecomes visible- countdown starts from
05 - after countdown:
- overlay hides
- all
section,header,footer, andcanvaselements get a fall-down treatment - elements are translated downward and randomly rotated
This is visual only. It does not delete content or reload the page.
Accessible via:
- CLI command
sandbox
Behavior:
- opens
#sandbox-modal - textarea accepts JavaScript
- clicking
EXECUTEruns:
new Function(code)();- errors are shown with
alert
This feature gives full execution inside page context. It is intentionally unsafe.
Accessible via:
- CLI command
hack
Behavior:
- opens
#heist-modal - randomly selects 6 words from an 8-word pool
- one of those 6 is the password
- user clicks candidate words
- log reports exact position matches
- attempts start at
4
Word pool:
- HACKER
- SYSTEM
- SECURE
- ACCESS
- CYBER
- MATRIX
- CODING
- FUTURE
Success path:
- exact match found
- success message shown
- modal closes
- alert congratulates the user
Failure path:
- attempts reach zero
- system locked message shown
- modal closes
Behavior:
- custom cursor moves to live mouse position
- trailing element eases behind the main cursor
- body gets
cursor-hoverwhile hovering interactive elements
Behavior:
- radio widget is shown automatically
- can be dragged by its header
- uses YouTube as hidden audio source
- visualizer bars animate while music is playing
Video used:
36YnV9STBqc
Behavior:
- opens full-screen modal
- shows
model-viewer - uses remote astronaut model
- supports WebXR / Scene Viewer / Quick Look where available
The CLI overlay is not decorative only. It supports multiple commands.
Shown when CLI opens:
Welcome to APURVE.DEV Terminal v1.0.0
Type 'help' to see available commands.
- input is trimmed
- input is lowercased before routing
- command is echoed with prompt
- output is appended to terminal body
help
- prints built-in command list
whoami
- prints:
- name
- role
- location
- status
- short bio
ls
- prints fake filesystem entries:
skills.txtprojects.direducation.txthobbies.txtresume.pdftop_secret.enc
cat skills.txt
- prints language, backend, database, tools, and hardware stacks
cat education.txt
- prints B.Tech summary
cat hobbies.txt
- prints four hobbies/interests
cat top_secret.enc
- prints access denied / encryption message
sudo cat top_secret.enc
- prints:
- decrypting filler
The cake is a lie.- hint to try
matrixorretro
cat <anything else>
- prints no-such-file error
echo <text>
- prints the provided text
date
- prints
new Date().toString()
matrix
- prints initialization message
- closes CLI after delay
- launches Matrix sequence
retro
- toggles CRT mode
sandbox
- closes CLI
- opens sandbox modal
hack
- closes CLI
- opens heist mini-game
sudo <anything else>
- prints a fake failed sudo/password flow
open projects
- closes CLI
- scrolls to
#projects
open skills
- scrolls to
#skills
open contact
- accepted by parser
- no matching
#contactelement currently exists
open about
- accepted by parser
- no matching
#aboutelement currently exists
clear
- clears terminal output
exit
- closes the overlay
Any other non-empty input:
- prints
Command not found: <cmd>
Pong is a local two-player game rendered on #pong-canvas.
Controls:
- left paddle:
W - left paddle down:
S - right paddle up:
ArrowUp - right paddle down:
ArrowDown - pause/resume:
Space - speed selection:
1to5
Speed labels:
1->0.5x (Snail)2->1x (Normal)3->1.5x (Fast)4->2x (Very Fast)5->2.5x (Insane)
Game state variables:
gameRunninggamePausedleftScorerightScoreballSpeedspeedLevel
Game mechanics:
- paddles move only within canvas bounds
- ball bounces off top and bottom walls
- ball bounces off paddles
- score increments when ball exits left or right
- ball resets to center after each point
- reset angle contains slight randomness
Touch support:
- four on-screen touch buttons map to keyboard directions
- touch and mouse events are both handled on those controls
Responsive behavior:
- opening the modal recalculates canvas dimensions based on container width
Preloader details:
- random increments from
1to5 - subtext changes based on progress range
- final state switches label to
ACCESS GRANTED - final delay before fade-out keeps the effect feeling intentional
Purpose:
- converts plain repo links into a staged "enter coding session" interaction
Message sequence:
npm start && open_editorbrewing_coffee()...opening_vscode()...activating_lofi_beats()...oh_no()... debugging_mode_ON!!CODE_SESSION_READY! Happy Coding!
Timing:
- each line appears every
400ms - repo-view button appears after final line
Updates every second using locale formatting.
Dynamic fields:
#live-time#live-date
Several continuous visual systems are always active:
- blockchain nodes
- floating symbols
- hex grid
- rising particles
- random SVG connection lines
- spiderweb canvas network
- scanline overlay
- floating skull
Sound generation is procedural, not file-based.
Profiles:
- hover -> sine
- click -> square
- matrix -> sawtooth
Attachment points:
- all anchors
- all buttons
.project-card.pixel-block-3d
Platform/profile links:
https://github.com/ApurveKaranwalhttps://discord.com/users/1365348956074147860https://x.com/Apurve_Karanwalhttps://www.linkedin.com/in/apurvekaranwal/https://medium.com/@apurvekaranwal282https://helalabs.commailto:apurvekaranwal2025@gmail.com
Project repository links:
https://github.com/FOSS-Community/progress-tracker/commit/2c9d980a8aef91ad658eb2def9600de67bf0a488https://github.com/ApurveKaranwal/PNGProtecthttps://github.com/ApurveKaranwal/memepagehttps://github.com/ApurveKaranwal/pyOCRhttps://github.com/ApurveKaranwal/mdfmthttps://github.com/ApurveKaranwal/Cha-Chinghttps://github.com/ApurveKaranwal/RAG_pipelinehttps://github.com/ApurveKaranwal/WOMEN_SAFETY_SYSTEMhttps://github.com/ApurveKaranwal/CipherVaulthttps://github.com/ApurveKaranwal/TextForgehttps://github.com/ApurveKaranwal/Home-Automationhttps://github.com/ApurveKaranwal/Expense_Trackerhttps://github.com/ApurveKaranwal/Covid-19-Tracker-OLed-Projecthttps://github.com/ApurveKaranwal/SMART_IRRIGATIONhttps://github.com/ApurveKaranwal/Securohttps://github.com/ApurveKaranwal/ShirtSmithhttps://github.com/ApurveKaranwal/CS50_Pythonhttps://github.com/ApurveKaranwal/WebDesign_Assignment_MSE1https://github.com/ApurveKaranwal/DT_Assignment
Blog/article links:
https://medium.com/@apurvekaranwal282/the-counterintuaitive-genius-of-redis-why-single-threaded-is-its-biggest-strength-9389c7d34d27https://medium.com/@apurvekaranwal282
Runtime-loaded resources:
https://modelviewer.dev/shared-assets/models/Astronaut.glbhttps://www.youtube.com/iframe_api
Tailwind
- utility-first classes in HTML
Font Awesome
- icons for social buttons, buttons, overlays, and widgets
Google Fonts
Interfor body/UI textPress Start 2Pfor pixel headingsSpace Monofor terminal/tech flavor
model-viewer
- AR and 3D model display
YouTube IFrame API
- hidden embedded audio source for the draggable radio
Three.js
- script is included
- no obvious active runtime usage in
script.js
Important IDs currently present in the page:
main-bodyhexagon-gridcode-modalcode-project-namecode-terminalcode-view-btncode-close-btnresume-modalresume-messageresume-confirm-btnresume-cancel-btnpong-modalpong-canvaspong-touch-controlstouch-left-uptouch-left-downtouch-right-uptouch-right-downpong-scorespeed-indicatorpong-close-btnpreloaderloader-textprogress-barloader-subtextaudio-toggleaudio-iconmatrix-canvasresume-download-btnpong-game-btncli-mode-btnhero-typewriterar-mode-btnsystem-statuslive-timelive-datesecret-override-btnskillsopen-sourceprojectsacademic-projectsmore-projectsambassador-roleexperienceeducationblogshobbiesnuke-btncli-mode-overlaycli-outputcli-inputnuke-overlaynuke-countdowncustom-cursorcursor-trailspiderweb-canvasboss-fight-overlayboss-health-barboss-charactercyber-skull-containercyber-skullradio-playerradio-headerradio-controlsradio-play-btnradio-visualizeryt-player-containersandbox-modalclose-sandbox-btnsandbox-editorrun-sandbox-btnheist-modalheist-attemptsheist-wordsheist-logsclose-heist-btnar-modalclose-ar-btnar-viewerhacking-terminalterminal-contentachievement-notification
This list is useful when editing script.js, because most behavior is manually wired by ID.
Current root variables from styles.css:
--color-bg-dark: #2c4241--color-card-main: #4a6c6b--color-card-border: #142120--color-accent-main: #b8e0e0--color-accent-secondary: #fcd34d--color-text-light: #e0f2f1--color-text-dark: #142120
Visual direction:
- pixel/block UI
- Minecraft-like earthy palette
- retro-console overlays
- heavy drop-shadow / pressed-button interaction
- mixed cyberpunk + arcade styling
Inter
- default body copy
Space Mono
- terminal copy
- labels
- supporting "tech" text
Press Start 2P
- headings
- hero title
- major labels and retro titles
- scrollbars are customized
- text selection colors are customized
- scanline overlay is animated
- pixel text flicker animation is reused across headings
- block/button elements use a pseudo-3D pressed effect
- project cards invert the interaction by lifting upward on hover
- several sections use staggered fade-in
- special modes rely on body-level class toggles
script.js currently uses two top-level DOMContentLoaded handlers.
- create blockchain nodes
- create floating symbols
- create hexagon grid
- create floating particles
- create SVG connecting lines
- wire code-session modal
- intercept project repository buttons
- wire resume modal
- wire Pong modal and game loop
- wire mobile Pong controls
- wire Pong keyboard controls
- start typewriter system
- run preloader
- update live clock/date
- register Intersection Observer for animated sections
- initialize audio system
- attach hover/click sound hooks
- wire audio toggle
- track Konami code
- set up Matrix sequence
- track mouse for Matrix interaction
- wire secret override button
- create custom cursor / trail behavior
- wire retro mode sequence
- wire nuke button
- wire CLI overlay and command parser
- start spiderweb canvas animation
- wire dark-web mode sequence
- define boss fight behavior
- animate cyber skull rotation
- wire sandbox modal
- define heist game
- wire AR modal
- wire lo-fi radio and YouTube player
The site uses local mutable variables instead of a formal state store. Examples:
audioCtxisMutedcurrentSequenceretroSequencetorSequenceisMatrixActivemouseXmouseYgameRunninggamePausedgameLoopIdisNukedisRadioPlayingytPlayer
The page uses many direct listeners:
- multiple
document.addEventListener("keydown", ...) - multiple
document.addEventListener("mousemove", ...) - button
clickhandlers - overlay click-to-close handlers
- resize handlers
- touch handlers
- mouse drag handlers
This is workable for a static site, but it means behavior is spread across the file and should be edited carefully.
Important function entry points in script.js:
openCodeModal(...)at line110openResumeModal()at line185downloadResume()at line195resetBall()at line351openPongGame()at line366closePongGame()at line394startTypewriter()at line463updateClock()at line513playSound(type)at line572triggerMatrix()at line666startMatrixRain()at line714window.startBossFight = function() { ... }at line1090window.initHeistGame = function() { ... }at line1177window.onYouTubeIframeAPIReady = function() { ... }at line1291onPlayerReady(event)at line1303
Important event-binding anchors in script.js:
- resume button click handler at line
205 - Pong open button binding at line
404 - audio toggle binding at line
617 - Konami sequence declaration at line
628 - retro sequence declaration at line
834 - nuke button handler at line
856 - CLI keydown command parser at line
898 - dark-web sequence declaration at line
1058 - sandbox execute binding at line
1166 - AR open/close bindings at lines
1243-1244
Important markup anchors in index.html:
- resume header button at line
153 - Pong button at line
195 - CLI button at line
202 - AR button at line
230 - system-status section at line
237 - secret override button at line
253 - skills section at line
266 - open-source section at line
291 - featured projects section at line
344 - academic projects section at line
618 - more-projects section at line
708 - ambassador section at line
764 - experience section at line
816 - education section at line
880 - blogs section at line
912 - hobbies section at line
1004 - footer nuke button at line
1041 - radio player at line
1083 - sandbox modal at line
1095 - heist modal at line
1107 - AR modal at line
1118
wa.pngresume.pdfstyles.cssscript.js
- Google fonts CSS
- Font Awesome CSS
- Tailwind CDN script
- Three.js script
model-viewermodule script- YouTube IFrame API
- remote
.glbmodel
CNAME currently contains:
apurve.xyz
Edit:
index.html
Edit:
:rootvariables instyles.css
Edit:
- Featured Projects markup in
index.html
Important note:
- project repo buttons in
.project-cardare intercepted automatically only when the anchor text containsVIEWand thehrefcontainsgithub
Replace:
resume.pdf
If you also want a different downloaded filename:
- update
link.downloadinscript.js
Edit in script.js:
- YouTube
videoIdcurrently set to36YnV9STBqc
Edit in index.html:
#ar-viewersrc
Primary logic locations in script.js:
- Konami sequence
- Matrix functions
- retro mode sequence
- dark-web mode sequence
- CLI command handlers
- sandbox modal execution
- heist initializer
- nuke button handler
Edit:
- the large
if / else ifchain under the CLI input keydown handler inscript.js
Remember to update:
- the
helpoutput text - this README command reference
Recommended approach:
- create
assets/readme/ - capture desktop screenshots for hero, CLI, Pong, Matrix, radio, and AR
- export optimized PNG or WebP assets
- insert them near the top under
Project Preview
Suggested naming:
hero-desktop.pngcli-overlay.pngpong-modal.pngmatrix-mode.pngradio-player.pngar-modal.png
A good future refactor would separate:
- content data into JSON or JS objects
- rendering from content
- modal/game logic into named modules
- repeated event wiring into smaller functions
That would reduce how much hardcoded copy currently lives in index.html.
Potential improvements, ordered by practical value:
- add real README screenshots/GIFs
- document deployment workflow explicitly
- add contribution guidelines if the repo becomes public-collaboration friendly
- add a changelog for notable UI/game additions
- split
script.jsinto modules by system: audio, CLI, games, overlays, secrets - centralize selectors in a single DOM map
- move repeated strings and project data into a structured config
- remove unused dependencies such as Three.js if it remains unused
- improve keyboard focus visibility across overlays
- add escape-key close behavior for modals
- improve AR fallback messaging for unsupported devices
- add visible help/hint affordances for hidden features
- add reduced-motion handling for users who prefer less animation
- reduce the number of continuously running animation loops
- pause background animation systems when tabs are hidden
- compress image assets
- lazy-load optional heavy systems where possible
- remove or gate the sandbox feature in public production builds
- add linting and formatting
- add a minimal smoke-test checklist
- add source comments around the most coupled event flows
Edit the corresponding anchor href in index.html.
If the card is a Featured Project card, it will continue using the code modal automatically.
This section documents the current implementation honestly.
The CLI parser supports:
open contactopen about
But index.html currently has no:
id="contact"id="about"
So the terminal behaves as if it can open them, but no scroll target exists.
The script looks for:
h2.pixel-text
Many important section headings are h3, so some intended heading renames may not happen.
The script tag is present in HTML, but the current JavaScript does not appear to use Three.js directly.
new Function(code)() executes arbitrary code in page context. This is fine as a self-authored static novelty feature, but it is not safe to reuse in a shared or trust-sensitive environment.
Examples:
- uptime
- location string
- project descriptions
- education dates
- blog card data
There is no CMS or data file.
These states reset on refresh:
- mute/unmute state
- dark-web mode
- CRT mode
- terminal history
- game state
- radio state
- Matrix state
Not present in this repo:
- tests
- lint config
- formatter config
- CI pipeline
The line numbers documented in this README match the source as inspected during this documentation pass. If index.html or script.js changes substantially, those references should be refreshed.
A few decorative characters in the source appear to have passed through imperfect encoding at some point. They do not stop the site from functioning, but they are worth cleaning if polish matters.
This portfolio is a static frontend with much more interaction than a typical personal website. The visible content is straightforward, but the site experience depends heavily on script.js: that file controls modal routing, games, keyboard secrets, audio, animation systems, the fake CLI, the radio player, and the AR viewer.
If you maintain this project, treat it as a small interactive application rather than a simple landing page.