Personal portfolio site for tech leadership, data platforms, streaming, cloud, and AI work. Content is authored as markdown under content/ and exported to static JSON for free GitHub Pages hosting.
Live site: https://sbkoth.github.io/
| Layer | Choice |
|---|---|
| UI | React 19 + interactive terminal (primary UX) |
| Build | Vite 8 + TypeScript 7 |
| Styling | Tailwind CSS 4 (@tailwindcss/vite, CSS-first @theme) |
| Data | TanStack Query (static JSON, staleTime: Infinity) |
| Content | Markdown + gray-matter → Zod-validated static JSON |
| Security | marked + isomorphic-dompurify for dialog HTML |
| Lint/format | Biome |
| Local dev | Optional Express 5 + Vite middleware |
| Production | Pure static SPA on GitHub Pages (base /) |
No runtime Node/Express/Postgres is required for production.
| Path | Purpose |
|---|---|
content/profile.json |
Name, title, bio, avatar, socials |
content/projects/*.md |
Project cards (frontmatter + markdown body) |
content/features/*.md |
Professional expertise cards |
content/services/*.md |
Service offerings |
uploads/ |
Images and files referenced as /uploads/... |
Run npm run export:content (also runs on predev / prebuild) to materialize client/public/data/*.json and copy uploads. Export validates every shape with Zod schemas in shared/schema.ts.
npm install
npm run dev # export content + Express + Vite HMR on port 5000
npm run check # TypeScript
npm test # unit tests (commands, sanitize, export, themes, …)
npm run lint # Biome check
npm run build # static export + Vite client + optional server bundle
npm run build:pages # client-only static build for Pages (VITE_BASE=/)Production base path is / (user site sbkoth.github.io).
Type help in the live terminal. Dispatch is data-driven from COMMAND_REGISTRY in client/src/terminal/commands.ts (handlers + help metadata + autocomplete).
Repo: https://github.com/sbkoth/sbkoth.github.io
.github/workflows/deploy-pages.yml runs:
npm cinpm run export:contentnpm run check+npm testVITE_BASE=/ npx vite build- Publish
dist/publicto thegh-pagesbranch
Pages source: Settings → Pages → Deploy from a branch → gh-pages / / (root).
Live: https://sbkoth.github.io/
- Markdown/HTML rendered in dialogs is sanitized (
client/src/lib/sanitize-markdown.ts). - External navigations use
rel="noopener noreferrer". - Static site includes a restrictive CSP meta tag in
client/index.html. - Treat repo Markdown as untrusted for rendering purposes.
- Vite 6 → 8, TypeScript → 7, Tailwind 3 → 4 (
@import "tailwindcss",@themetokens). - Zod 3 → 4; export pipeline validates with shared schemas.
- Heavy unused shadcn/Radix surface (recharts, carousel, day-picker, …) pruned.
- Command switch replaced by registry/map; Terminal hooks extracted to
hooks.ts.