The system.
Every decision behind flavioclesio.com, with the reasoning that produced it. This page is the source of truth — if the site disagrees with this document, the site is wrong.
§1 Identity
| Field | Value |
|---|---|
| Name | flavioclesio.com |
| Author | Flavio Clesio (fclesio) |
| Established | 2012 |
| Subject | Machine Learning Engineering, Data Engineering, engineering culture, long-form reflection. |
| Audience | Practitioners. Engineers, data scientists, researchers, hobbyists. Not “the C-suite”. |
| Languages | Portuguese-Brazilian and English, mixed by topic. lang: front-matter selects the post feed. |
| Posture | Reading first. No decoration without purpose. Typographic hierarchy over visual hierarchy. Invisible infrastructure. No JavaScript for layout. |
| Build | Jekyll · Netlify · Pagefind for search · Spectral & Newsreader via Google Fonts · Roboto Mono self-hosted. |
§2 Typography
2.1 — Type families
| Family | Role | Used in | Rationale |
|---|---|---|---|
| Newsreader | Literary serif | Home · Essay · Podcast | Variable serif designed for screen reading. Stronger italic, warmer baseline than Spectral. Carries “this is writing meant to be read slowly.” |
| Spectral 300 | Editorial serif | Post (default) · Technical · Colophon | Designed for long-form digital reading; light weight reads as elegant rather than crowded. Carries “this is an article.” |
| Roboto Mono | Machine text | Metadata · code · datelines · timestamps | Monospace contrast against the serif signals “this is data, not prose.” Self-hosted via woff2. |
2.2 — Per-layout scale
| Layout | Body | Weight | Line-height | H1 | H2 | Background |
|---|---|---|---|---|---|---|
| Home | Newsreader 19px | 380 | 1.6 | 48px / 400 | 26px / 400 italic | #f6f1e8 |
| Post (A) | Spectral 20px | 300 | 1.55 | 35px / 500 | 30px / 500 | #ffffff |
| Essay (B) | Newsreader 21px | 380 | 1.62 | 48px / 400 italic | 26px / 400 italic | #f6f1e8 |
| Technical (C) | Spectral 19px | 300 | 1.6 | 38px / 500 | 25px / 500 | #fbfaf7 |
| Podcast | Newsreader 19px | 380 | 1.6 | 40px / 400 italic | 22px / 400 italic | #f6f1e8 |
2.3 — Code type
| Property | Value |
|---|---|
| Family | Roboto Mono, weights 300 & 500 |
| Inline size | 0.78em–0.82em |
| Block size | 13–14px / 1.55 |
| Inline background | #efeae0 |
| Block background | #f5f5f5 light · #1f1d1a dark (technical, opt-in) |
§3 Color
3.1 — Light tokens
| Hex | Name | Use |
|---|---|---|
#ffffff |
paper / white | bg · post |
#fbfaf7 |
paper / warm 1 | bg · technical · colophon |
#f6f1e8 |
paper / warm 2 | bg · home · essay · podcast |
#1a1a18 |
ink / max | titles · primary text |
#2a2a26 |
ink / body | body text |
#3a3631 |
ink / sub | lead, deck |
#555555 |
ink / muted | secondary copy |
#8a7e6a |
ink / metadata | dates, eyebrows, footer |
#b5a888 |
ink / faint | counters, dim tags |
#c8b896 |
rule / warm | borders in essay/home |
#e8e3da |
rule / cool | borders in post/technical |
#2a6b7c |
link / teal | links in post · technical · colophon |
#c19b58 |
link / amber | links in home · essay · podcast |
#b8593a |
callout / warn | WARNING callouts |
#7a8f4a |
callout / tip | TIP callouts |
3.2 — Dark tokens
| Hex | Name | Use |
|---|---|---|
#1a1a1a |
bg / black | post · technical dark |
#1c1814 |
bg / warm dark | home · essay · podcast dark |
#2a2520 |
surface / raised | callouts, active rows |
#f0e9dc |
ink / max | titles |
#d4cfc8 |
ink / body | body |
#b5ada0 |
ink / sub | lead |
#8a7e6a |
ink / metadata | dates, eyebrows |
#3a3530 |
rule / warm dark | borders home/essay |
#2a2a2a |
rule / cool dark | borders post/technical |
#7ab8c4 |
link / teal-light | links in post · technical dark |
#d4b677 |
link / amber-light | links in home · essay · podcast dark |
3.3 — Rejected
| Color | Why rejected |
|---|---|
#33c default blue |
Clashes with serif warm undertone; reads as “default link”, undermines intent. |
Pure #000 |
Halation on LCD; #1a1a18 reads identically printed but easier on the eye on screen. |
| Saturated brand color | No brand. The site is the writing. |
§4 Layout
| Layout | Max column | Padding | Sidebar | Footer |
|---|---|---|---|---|
| Home | 720px | 36px 48px | — | asterism + 2 rows mono |
| Post (A) | 680px | 20px 40px | — | centered mono recolhido |
| Essay (B) | 700px | 36px 56px 80px | — | colophon line (set in…) |
| Technical (C) | 1080px (660 main + 220 TOC) | 24px 48px | 220px right · sticky | last reviewed + edit on github |
| Podcast | 720px | 28px 48px | — | asterism + body |
| Colophon | 880px | 32px 56px | — | shared footer |
Vertical rhythm derived from font-size. Paragraphs at 1.2em apart. Section heads at 1.5em above / 0.6em below. Line length is the design constant — column widths derived from it (62–68ch target).
§5 Page system
Three writing layouts + the home + podcast. Selected via Jekyll front-matter, never via URL routing.
| File | Front-matter | Renders |
|---|---|---|
_layouts/post.html |
layout: post |
Spectral, 680px, optional numbered footnotes block. |
_layouts/essay.html |
layout: essay |
Newsreader, paper warm, drop cap, justified body, asterism between sections, mono dateline. |
_layouts/technical.html |
layout: technical |
Spectral, paper warm 1, sticky TOC right, callouts, code with file label + copy, last-reviewed footer. |
_layouts/episode.html |
layout: episode |
Newsreader, paper warm 2, minimal player, numbered chapters, em-dash shownotes. |
index.md |
is_home: true |
Newsreader, paper warm, sections: Essays · Technical · Notes · Podcast · Archive · Recent. |
§6 Components
6.1 — Dateline
| Layout | Format | Type | Style |
|---|---|---|---|
| Post | 2026 Apr 30 |
Spectral 20px | #bbb |
| Essay | 30 · APRIL · 2026 |
Roboto Mono 11px | letter-spacing 0.3em, #8a7e6a, centered |
| Technical | 30 APR 2026 · UPDATED 02 MAY 2026 · TAGS |
Roboto Mono 11px | letter-spacing 0.12em, #888, left |
| Podcast | 2026 May 01 · 5 min 53 s · Portuguese · Host Flavio Clesio |
Roboto Mono 11px | letter-spacing 0.14em, #8a7e6a, left |
6.2 — Footnotes
Kramdown native [^1] syntax. Numbered at bottom; superscript call-out in teal (post/technical) or amber (essay/home).
6.3 — Pull quote · Epigraph
Bar variant: italic 20–26px serif, 2px left border in layout accent color.
Epigraph: centered, 18px italic; cite block in mono caps with —.
6.4 — Callouts
| Type | Left border | Label color |
|---|---|---|
| NOTE | #2a6b7c |
#2a6b7c |
| WARNING | #b8593a |
#b8593a |
| TIP | #7a8f4a |
#7a8f4a |
| TL;DR | #2a6b7c (background #f3edde) |
#2a6b7c |
Label rendered automatically from class via ::before content.
6.5 — Code blocks
Default: light #f5f5f5, no chrome. Dark: opt-in via Kramdown attribute on the fenced block ({: data-chrome="dark" data-file="path"}).
6.6 — Drop cap
Essay-only. CSS via .essay-body > p:first-child::first-letter. Combine with <span class="smallcaps"> on the first 3 words.
6.7 — Asterism
Markdown * * * → <hr>. In essay, restyled to ∗ ∗ ∗ centered, #c8b896, letter-spacing 0.6em.
6.8 — Podcast player
A single horizontal strip between two thin warm-gray rules. No skip ±15/30, no volume, no share — the URL ?t=N param is the share contract. Composed of: 52px black play/pause circle · 3px progress bar with amber chapter ticks · mono elapsed/total · single speed pill (popover for 0.75/1/1.25/1.5/2).
6.9 — Chapters
Each row: stacked mm:ss (mono caps) · title (italic Newsreader) · [tag] (mono small). Active row: ▶ prefix on time + title in amber. Whole row is clickable, jumps to timestamp.
6.10 — Show notes
Simple list with em-dash — marker. Each entry is a hyperlink.
§7 Navigation & footer
| Element | Spec |
|---|---|
| Inner page nav | Mono 11px · uppercase · letter-spacing 0.14em. ← flavioclesio on left, contextual links on right. |
| Home nav | Same scale, more items: About / Sobre · Conference Talks · Contents from Other Authors · Aforismos / Aphorisms · Podcast · RSS. |
| Dropped from nav | Livros · Newsletter · Busca · Archive (Archive is its own home section). |
| Footer | Asterism · social row · legal row. Both rows mono 11px, color #8a7e6a. |
| Footer contents | Row 1: GitHub · Twitter · LinkedIn · RSS. Row 2: Disclaimer / Aviso · Colophon · CC BY-SA 4.0 · :wq. |
§8 Markdown extensions
Kramdown native, no plugins. Authors mark up posts as normal markdown plus the following recognized class hooks:
{: .callout .note} → NOTE callout
{: .callout .warning} → WARNING callout
{: .callout .tip} → TIP callout
{: .callout .tldr} → TL;DR (use once, above first H2)
{: .pullquote} → pull-quote bar variant
{: .epigraph} → pull-quote epigraph variant
[^1] → footnote reference (numbered automatically)
[^1]: footnote text → footnote definition (placed at end of file)
* * * → asterism (renders as ∗ ∗ ∗ in essay layout, hr elsewhere)
<span class="smallcaps">My friend Paulo</span> → small caps run
Usage example (callout — note the blank line above the attribute block):
> The `scope["type"] != "http"` guard lets this coexist with WebSocket traffic.
{: .callout .note}
§9 Dark mode
Single ◐ button, fixed top-right of every page. Toggles body.dark; persisted in localStorage under key theme. No JS heuristics, no prefers-color-scheme auto-switching — the reader chose for a reason.
| Property | Value |
|---|---|
| Strategy | Per-layout dark palette. Home/essay/podcast use warm dark (#1c1814); post/technical/colophon use neutral dark (#1a1a1a). |
| Link in dark | Teal layouts: #7ab8c4. Amber layouts: #d4b677. |
| Rules in dark | Warm: #3a3530. Cool: #2a2a2a. |
| Code in dark | Block: #242424. Inline: #2a2520 + ink #d4cfc8. |
§10 Front-matter contract
Every Jekyll source file declares its layout and language. Layout-specific fields are read only by their layout — extra fields never break a build.
# Universal
layout: post | essay | technical | episode # required
title: string # required
date: ISO-8601 # required
lang: pt-br | en-us # required
permalink: /:title # required
excerpt: string (<= 200 chars) # optional
# Technical-only
series: slug # links sibling posts
series_index: integer # 1-indexed
series_total: integer
last_reviewed: ISO-8601 # footer "last reviewed"
tags: [string, ...]
# Episode-only
duration: hh:mm:ss
audio.mp3.url: /assets/podcast/epNNN.mp3
audio.mp3.size_mb: number
chapters: [ { start: mm:ss, title: string, tag: string } ]
shownotes: [ { url, title } ]
guests: [ { name, url, role } ]
# Essay-only
location: string # defaults to "Lisbon"