kill the framework. kill the tracking. write html. ship it.
Strip down to bare HTML + minimal CSS. Information architecture based on terminal/hacker aesthetic. No frameworks, no tracking, no BS.
Visual:
- Pico CSS framework (classless)
- Turbo for SPA navigation
- Already fighting frameworks with "anti-pico", "anti-turbo" CSS
- Light/dark mode via Pico
- Google Analytics
- Multi-language support (6 languages)
Information Architecture:
- Home page with casual tone
- Navigation hidden in content and footer "goto"
- Pages: /, /about, /contact, /cv, /disco, /jess, /now, /nerd, /io
- Random quotes in footer
- Email-based feedback (heart/hate links)
The Problem: You're already writing CSS to fight Pico. You're disabling Turbo features. You're using a classless framework but... why use a framework at all?
CODE.md:
- Simple beats clever
- Stdlib is underrated, frameworks are overrated
- Minimal dependencies
- Direct and readable
WRITING.md:
- Direct, no BS
- Short paragraphs
- Get to the point
- No corporate speak
PHOTOGRAPHY.md:
- Natural over processed
- Truth over beauty
- Minimal editing
- Functional over fancy
Translation to Web:
- Raw HTML over framework
- Plain CSS over preprocessors
- Static over dynamic (when possible)
- Fast over fancy
- Privacy over analytics
Visual Inspiration:
- Early web (but not ugly)
- Terminal UI
- Monospace fonts for code
- Brutalist simplicity
- motherfuckingwebsite.com meets better-motherfuckingwebsite.com
- Text-first, minimal graphics
- Fast as hell
Information Architecture:
- Command-line inspired navigation
- File-system metaphor
- Direct paths, no mystery meat navigation
- Everything one or two clicks away
- No hiding functionality
- Transparent structure
Remove:
<!-- NO MORE -->
<link href="pico.css">
<script src="turbo.js">Replace with:
<!-- YES -->
<style>
/* your CSS, < 50 lines */
</style>Base styles (all you need):
/* reset */
* { margin: 0; padding: 0; box-sizing: border-box; }
/* layout */
body {
max-width: 42rem;
margin: 2rem auto;
padding: 0 1rem;
font-family: monospace;
font-size: 16px;
line-height: 1.6;
color: #333;
background: #fff;
}
/* typography */
h1, h2, h3 { margin: 1.5rem 0 0.5rem; }
p { margin: 0.5rem 0; }
a { color: #0066cc; }
a:visited { color: #551a8b; }
code, pre {
font-family: monospace;
background: #f5f5f5;
padding: 0.1em 0.3em;
}
/* dark mode */
@media (prefers-color-scheme: dark) {
body {
color: #ddd;
background: #111;
}
a { color: #58a6ff; }
a:visited { color: #a371f7; }
code, pre { background: #222; }
}That's it. Maybe 40 lines total.
Fonts:
- System monospace stack for everything
- No web fonts, no loading
- Terminal aesthetic
- Fast and free
Stack:
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;Light mode:
- Background:
#fff(white) - Text:
#333(near black) - Links:
#0066cc(blue) - Code:
#f5f5f5(light gray bg)
Dark mode:
- Background:
#111(near black) - Text:
#ddd(light gray) - Links:
#58a6ff(GitHub blue) - Code:
#222(dark gray bg)
No gradients. No shadows. No animations. Terminal colors only.
Single column:
body {
max-width: 42rem; /* ~80 chars, terminal width */
margin: 2rem auto;
padding: 0 1rem;
}No grid. No flex (unless needed). Just center it and ship.
Terminal-style header:
$ cd /home/drawohara
$ ls
about contact cv disco io jess nerd now
$ cat README.md
[content here]
$ _
Implementation:
<header>
<pre>
$ cd /home/drawohara
$ ls -la
drwxr-xr-x <a href="/about">about</a>
drwxr-xr-x <a href="/contact">contact</a>
drwxr-xr-x <a href="/cv">cv</a>
drwxr-xr-x <a href="/disco">disco</a>
drwxr-xr-x <a href="/io">io</a>
drwxr-xr-x <a href="/jess">jess</a>
drwxr-xr-x <a href="/nerd">nerd</a>
drwxr-xr-x <a href="/now">now</a>
$ cat README.md
</pre>
</header>Or simpler:
@drawohara :: [ about | contact | cv | disco | io | nerd | now ]
---
Even simpler (current approach is fine):
@drawohara
---
Keep the simplest. Navigation in content is fine.
/ → home
/about → about me
/contact → contact
/cv → resume
/disco → disco project
/io → writing
/jess → jess
/nerd → tech writing
/now → what now
This is good. Keep it.
Current: Navigation hidden, discovered through content Proposed: Keep it hidden if you want, but make it discoverable
Option A: Terminal metaphor
$ ls
about contact cv disco io jess nerd now
$ whoami
[content]
Option B: Traditional (boring but clear)
@drawohara
[about] [contact] [cv] [disco] [io] [nerd] [now]
---
Option C: Current approach (minimalist, discovery-based)
@drawohara ❤️ 🖤
---
Recommendation: Keep Option C, it's very "you"
Use directory structure as visual language:
/home/drawohara/
├── about/ # who
├── contact/ # reach out
├── cv/ # work history
├── disco/ # disco project
├── io/ # thoughts
│ ├── mission
│ ├── lost-in-the-desert
│ └── ...
├── nerd/ # tech stuff
│ ├── fastest-possible-embeddings
│ └── ...
├── jess/ # jess
└── now/ # current status
Show this structure somehow?
- Maybe in footer as "tree" output
- Maybe as navigation on inner pages
- Maybe not at all - keep it clean
drawohara.io:~ $ cd io
drawohara.io:~/io $ ls
mission lost-in-the-desert facebook-and-global-extremism ...
drawohara.io:~/io $ cat mission/README.md
[content]
Or simpler:
/ → io → mission
Or even simpler:
← back
Keep current approach:
- Short landing pages
- Direct language
- Links to deeper content
- No mystery
Enhance with:
- Clear hierarchy (when needed)
- Consistent structure
- Fast loading
- Obvious navigation
Kill:
- ✗ Pico CSS (70kb)
- ✗ Turbo.js (30kb)
- ✗ Google Analytics (tracking)
- ✗ Multi-language support (unless actively used)
- ✗ Complex meta tags
Keep:
- ✓ Basic HTML5
- ✓ Minimal inline CSS (<50 lines)
- ✓ Basic meta tags (title, description)
- ✓ Favicon
- ✓ RSS feed (if you want)
Before:
<html>
<head>
<!-- 40 lines of meta, links, scripts -->
</head>
<body>
<header><%= header %></header>
<main><%= content %></main>
<footer><%= footer %></footer>
</body>
</html>After:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= title %></title>
<style>
/* your 40 lines of CSS */
</style>
</head>
<body>
<header>
<a href="/">@drawohara</a>
<hr>
</header>
<main>
<%= yield %>
</main>
<footer>
<hr>
<%= Time.now.year %> //
<a href="/contact">contact</a>
</footer>
</body>
</html>Goals:
- First paint < 100ms
- Total page weight < 50kb
- No external requests (except images)
- No JavaScript (unless needed)
- No tracking
- No frameworks
How:
- Inline CSS
- Minimal HTML
- No web fonts
- Static generation
- HTTP/2 server push (maybe)
Remove:
- Google Analytics
- Any tracking
- Third-party requests
- Cookies
Maybe add:
- Server-side analytics (if needed)
- Self-hosted, privacy-respecting
- Or just check server logs
Goal: Strip to basics, test it
Tasks:
-
Create new layout template (
views/layout-minimal.erb)- Inline CSS only
- No external deps
- Basic structure
-
Test on one page (/)
- Make sure it works
- Check dark mode
- Verify mobile
-
Refine CSS
- Adjust spacing
- Fix dark mode
- Test typography
-
Compare:
- Load time: before/after
- Page weight: before/after
- Feel: subjective assessment
-
Iterate:
- Too minimal? Add what's needed
- Still bloated? Cut more
Timeline: 1-2 hours
Tasks:
-
Update all page templates
- Use new layout
- Remove framework CSS
- Test each page
-
Navigation decisions
- Terminal-style header?
- Simple links?
- Keep current minimal approach?
-
Content adjustments
- Any layout-specific markdown?
- Image handling?
- Code blocks?
-
Test thoroughly
- All pages load
- Links work
- Mobile works
- Dark mode works
Timeline: 2-4 hours
Tasks:
-
Review structure
- Current paths make sense?
- Any consolidation needed?
- Any new top-level pages?
-
Navigation enhancement
- Make discovery easier (if needed)
- Add breadcrumbs (if useful)
- Terminal metaphor (if cool)
-
Content audit
- Remove cruft
- Simplify language
- Check links
-
Sitemap clarity
- Can you find anything in 2 clicks?
- Is structure obvious?
- Does it feel hackery?
Timeline: 2-4 hours
Tasks:
-
Typography refinement
- Line height
- Font size
- Code blocks
- Headings
-
Color adjustments
- Link colors
- Dark mode tweaks
- Contrast checks
- Terminal authenticity
-
Interactions
- Link hover states
- Focus states (keyboard nav)
- Active states
-
Edge cases
- Long URLs
- Long code blocks
- Large images
- Tables (if any)
Timeline: 1-2 hours
Tasks:
- Deploy to staging (if you have one)
- Test in real browsers
- Get feedback (or don't)
- Deploy to production
- Watch server logs (instead of analytics)
- Iterate based on feel
Timeline: 30 minutes + ongoing
Option A: Explicit Terminal
$ ls /home/drawohara
about contact cv disco io jess nerd now
Option B: Minimal Links
@drawohara :: about | contact | cv | disco | io | nerd | now
Option C: Current (no visible nav)
@drawohara ❤️ 🖤
---
Recommendation: C → Keep the mystery, navigation emerges from content
Option A: Current
<a href="/">@drawohara</a> ❤️ 🖤
<hr>Option B: Terminal Prompt
drawohara.io:~$ _
<hr>Option C: Even More Minimal
<a href="/">@drawohara</a>
<hr>Recommendation: A or C, depends on if you want the email heart/hate links
Option A: Current (quotes + links)
<hr>
<a href="/goto">→ goto</a>
> [random quote]
— [author]
<a href="/">← eject</a>Option B: Minimal
<hr>
<%= Time.now.year %> :: <a href="/contact">contact</a>Option C: Terminal
<hr>
$ exit
Connection to drawohara.io closed.Recommendation: B → Quotes are cool but maybe overkill
Option A: All Monospace
* { font-family: monospace; }Option B: Monospace for code, sans-serif for text
body { font-family: -apple-system, sans-serif; }
code { font-family: monospace; }Recommendation: A → Commit to the terminal aesthetic
Option A: Terminal Classic
- Light: white bg, black text, blue links
- Dark: black bg, green text, green links
Option B: GitHub Style
- Light: white bg, #333 text, #0066cc links
- Dark: #0d1117 bg, #c9d1d9 text, #58a6ff links
Option C: Minimal
- Light: white bg, black text, black links (underlined)
- Dark: black bg, white text, white links (underlined)
Recommendation: B or C, both work, C is most minimal
Page weight:
- HTML: 5kb
- Pico CSS: 70kb
- Turbo JS: 30kb
- Analytics: 15kb
- Total: ~120kb + external requests
Complexity:
- Framework CSS
- SPA navigation
- Analytics tracking
- Multi-language
- Fighting framework with custom CSS
Feel:
- Clean but generic
- Framework-y
- Not quite "you"
Page weight:
- HTML: 5kb
- Inline CSS: 2kb
- Total: ~7kb, no external requests
Complexity:
- Raw HTML
- Simple CSS
- No JavaScript
- No tracking
- No fighting
Feel:
- Brutally simple
- Fast as hell
- Unique
- Hackery
- You
Visual:
- ✓ Loads instantly
- ✓ Looks plain but intentional
- ✓ Works without CSS (progressive enhancement)
- ✓ Dark mode just works
- ✓ Monospace feels right
- ✓ No framework smell
Information Architecture:
- ✓ Can find anything in < 10 seconds
- ✓ Structure is obvious
- ✓ No mystery meat navigation
- ✓ URLs are clean and guessable
- ✓ Breadcrumbs work (if added)
- ✓ Makes sense to non-technical people
Technical:
- ✓ No external requests
- ✓ < 50kb total page weight
- ✓ Works in lynx (text browser)
- ✓ No JavaScript errors (because no JS)
- ✓ Valid HTML5
- ✓ No tracking/privacy concerns
Feel:
- ✓ Fast
- ✓ Hackery
- ✓ Honest
- ✓ You
- ✓ Not trying too hard
- ✓ Just... right
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><%= exports[:title] || 'drawohara' %></title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
max-width: 42rem;
margin: 2rem auto;
padding: 0 1rem;
font: 16px/1.6 'SFMono-Regular', Consolas, monospace;
color: #333;
background: #fff;
}
h1, h2, h3 { margin: 1.5rem 0 0.5rem; }
p { margin: 0.5rem 0; }
a { color: #0066cc; text-decoration: none; }
a:hover { text-decoration: underline; }
code, pre {
background: #f5f5f5;
padding: 0.1em 0.3em;
}
pre {
padding: 1rem;
overflow-x: auto;
}
hr {
border: none;
border-top: 1px solid #ddd;
margin: 1rem 0;
}
@media (prefers-color-scheme: dark) {
body { color: #ddd; background: #111; }
a { color: #58a6ff; }
code, pre { background: #222; }
hr { border-top-color: #333; }
}
</style>
</head>
<body>
<header>
<a href="/">@drawohara</a>
<hr>
</header>
<main>
<%= yield %>
</main>
<footer>
<hr>
<%= Time.now.year %> :: <a href="/contact">contact</a>
</footer>
</body>
</html>That's it. Under 60 lines total.
- Backup current site
- Test in staging
- Save current analytics (if you care)
- Document current performance
- Create
views/layout-minimal.erb - Test on index page
- Refine CSS
- Apply to all pages
- Remove Pico CSS
- Remove Turbo JS
- Remove Google Analytics
- Test all pages
- Test mobile
- Test dark mode
- Test in multiple browsers
- Test accessibility (keyboard nav)
- Check load times
- Check page weights
- Check server logs (instead of analytics)
- Get feedback (or don't)
- Iterate if needed
- Ship updates
- Page load time: < 100ms (from ~500ms)
- Page weight: < 10kb (from ~120kb)
- External requests: 0 (from ~5)
- Time to interactive: instant (from ~1s)
- Feels fast: ✓
- Feels honest: ✓
- Feels like you: ✓
- Feels hackery: ✓
- Not trying too hard: ✓
Open the site. Does it feel like a terminal?
Open the source. Can you read it all in 2 minutes?
Show it to a hacker. Do they nod?
If yes to all three: ship it.
Single file site:
<!DOCTYPE html>
<title>drawohara</title>
<style>
body {
max-width: 42rem;
margin: 2rem auto;
padding: 0 1rem;
font: 16px/1.6 monospace;
}
a { color: blue; }
@media (prefers-color-scheme: dark) {
body { background: #111; color: #ddd; }
a { color: #58a6ff; }
}
</style>
<h1>drawohara</h1>
<p>software architect. mountaineer. alaska → colorado.</p>
<ul>
<li><a href="mailto:drawohara@drawohara.io">email</a>
<li><a href="https://github.com/ahoward">github</a>
<li><a href="/cv">cv</a>
</ul>
<h2>writing</h2>
<ul>
<li><a href="/io/mission">mission</a>
<li><a href="/io/lost-in-the-desert">lost in the desert</a>
<li><a href="/io">more...</a>
</ul>
<h2>code</h2>
<ul>
<li><a href="/nerd/fastest-possible-embeddings">fastest embeddings</a>
<li><a href="/nerd">more...</a>
</ul>That's the whole site. 30 lines.
Probably too extreme, but it would be fast as hell.
- Create minimal layout (Phase 1)
- Test on index page
- If it feels right, apply everywhere (Phase 2)
- Iterate on details (Phase 4)
- Ship it
- Minimum: 2 hours (just the visual redesign)
- Complete: 8-12 hours (visual + IA + polish)
- Maximum: 2 days (if you go deep on terminal aesthetic)
Create views/layout-minimal.erb with the template above and update ro/pages/index to use it.
Test it. Feel it. Iterate.
"simple beats clever. every. single. time."
Ship the simplest thing that feels right. You'll know when it's done.