Status: live at deets.solutions · Platform: static site on Cloudflare Pages — no framework, no build step, no dependencies
My personal website — a hand-built static site. Plain HTML/CSS/JS: no framework, no build step, no runtime dependencies. It doubles as a hub for recruiters (portfolio + resume) and for friends (the journals).
The home page is that hub: a header bar with name and Resume / GitHub / LinkedIn links over live section cards that show each tab's count and latest entry.
- SOTD — a Song-of-the-Day journal, scraped from a Discord channel by DeetsOTD and rendered as a sortable, filterable, searchable card grid with album art and 30-second previews.
- Movies — my Letterboxd film log: posters, star ratings, likes, rewatches, and reviews, with the same controls. Rewatches can be grouped per film or fanned out one card per sitting.
- DeetsRadio — shared listening rooms: one person plays, everyone
hears it in sync, with a queue, chat, and browsing the rest of the site
while the room keeps playing. Live against a Cloudflare Worker;
?mockis the dev opt-out. See docs/radio.md. - League — live League of Legends stats for me and friends, served by the DeetsLeague Cloudflare Worker (Riot API proxy + match database). The only tab that calls an API at runtime; champion and augment art comes from Riot's public CDNs.
- DeetsCities — a real-time hex-settlement board game in the spirit of
the classic (no trademarks anywhere), 3–6 players around a shared table
plus spectators. Live multiplayer against a Cloudflare Worker;
cities/?mockstill runs the real rules engine in-page against bot seats as a dev tool. Desktop only. See docs/cities.md. - DeetsMahjong — Hong Kong mahjong, locked to four seats, with
seating dice, a wall-break roll, claim windows, and HK half-spread
faan scoring. Live multiplayer against a Cloudflare Worker;
mahjong/?mockstill runs the real rules engine in-page against bot seats as a dev tool. Desktop only. See docs/mahjong.md. - DeetsPoker — no-limit Texas hold'em as a cash game, 2–12 seats:
fixed buy-in, real chip denominations at the betting line, side pots,
busts and re-buys, sit-outs that keep your stack on the felt, and
host-added bots in three difficulty tiers. Live multiplayer against a
Cloudflare Worker;
poker/?mockruns the same rules engine in-page as a dev tool. See docs/poker.md. - Cool Stuff I Did — a portfolio of projects, hand-written cards.
- Resume — the resume rendered in the site's design system, with a downloadable one-page PDF that is printed from the page itself.
Every page has a two-axis appearance system, picked from the Vibe menu in the header and remembered per visitor:
- Theme (color): Lilac, Green, Sepia, Moonlight, Black & Yellow, Black & Red
- Skin (shape, type, motion): Vanilla, Press, Ocean, Glass, Retro-Future
Any theme pairs with any skin — 30 combinations, driven entirely by CSS tokens. Nothing in the site's styles hardcodes a color or a geometry value.
First visits (no saved choice) follow the OS light/dark preference on both axes, landing on Press × Lilac in light or Retro-Future × Black & Red in dark.
index.html home hub (hero bar + live section cards via js/home.js)
sotd/ Song of the Day (page + generated songs.json)
movies/ Movie log (page + generated movies.json)
radio/ DeetsRadio listening rooms (talks to the DeetsRadio worker)
league/ League of Legends stats (talks to the DeetsLeague worker)
games/ the shared game foundation (table shell, transport,
seat colors, the worker's DO base) — docs/games.md
cities/ DeetsCities board game (talks to the DeetsCities worker)
mahjong/ DeetsMahjong (talks to the DeetsMahjong worker)
poker/ DeetsPoker (worker in the sibling ../DeetsPoker repo)
profile/ your account's home — name + color (docs/accounts.md)
auth/ sign-in landing pad (talks to the DeetsAccounts worker)
privacy/ privacy policy (the OAuth consent screen links here)
cool-stuff/ project portfolio
resume/ resume page + downloadable PDF (generated, see below)
styles/ token tiers (palette → themes → skin), then
chrome.css (shared, every page) + main.css (per-tab)
+ table.css (games) — docs/css-split.md
js/controls.js settings menu
js/account.js sign-in chrome + the profile state (docs/accounts.md)
js/toast.js shared toast host (docs/ui.md, "Toasts")
assets/fonts/ bundled faces (SIL OFL)
docs/ tech docs (see below)
scripts/ healthcheck, resume PDF rebuild, radio dev token
The journal data (songs.json, movies.json) is generated by tools in the
DeetsOTD repo and committed here; the site is served
completely flat.
resume/index.html is the resume's source of truth — its print stylesheet
is the PDF layout. After editing the resume content, run
powershell -File scripts/build-resume-pdf.ps1 to stamp the updated-on
date and regenerate resume/AdityaSundaram_Resume.pdf (headless Edge),
then commit both. Movie posters come from TMDB
(URLs only — this site uses the TMDB API but is not endorsed or certified
by TMDB).
- docs/architecture.md — the theme×skin token system, page/card anatomy, the toolbar kit, and per-tab details.
- docs/ui.md — the Vibe appearance picker and interactive chrome.
- docs/data.md — how the journal JSONs are generated and refreshed (DeetsOTD, Letterboxd exports, TMDB posters).
- docs/league.md — the League tab: worker architecture, data model, rate-limit guardrails, and what the Riot API can and can't reveal.
- docs/games.md — the shared game foundation: wire protocol, the table shell, the Durable Object base, and how to add a game. Read this first for anything game-related.
- docs/bots.md — how the games play themselves: where a
bot's brain lives, the
botActcontract, each game's decision order and scoring, the difficulty tiers, and how they were measured. - docs/cities.md — the DeetsCities board game: rules engine, board data, wire protocol, the bento layout, the identity / disconnect-grace / rejoin rules, and what's still unbuilt.
- docs/mahjong.md — DeetsMahjong: the HK rules engine, faan table, claim windows, hidden-info wire protocol, the identity / disconnect-grace / rejoin rules, and what's still unbuilt.
- docs/poker.md — DeetsPoker: the hold'em engine, the chip ladder, the Winnings ledger, stepping away (sit-out, the ante to return, the three re-join modes), and the phase-2 worker's to-do list.
- docs/stats.md — game stats (accounts phase 2):
standings, what each engine already counts and what it doesn't, the
results pipeline and D1 schema. Live since 2026-07-29 — the schema,
/ingest,/me/stats, and/me/exportall ship in DeetsAccounts.
Any static server from the repo root, e.g.:
python -m http.server 8787
Then open http://localhost:8787.
Cloudflare Pages, wired to this repo — push and it deploys.
_headers at the root sets max-age=0, must-revalidate on every .css and
.js, overriding Pages' four-hour default so a deploy can't pair fresh HTML
with a stale stylesheet in a returning visitor's browser.
MIT. Fonts under assets/fonts/ carry their own licenses — see
assets/fonts/NOTICE.txt.