How We Restyled Our Blog with Two Template Files and Zero Dependencies
Our blog looked fine. Readable, semantic, proper typography. But it didn't have much personality. Code blocks were unstyled. Headings sat flat. The design said "competent" more than "intentional."
Then we looked at our internal team guide — a self-contained HTML doc with gradient titles that clip to transparent, dark code panels, and callout boxes with coloured borders. It radiated a "well-maintained developer doc" energy. We wanted the blog to feel like it came from the same shop.
Two template files, one build step, zero external dependencies. Here's what we changed.
The build system (why it mattered)
The blog is generated by build.js — a zero-dependency Node script that converts markdown to HTML:
posts/*.md + _template.html / _index_template.html → *.html
This means we never touch a generated .html file by hand. Every visual change flows through the templates. The site-wide CSS — nav, footer, base typography, brand accent — lives in ../style.css, served by Git Studio from outside the repo. We didn't touch it.
Instead, we injected a self-contained block at the end of in both templates, after the ../style.css link. Cascade order handles the overrides. No !important. No external font loads. No CDN dependencies.
The palette
Four accent colours, borrowed from our team guide:
| Role | Colour | Where |
|——|——–|——-|
| Brand amber | #c9935a | Gradient start, h2 left bar, card hover |
| Warm gold | #f59e0b | Gradient midpoint, bold text |
| Blue | #38bdf8 | Gradient endpoint, links, date pills |
| Purple | #a855f7 | h3 colour, link hover |
Tasteful. Not a rainbow.
What we styled
Gradient titles. Post h1 gets linear-gradient(90deg, #c9935a, #f59e0b 40%, #38bdf8) via background-clip: text; color: transparent. Underlying text preserved for screen readers and SEO.
Date pills. Monospace chip — blue text, 999px border-radius, uppercase, tight letter-spacing. Sits before the title like a kicker.
Code blocks. The site CSS only styled inline . Fenced blocks got a dark panel (#0a0e14, #2a3340 border, 10px radius, monospace, overflow-x: auto). A reset rule on pre code prevents inline-code styles from doubling up inside the panel.
Section cues. h2 gets a 4px amber left border as visual anchor. h3 gets a purple tint — enough to signal a section break without pulling focus.
Links. Blue #38bdf8, purple #a855f7 on hover. Bold text picks up amber.
Blockquote callouts. Amber-tinted background, 4px amber left border, rounded right corners. The CSS is written and waiting — build.js doesn't emit yet, but the rules activate the moment we add > syntax support.
Index page. Same gradient on the listing title. Date pills on cards. Amber border on card hover. Blue/purple read links.
The rebuild
node build.js
Building blog...
11 posts built + index.html
Done.
Zero errors. Every regenerated HTML file now carries the inline . Confirmed with grep -l "background-clip" *.html — all pages ship the gradient.
What we didn't touch
Navigation, footer, site chrome, responsive behaviour — all unchanged. This was a CSS-only change. No markup altered beyond the injection.
What we learned
Inline styles beat separate CSS files when you don't control the server. The blog repo is standalone — it can't modify ../style.css. Inline blocks ship inside the generated HTML, so the blog is fully self-contained. One git push and it's live.
Cascade order is the cleanest specificity hack. Putting the block after the external stylesheet link means same-selector rules win by position. No !important, no selector wars, no unexpected regressions.
Build systems make CSS changes safe. Because we never hand-edit .html, every style change is tested by regenerating all pages and grepping for the new selectors. If a rule doesn't ship, you know immediately.
Two gaps we'll fill later: blockquote support in build.js (the callout CSS is waiting) and ordered lists (same story). In the meantime, the blog already looks intentional — and it took two template files, one build step, and zero dependencies.
The blog is generated by build.js and served by Tinqs Studio. All styling is self-contained in the templates.