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.
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. 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"