The personal site of Tomi Gelo — software engineer, maker, and dad.
Live: tomigelo.com
A single-page portfolio built as a plain static site: no framework, no build step, no JavaScript. Just HTML, CSS, and a handful of assets, served by Firebase Hosting. Feel free to fork it as a starting point for your own site.
- Markdown-minimal design — flat layout, hairline rules, monospace frontmatter, and
#/##/-syntax cues instead of cards. - Automatic light/dark via the CSS
light-dark()function andprefers-color-scheme— one token set, no theme-toggle JS. - Accessible — correct heading hierarchy, a skip link, visible
:focus-visiblerings, plusprefers-reduced-motionandprefers-contrastsupport. - Fast — no build, no web fonts, no JS; an avatar sized to its display; long-cached static assets.
- Secure by default — CSP,
nosniff, referrer-policy, and permissions-policy headers set infirebase.json. - Privacy-friendly analytics with Plausible.
- HTML + CSS (container queries,
light-dark(),:has(),@starting-style, scroll-driven animations). - Firebase Hosting for serving, HTTPS, and headers.
- Plausible for analytics.
src/
index.html # the page
styles.css # all styling
404.html # custom not-found page
avatar.webp # profile photo (~72px display, 176px source)
og-image.webp # social share preview
favicon.svg # SVG favicon (T monogram)
apple-touch-icon.png # iOS home-screen icon
icon-192.webp # PWA manifest icon
icon-512.webp # PWA manifest icon
site.webmanifest # web app manifest
robots.txt
sitemap.xml
firebase.json # hosting: headers, caching, cleanUrls
.firebaserc # Firebase project binding
Serve the src/ directory with any static server:
git clone https://github.com/tgel0/tomigelo.git
cd tomigelo
python3 -m http.server --directory src 8000
# then open http://localhost:8000Or open src/index.html directly — note that root-absolute paths like /favicon.svg
only resolve when the directory is served, not over file://.
- Content — edit
src/index.html: the<h1>name, the frontmatter<dl>, the project<li>s, and the sidebar. - Avatar & share image — replace
src/avatar.webp(display ~72px, so ~176px source is plenty) andsrc/og-image.webp. - Favicon & icons — replace
src/favicon.svg,src/apple-touch-icon.png, andsrc/icon-*.webp. - Domain & analytics — update the canonical/OG URLs in
index.htmland thedata-domainon the Plausible<script>. - Firebase project — change the project in
.firebasercand adjustfirebase.json. - Bump the
?v=query onstyles.css/avatar.webpwhenever those files change (long-cache invalidation).
npx firebase-tools deploy --only hostingRequires the Firebase CLI and a logged-in account with access to the configured project.
- Caching: static assets use
Cache-Control: max-age=31536000, immutable; HTML revalidates hourly (seefirebase.json). - Security headers: CSP,
X-Content-Type-Options,Referrer-Policy, andPermissions-Policyare set infirebase.json.
MIT — fork it, use it, make it yours.