Public site for ronitnath.com — personal landing page over a starfield background plus a private-events RSVP system. The home route renders one card: name, tagline, and four links (GitHub, Instagram, LinkedIn, Email).
The events surface uses SQLite-backed admin tooling, invite links, self-signup waitlists, RSVP forms, and location privacy controls.
- Server —
axum 0.8+askama 0.15(SSR HTML). - UI —
solid-js 1.9islands built byvite 7with@vanilla-extractgenerating typed CSS at build time. Package manager:bun. - Runtime — Rust
1.94.1pinned viarust-toolchain.toml. Multi-stageDockerfileproduces adebian:bookworm-slimimage.
GET /
└─ axum route → render::render_home(&state)
└─ reads assets::AssetManifest (ui/dist/.vite/manifest.json)
└─ HomeTemplate { script_src, css_files, … }
└─ askama renders templates/home.html (extends _base.html)
<link rel="stylesheet" href="/ui/dist/assets/site-<hash>.css">
<script type="module" src="/ui/dist/assets/site-<hash>.js">
<div data-island="mode-toggle"></div>
└─ browser loads site.ts
└─ hydrateIslands(registry) mounts <ModeToggle/> into each
element with a `data-island` attribute matching a registry key.
GET /events
└─ axum route → render::render_events(&state)
└─ askama renders templates/events.html (extends _base.html)
Vite's manifest plumbs hashed filenames through the server at startup so the HTML always references the current build artifacts.
src/
main.rs # tokio runtime, config load, router wiring
config.rs # host / port / domain from config.toml + env overrides
assets.rs # vite manifest parser → entry + css lookup
db.rs # sqlite pool + migrations
events/ # event models, storage, service logic, tokens, QR helpers
render.rs # HomeTemplate + render helpers
routes.rs # axum Router + per-path handlers
templates/
_base.html # <html> shell, starfield + nebula layers, inline
# theme-cookie hydrator, body block, manifest links/scripts
home.html # home-card: name, tagline, 4 social links
events.html
event_detail.html
event_rsvp.html
event_signup.html
ui/
entries/site.ts # sole vite entry → compiled to ui/dist/assets/
src/islands/
hydrate.ts # scans for [data-island], mounts Solid components
registry.ts # Solid island registry
mode-toggle.tsx
admin-event-controls.tsx
admin-events-list.tsx
rsvp-form.tsx
signup-form.tsx
src/styles/
theme.css.ts # OKLCH dark + light palettes; Agency Bold display
global.css.ts # style entrypoint importing split files
base.css.ts # font, reset, base document styles
atmosphere.css.ts # starfield and nebula background
layout.css.ts # nav and main layout
pages.css.ts # home and events page styles
mode-toggle.css.ts
static/
favicon.png
fonts/agency-bold.ttf # served at /static/fonts/agency-bold.ttf
config.toml # default host/port/domain (env overrides)
Dockerfile
- Dark and light share one palette model. Tokens are OKLCH. Light mode
is activated by
data-theme="light"on<html>. No separatedata-named-theme— selectors are flat[data-theme=…]. - Theme cookie.
__rn_theme. Read by the inline script in_base.htmlbefore paint to prevent FOUC. Written by theModeToggleisland on click. - Atmosphere is CSS-only. Three stacked starfield divs (
.stars-dim,.stars-med,.stars-bright) plus the nebula layer are backed by layered radial-gradient backgrounds with slow twinkle keyframes. No per-star JS. - Font.
Agency Boldfor the display heading, preloaded from/static/fonts/agency-bold.ttfin the base template head. Body text uses the system UI stack. - Events are data-backed. SQLite migrations live in
migrations/. Local runtime state is written underdata/, which is ignored by git.
docs/development.md— running locally and the edit loopdocs/deployment.md— building and shipping the container


