Brand type family for the Knowecon economics education platform, built by pure assembly: rename + OpenType feature freezing + Unicode subsetting of mature open-source fonts. No outlines are drawn or modified in this repo — every glyph ships exactly as its upstream designed it. Brand personality comes from which fonts we pick, which features we freeze, and how the pieces are combined per script (Latin / CJK / math / symbols).
| Family | Upstream | Processing | Used for |
|---|---|---|---|
| Knowecon Sans | Inter 4.1 | subset + feature freeze | web UI, data, body text |
| Knowecon Serif | Source Serif 4.005 | subset + feature freeze | long-form reading |
| Knowecon Sans SC / Serif SC | Source Han Sans / Serif | 8105-char subset, chunked woff2 | web CJK |
| Knowecon Math | STIX Two Math 2.13 | rename only (MATH table intact) | XeLaTeX unicode-math |
| Knowecon Symbols | Noto Sans Math 3.000 | symbol-range subset | web fallback for ∈ ⊂ ∀ … |
| Knowecon Emoji | Noto Emoji 3.002 (mono) | rename only | LaTeX + web emoji |
- Knowecon Sans — UI and data face, derived from Inter 4.1 (SIL OFL 1.1).
- Knowecon Serif — lecture-notes companion, derived from
Source Serif 4.005 (SIL OFL 1.1,
renamed per the "Source" reserved font name). Slashed zero frozen; figures
stay proportional in prose, tables opt in via
font-variant-numeric: tabular-nums. - Knowecon Sans SC / Serif SC — CJK web companions, derived from Source Han
Sans 2.005 / Source Han Serif 2.003. Subset to the 8105 General Standard
Chinese Characters (通用规范汉字表) + CJK punctuation, split into
frequency-ordered woff2 chunks with
unicode-rangeCSS (build/cjk/knowecon-cjk.css), so pages download only the chunks they use. Print/LaTeX keeps using the full upstream Source Han fonts. - Knowecon Math — rename-only derivative of STIX Two Math 2.13 (OFL;
"STIX Fonts" is a Reserved Font Name, hence the rename). Chosen over
Libertinus Math for on-screen clarity: sturdier strokes, larger x-height;
Times-lineage forms pair well with lecture PDFs. The OpenType MATH table is
preserved untouched. Used via
unicode-mathin XeLaTeX and available as woff2. Install locally:cp build/KnoweconMath-Regular.otf ~/Library/Fonts/. Web formulas keep KaTeX's default fonts (its layout metrics are hardcoded); seespecimen/katex.htmlfor the comparison that decided this. - Knowecon Symbols — math/set/logic symbol fallback for the web, subset
from Noto Sans Math 3.000 (OFL): arrows, mathematical operators
(∈ ⊂ ∪ ∀ ∃ ∇ ≡ ≪ ∼ ∘ ⋅ ∴ ∧ ∨ …), ceiling/floor, misc math A/B,
supplemental operators. Served with
unicode-rangeafter Knowecon Sans in the font stack, so it only fills codepoints Inter lacks. - Knowecon Emoji — rename-only derivative of Noto Emoji 3.002 (OFL,
monochrome outline version; "Noto" is a Reserved Font Name). Chosen
monochrome deliberately: XeLaTeX cannot render CBDT/COLR color emoji, but
outline glyphs work everywhere, and monochrome prints cleanly in lecture
notes. LaTeX templates define
\emoji{📈}/\emojifontwith a Noto fallback. Install locally:cp build/static/KnoweconEmoji-Regular.ttf ~/Library/Fonts/.
Frozen into Knowecon Sans as defaults (no CSS feature flags needed):
- Slashed zero + disambiguation (
ss02): 0/O, 1/l/I are unambiguous — critical for statistics and code. - Open digits (
ss01): more open 6/9 apertures, better small-size legibility for data. - Tabular figures (
tnum): all digits share one width, so financial tables align by default.
Character set (Sans/Serif): Basic Latin, Latin-1, Latin Extended-A, Greek (Δ Σ π β σ μ …), general punctuation, superscripts/subscripts, currency symbols (¥ $ € £ ₩ ₹ ₽ ₿ …), math operators (± × ÷ − ≤ ≥ ≈ ≠ …), arrows, fractions, circled numbers. The variable woff2 is ~160 KB.
build/KnoweconSans[opsz,wght].ttf|.woff2— variable font (weight 100–900, optical size 14–32)build/KnoweconSans-Italic[opsz,wght].ttf|.woff2— variable italicbuild/KnoweconSerif[opsz,wght].ttf|.woff2— serif variable (weight 200–900, optical size 8–60)build/KnoweconSerif-Italic[opsz,wght].ttf|.woff2— serif variable italicbuild/static/— static TTF instances (Regular / Medium / SemiBold / Bold + italics)build/cjk/— CJK woff2 chunks +knowecon-cjk.css(Sans SC 400/500/700, Serif SC 400/700)build/KnoweconMath-Regular.otf|.woff2— math font with MATH tablebuild/KnoweconSymbols-Regular.ttf|.woff2— math/set/logic web fallback (Noto Sans Math subset)build/KnoweconEmoji[wght].ttf|.woff2+build/static/KnoweconEmoji-Regular.ttf— monochrome emoji (variable wght 300–700; static for LaTeX)specimen/index.html— web specimen (serve the repo root, e.g.python3 -m http.server, so the CJK css under/fonts/cjk/resolves)specimen/specimen.png— rendered specimen image
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
# fetch upstream releases into vendor/ (paths expected by scripts/build.py)
curl -sL -o vendor/inter.zip https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip
unzip -o vendor/inter.zip -d vendor/inter
curl -sL -o vendor/source-serif.zip https://github.com/adobe-fonts/source-serif/releases/download/4.005R/source-serif-4.005_Desktop.zip
unzip -o vendor/source-serif.zip -d vendor/source-serif
# CJK sources (Source Han OTFs, release branch) into vendor/source-han/:
# SourceHanSansSC-{Regular,Medium,Bold}.otf, SourceHanSerifSC-{Regular,Bold}.otf
# Math source: STIX Two 2.13 release unzipped into vendor/stix/
# Symbols source: Noto Sans Math into vendor/noto-sans-math/
# Emoji source: Noto Emoji (variable) into vendor/noto-emoji/
make build cjk math symbols emoji specimen
make qa # fontbakery universal profile, FAIL-level gateCharset data in data/ (committed): tgsc-characters.txt (8105 chars, 字序) and
tgsc-by-frequency.txt (corpus frequency order used for chunk ordering).
Known accepted fontbakery FAILs: name/family_and_style_max_length
(long STAT names inherited from upstream) and serif nested_components
(upstream Source Serif composite structure); both are cosmetic here.
@font-face {
font-family: "Knowecon Sans";
src: url("/fonts/KnoweconSans[opsz,wght].woff2") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Knowecon Serif";
src: url("/fonts/KnoweconSerif[opsz,wght].woff2") format("woff2");
font-weight: 200 900;
font-style: normal;
font-display: swap;
}
/* symbol fallback: only downloaded/used for codepoints Inter lacks */
@font-face {
font-family: "Knowecon Symbols";
src: url("/fonts/KnoweconSymbols-Regular.woff2") format("woff2");
unicode-range: U+2190-21FF, U+2200-22FF, U+2308-230B, U+27C0-27EF,
U+2980-29FF, U+2A00-2AFF;
font-display: swap;
}
:root {
--font-sans: "Knowecon Sans", "Knowecon Symbols", ui-sans-serif, system-ui,
"PingFang SC", "Noto Sans SC", sans-serif;
--font-serif: "Knowecon Serif", "Knowecon Symbols", ui-serif, Georgia,
"Songti SC", serif;
}- v1: rename + feature freeze + subset pipeline, variable + static builds, specimen.
- v2–v6: an experiment in custom glyph redraws (geometric operator suite, from-scratch display capitals). Retired — self-drawn outlines could not match upstream production quality (broken joints, inconsistent rendering).
- v1.2/current: back to pure assembly. Sans/Serif ship untouched Inter / Source Serif outlines; math is a rename-only STIX Two Math; symbol coverage gaps are filled by a Noto Sans Math subset (Knowecon Symbols) instead of drawing anything ourselves.
scripts/— the whole pipeline:build.py(Sans/Serif),build_cjk.py,build_math.py,build_symbols.py,build_emoji.py, specimen renderers.build/— committed artifacts (fonts are the deliverable; rebuilding requires multi-GB upstream downloads, so outputs are versioned).data/— 通用规范汉字表 charset + frequency order for CJK chunking.specimen/— HTML specimens and rendered PNGs.vendor/,.venv/— not committed; populated per the Build section.
Deployment: the Knowecon website vendors the woff2 files under
priv/static/fonts/ in the main app repo; LaTeX templates use the static
TTF/OTF installs from build/static/.
Dual structure:
- Fonts (
build/,fonts/,data/): SIL Open Font License 1.1. All upstreams are OFL 1.1; OFL condition 5 requires derivatives to stay OFL, so the Knowecon families are OFL too. In practice this is as permissive as MIT for users — free commercial use, embedding, bundling, and redistribution — with two extra rules: font files may not be sold by themselves, and derivatives may not reuse upstream Reserved Font Names ("Source", "TM Math", "Noto"), which we satisfy by renaming. Every binary keeps the upstream copyright and OFL notice in itsnametable (IDs 0/13/14) and credits the exact upstream version in its version string. - Build scripts (
scripts/): MIT — our own code, reusable without OFL obligations.
Documents and products typeset or rendered with these fonts are not affected by the OFL (explicitly exempted by the license).
