A clean, performant static website built with plain HTML and CSS.
sinan.io is the personal portfolio and professional website of Michael Sinanian, showcasing career projects, teaching work, and writing. The site is a labor of love that emphasizes simplicity, accessibility, and fast load times through a deliberately minimal tech stack.
Live Site: sinan.io (or configured domain)
This site intentionally uses no JavaScript frameworks and no build process. The goal is:
- Fast performance: Static HTML/CSS loads instantly with no bundle overhead
- Simplicity: Easy to understand, modify, and maintain
- Accessibility: Semantic HTML with ARIA labels and keyboard navigation
- Durability: No dependencies to update, no toolchain to maintain
The site doesn't need heavy frameworks because its interactive features are minimal (just theme switching via CSS).
- HTML5: Semantic markup with accessibility features
- CSS3: Modern CSS with custom properties (CSS variables) for theming
- Vanilla JavaScript: Ultra-lightweight JS for header/footer includes and current page highlighting
- Fonts: System-first sans stack (San Francisco on Apple devices, Inter elsewhere) with a crisp SF-inspired mono stack reserved for code snippets
- Hosting: Cloudflare Pages (automatic deployment from git)
- Theme toggle: CSS-only checkbox pattern (no JavaScript required) presented as an iOS-style control with Lucide Sun and Moon icons
- No build process: Files are served exactly as written (no bundling, transpiling, or preprocessing)
See: PROJECT_MAP.md
The site uses ultra-lightweight vanilla JavaScript to load shared header and footer HTML from /includes/ directory. This eliminates code duplication across the many pages while maintaining the no-build-process philosophy.
How it works:
- Each HTML page has placeholder
<header>and<footer>tags withnoscriptfallbacks /assets/js/includes.jsfetches both fragments in parallel and injects them- Adds
aria-current="page"attribute to highlight the current page in navigation - Graceful degradation: users without JS see basic navigation links via
<noscript>tags
The site uses three main page templates:
- Homepage (
index.html): Profile intro + categorized project cards - Content pages (
about.html,contact.html, project detail pages): Page header + prose content - Index pages (
projects/index.html,posts/index.html): Grid/list of links
- The
/projects/projects-manifest.jsonfile now includes normalizedrole,domain, andlocationmetadata for every entry.roleanddomainare stored as arrays of enums so chips can express multi-faceted work (e.g., consulting + teaching across AI PM and legal-tech). - The Projects timeline on
/projects/index.htmlrenders filter chips grouped by Role, Domain, and Location. Chips toggle with OR logic within a group and AND logic across groups, updating visibility via[data-hidden="true"] { display: none; }(no re-fetching). - Timeline ordering prioritizes ongoing engagements, then most recent end dates, then most recent start dates to ensure current work remains surfaced above completed projects.
- Filter chips share a line with their headings on wide screens and collapse into two-up, truncated pills on narrow viewports so filters remain compact and scannable regardless of device width.
Projects are displayed using card grids with different column counts:
.grid-2: 2 columns (falls back to 1 on mobile).grid-3: 3 columns (2 on tablet, 1 on mobile).grid-4: 4 columns (2 on tablet, 1 on mobile)
The site supports light/dark modes via:
- OS preference detection:
@media (prefers-color-scheme: dark) - Manual toggle:
#theme-togglecheckbox flips theme - CSS custom properties for all colors
- Headings, hero copy, and card elements now rely on the system sans stack for a cohesive voice, with monospace reserved exclusively for inline
code/precontent. - Site title, subtitle, header/footer navigation, and page-level H1 headings are set in uppercase with modern letter-spacing to create intentional, elegant hierarchy.
The single styles.css file is organized into sections:
- Footer social icons (lines 1-48)
- CSS reset (lines 50-57)
- Theme variables (lines 59-130)
- Layout & typography (lines 132-300)
All colors are defined as CSS custom properties (--bg, --text, --accent, etc.) that switch based on theme state.
- Make changes to HTML/CSS files locally
- Commit and push to the
mainbranch (or configured branch) - Cloudflare Pages automatically detects the push
- Cloudflare builds (no build command needed) and deploys
- Site updates live within seconds
No build configuration required - Cloudflare serves the static files as-is.
- Open HTML files directly in a browser, or
- Use a simple local server:
# Python 3 python -m http.server 8000 # Node.js (if http-server is installed) npx http-server -p 8000
- Navigate to
http://localhost:8000
- Edit HTML files to update content or structure
- Edit
assets/css/styles.cssto update styling - Changes are immediately visible on refresh (no build step)
- Test keyboard navigation (Tab, Enter, Space)
- Verify skip link works (Tab on page load)
- Test with screen reader (VoiceOver on Mac, NVDA on Windows)
- Check color contrast in both light and dark modes
Test in:
- Chrome/Edge (Chromium)
- Firefox
- Safari (especially for WebP images and CSS features)
The site now uses vanilla JavaScript (/assets/js/includes.js) to load shared header and footer from /includes/ directory. This:
- Eliminates duplication across several HTML files
- Maintains the no-build-process philosophy
- Uses parallel
Promise.all()fetching for performance - Provides graceful degradation via
<noscript>fallbacks - Auto-highlights current page in navigation
Current state: Images are served at full size.
Planned: Add responsive image handling:
<img srcset="profile-photo-480.webp 480w,
profile-photo-800.webp 800w,
profile-photo-1200.webp 1200w"
sizes="(max-width: 640px) 160px, 220px"
src="profile-photo-800.webp"
alt="Michael Sinanian">- Semantic HTML5 elements
- Skip to content link for keyboard users
- ARIA labels on icon buttons and navigation
- Sufficient color contrast in both themes
- Focus visible indicators
- Alt text on all images
- Responsive design works at all viewport sizes
Content is © 2025 Michael Sinanian. All rights reserved.
Code structure and CSS may be used as reference or adapted for other projects.
For AI Agents: See AGENTS.md for architecture details, patterns, and modification guidelines.