RepoPilotOpen in app →

rsms/inter

The Inter font family

Mixed

Stale — last commit 1y ago

weakest axis
Use as dependencyConcerns

non-standard license (OFL-1.1); last commit was 1y ago…

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 4 active contributors
  • OFL-1.1 licensed
  • CI configured
  • Stale — last commit 1y ago
  • Small team — 4 contributors active in recent commits
  • Single-maintainer risk — top contributor 97% of recent commits
  • Non-standard license (OFL-1.1) — review terms
  • No test directory detected
What would change the summary?
  • Use as dependency ConcernsMixed if: clarify license terms

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/rsms/inter?axis=fork)](https://repopilot.app/r/rsms/inter)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/rsms/inter on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: rsms/inter

Generated by RepoPilot · 2026-05-07 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/rsms/inter shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Stale — last commit 1y ago

  • 4 active contributors
  • OFL-1.1 licensed
  • CI configured
  • ⚠ Stale — last commit 1y ago
  • ⚠ Small team — 4 contributors active in recent commits
  • ⚠ Single-maintainer risk — top contributor 97% of recent commits
  • ⚠ Non-standard license (OFL-1.1) — review terms
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live rsms/inter repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/rsms/inter.

What it runs against: a local clone of rsms/inter — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in rsms/inter | Confirms the artifact applies here, not a fork | | 2 | License is still OFL-1.1 | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 564 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>rsms/inter</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of rsms/inter. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/rsms/inter.git
#   cd inter
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of rsms/inter and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "rsms/inter(\\.git)?\\b" \\
  && ok "origin remote is rsms/inter" \\
  || miss "origin remote is not rsms/inter (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(OFL-1\\.1)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"OFL-1\\.1\"" package.json 2>/dev/null) \\
  && ok "license is OFL-1.1" \\
  || miss "license drift — was OFL-1.1 at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "Makefile" \\
  && ok "Makefile" \\
  || miss "missing critical file: Makefile"
test -f ".github/workflows/build-fonts.yml" \\
  && ok ".github/workflows/build-fonts.yml" \\
  || miss "missing critical file: .github/workflows/build-fonts.yml"
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f "docs/_data/fontinfo.json" \\
  && ok "docs/_data/fontinfo.json" \\
  || miss "missing critical file: docs/_data/fontinfo.json"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 564 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~534d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/rsms/inter"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Inter is a meticulously crafted variable typeface optimized for screen rendering, built as a complete font family with 9 weights and italic variants. It features a tall x-height, contextual alternates for punctuation, slashed zero, tabular numbers, and OpenType features—all distributed as production-ready WOFF2 files for web and desktop use. Monorepo structure: root Makefile orchestrates builds; src/ likely contains font source files (UFO or designspace format); build scripts in Python (404KB suggests font compilation/testing pipeline) and C (143KB suggests low-level font utilities); docs/ is a Jekyll site with pre-built WOFF2 binaries and fontinfo.json metadata; .github/workflows/ handles automated builds and deployment.

👥Who it's for

Web designers, UI engineers, and typography-conscious developers who need a high-quality, freely-licensed sans-serif font that renders crisply on screens and supports variable font features. Also: font enthusiasts and maintainers of design systems (Figma, GitLab, Mozilla, ElementaryOS use it).

🌱Maturity & risk

Highly mature and production-ready. The repo shows active maintenance with GitHub Actions CI/CD (build-fonts.yml, pages.yml), comprehensive documentation in docs/, pre-built font files in docs/font-files/, and adoption by major companies. Latest releases available on GitHub; ecosystem distribution via npm (inter-ui), Homebrew, and Linux package managers confirms stability.

Minimal risk for consumers; low risk for contributors. Single maintainer (rsms) visible in the codebase, but the project has been stable for years with no indication of abandonment. Primary risk: font binary regeneration depends on Python scripts (404KB) and C tools (143KB)—build environment must match original. No heavy third-party dependency chain visible; main risk is reproducibility of font compilation.

Active areas of work

Active maintenance with GitHub Actions pipelines for automated font builds (build-fonts.yml) and documentation deployment (pages.yml). Repo accepts bug reports and feature requests via issue templates (bug_report.md, feature_request.md) and hosts Q&A in Discussions. Recent activity includes docs updates (fontinfo.json, glyphinfo.json data files) and font file distribution.

🚀Get running

git clone https://github.com/rsms/inter.git && cd inter && make The Makefile is the entry point; check Pipfile for Python dependencies (pip install or pipenv install). Review docs/README.md and CONTRIBUTING.md before making changes.

Daily commands: make (default target builds fonts) or make build-fonts. For docs: cd docs && make build (Jekyll). Requires Python (Pipenv), likely FontTools or similar in Pipfile, and C compiler for native tools. Check Makefile for exact targets.

🗺️Map of the codebase

  • Makefile — Primary build orchestration for font compilation; defines all build targets and workflow dependencies.
  • .github/workflows/build-fonts.yml — Automated CI/CD pipeline that builds and releases font files; critical for understanding deployment process.
  • README.md — Project overview, licensing, and quick-start guide; essential context for all contributors.
  • docs/_data/fontinfo.json — Master font metadata and version information; referenced by build system and documentation.
  • CONTRIBUTING.md — Contribution guidelines, code standards, and submission process; required reading before pull requests.
  • docs/_config.yml — Jekyll site configuration for documentation and demo hosting; controls public-facing font showcase.
  • Pipfile — Python dependency management for build scripts and font processing tools.

🧩Components & responsibilities

  • Makefile (Make, Bash, Python (via Pipfile tools)) — Orchestrates all build steps: font compilation, validation, optimization, and artifact placement
    • Failure mode: Build stops; fonts not updated; users see stale versions until manual fix and re-push
  • GitHub Actions (build-fonts.yml) (GitHub Actions YAML, bash) — Automates Makefile execution on every master push; uploads compiled fonts and triggers Pages deployment
    • Failure mode: CI failure blocks deployment; fonts and docs do not update; contributors notified via check status
  • Font compilation tools (fonttools, designspace) (Python fonttools, designspace, uharfbuzz) — Converts UFO source files to production-ready WOFF2 and TTF variants with OpenType features baked in
    • Failure mode: Compilation error prevents font generation; CI fails; users left with previous version
  • Jekyll documentation site (Jekyll, Liquid templates, YAML) — Renders HTML pages from Markdown and YAML data; serves as primary user-facing showcase and download hub
    • Failure mode: Jekyll build error; documentation site does not update; users cannot see new features or download links
  • GitHub Pages hosting (GitHub Pages, Cloudflare CDN) — Serves compiled fonts and HTML documentation to end users via CDN
    • Failure mode: GitHub outage; fonts and docs unreachable; users cannot download or preview Inter

🔀Data flow

  • Developer (local machine)GitHub repository (master — undefined

🛠️How to make changes

Add a new font weight or style variant

  1. Create or modify source UFO/glyphs file for the new weight in the source directory (Makefile)
  2. Update fontinfo.json with new weight metadata and axis ranges (docs/_data/fontinfo.json)
  3. Add new @font-face declarations in the CSS file (docs/inter.css)
  4. Re-run make build to compile new font files into docs/font-files/ (Makefile)

Add a new feature to the documentation site

  1. Create new HTML file or add section to existing documentation in docs/ (docs/index.html)
  2. Update _config.yml if adding new navigation menu items (docs/_config.yml)
  3. Add corresponding data to docs/_data/ (faq.yml, feature_samples.yml, etc.) if needed (docs/_data/faq.yml)
  4. Push to master; GitHub Actions automatically deploys via .github/workflows/pages.yml (.github/workflows/pages.yml)

Update font metadata or features documentation

  1. Update feature list and descriptions in docs/_data/fontinfo.json (docs/_data/fontinfo.json)
  2. Add glyph information and OpenType feature details to docs/_data/glyphinfo.json (docs/_data/glyphinfo.json)
  3. Update feature samples in docs/_data/feature_samples.yml for visual reference (docs/_data/feature_samples.yml)
  4. Documentation site automatically re-renders with Jekyll on next deploy (docs/_config.yml)

🔧Why these technologies

  • UFO/designspace (font source format) — Standard, version-control-friendly format for font design; supports multiple masters and variable font generation.
  • Python + Pipenv (build scripting) — Fonttools and other Python font utilities are industry standard; Pipenv ensures reproducible builds.
  • GitHub Actions CI/CD — Native GitHub integration; automatically builds and deploys on push without external services.
  • Jekyll (static site generation) — Built-in GitHub Pages support; simple markdown/YAML configuration; sufficient for showcase and documentation.
  • WOFF2 web font format — Superior compression vs WOFF/TTF; modern browser support; reduces bandwidth for web distribution.

⚖️Trade-offs already made

  • Single-purpose monorepo (font design + documentation + web showcase)

    • Why: Simplifies versioning; keeps source and distribution together; single release cycle.
    • Consequence: Documentation changes trigger full rebuild; larger repo clones; mixed concerns in root Makefile.
  • GitHub Pages for hosting instead of dedicated CDN

    • Why: Free, zero-config hosting directly from the repo; sufficient for static font files.
    • Consequence: No geolocation-based optimization; relies on GitHub's edge network; limited control over cache headers.
  • Automated CI/CD build on every master push

    • Why: Ensures fonts are always up-to-date; prevents manual build step errors.
    • Consequence: Longer PR merge time; all builds are public; no staging environment to test before release.
  • Variable font + multiple static variants distribution

    • Why: Supports legacy browsers (static) and modern browsers (variable); allows fine-grained weight selection.
    • Consequence: Larger total distributable; more build targets; complex CSS @font-face declarations.

🚫Non-goals (don't propose these)

  • Does not provide visual font editor UI (uses external tools like Glyphs App, FontForge)
  • Does not offer server-side font rendering or API
  • Does not include font subsetting or dynamic variant generation
  • Does not support real-time collaborative design (single-author maintained)
  • Does not provide A/B testing or analytics for font usage

🪤Traps & gotchas

Font source files (UFO or designspace) not visible in the file listing—they may be in a src/ or similar directory not shown or in a separate branch. Build requires C compiler and Python font tools in exact versions per Pipfile. Regenerating font binaries reproducibly is non-trivial: build environment (FreeType, HarfBuzz versions, Python libraries) must match original. WOFF2 is binary; changes require rebuild, not direct editing. GitHub Actions secrets or credentials may be needed for releasing to GitHub Releases. Docs site pulls fontinfo.json at build time—regenerate it after font changes.

🏗️Architecture

💡Concepts to learn

  • Variable Fonts (OpenType Variations) — Inter's core value proposition; a single font file contains all 9 weights + italics, dynamically interpolated via axes—essential for understanding why font-weight: 700 works without separate file requests
  • OpenType Features (.fea) — Contextual alternates, slashed zero, tabular numbers—all defined in feature code; changes to these require understanding the feature syntax and how HarfBuzz applies them
  • UFO (Unified Font Object) — Source format for Inter (likely); XML-based, human-readable representation of glyphs, metrics, and kerning that scripts compile to binary TTF/OTF
  • WOFF2 Compression — Inter distributes WOFF2 binaries (docs/font-files/); understanding the compression codec and subsetting trade-offs is crucial for web delivery optimization
  • Designspace & Interpolation — Variable font generation requires designspace files defining master sources and interpolation paths; font weights are algorithmically generated between masters, not manually drawn
  • Glyph Metrics & Kerning — Inter's 'tall x-height' and contextual kerning are core design choices; scripts likely validate metrics consistency and kerning coverage across weights
  • GitHub Actions CI/CD for Font Builds — build-fonts.yml shows automated test, compile, and release pipeline; understanding how font binaries are reproducibly generated and deployed is critical for maintenance
  • google/roboto — Competing open-source variable font family with similar scope; useful for understanding design system coordination across weights and features
  • mozilla/Fira — Mozilla's own font project; shows how a major tech company maintains an in-house typeface and distributes it
  • fonttools/fonttools — Core Python library likely used in Inter's build pipeline for UFO parsing, feature compilation, and binary font generation
  • harfbuzz/harfbuzz — Text shaping engine; Inter's OpenType features (contextual alternates, tabular nums) are validated against HarfBuzz during builds
  • rsms/gotham — Earlier font project by the same author (rsms); shows typographic design evolution and build tooling patterns

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add font validation tests in build-fonts.yml workflow

The .github/workflows/build-fonts.yml workflow builds font files but lacks validation tests to ensure generated fonts are valid, have correct glyphs, and contain expected OpenType features (contextual alternates, slashed zero, tabular numbers mentioned in README). This prevents regressions when font sources change.

  • [ ] Review current build-fonts.yml workflow to understand build process
  • [ ] Add fonttools (fontTools Python package) or similar validation step to check font integrity
  • [ ] Validate that both Inter and InterDisplay families contain expected OpenType features (CALT, ZERO, TNUM)
  • [ ] Add glyph count validation to ensure no glyphs are accidentally removed
  • [ ] Test variable font axes are properly defined in InterVariable files
  • [ ] Document validation approach in CONTRIBUTING.md

Create docs/_data/changelog.yml and automate release notes generation

The repo has detailed font files in docs/font-files/ and uses Jekyll for documentation (docs/_config.yml, _layouts/), but lacks a structured changelog or release notes system. This makes it hard for users to understand what changed between versions. A changelog.yml file with automated GitHub Actions integration would improve discoverability.

  • [ ] Create docs/_data/changelog.yml with structured entries for recent releases
  • [ ] Add a new 'Changelog' page in docs/ (e.g., docs/changelog/index.html or docs/changelog.md)
  • [ ] Create a Jekyll include template (docs/_includes/changelog.html) to render changelog.yml
  • [ ] Add a GitHub Action step to auto-generate changelog entries from git tags and commits
  • [ ] Link changelog from main README.md
  • [ ] Document the changelog entry format for future maintainers

Add comprehensive font download metadata and integrity checks

The docs/download/index.html page serves multiple font variants (Inter, InterDisplay, variable fonts) and docs/font-files/ contains WOFF2 and TTF files, but there's no documented checksum/hash verification system for users to validate downloads. This is a security and trust best practice for widely-used open-source fonts.

  • [ ] Generate SHA-256 checksums for all font files in docs/font-files/ and store in docs/_data/font-checksums.json
  • [ ] Create a script (e.g., scripts/generate-checksums.sh) to auto-generate checksums during the build process
  • [ ] Update docs/download/index.html to display checksums and provide copy-to-clipboard functionality
  • [ ] Add checksum validation instructions to CONTRIBUTING.md for font maintainers
  • [ ] Add a GitHub Action step to verify checksums match generated fonts in build-fonts.yml
  • [ ] Document the checksum format and update process for future releases

🌿Good first issues

  • Add Python type hints to build scripts (404KB of Python suggests annotation coverage gaps; check src/ for unannotated font compilation functions and add -> None, -> Dict[str, Any] signatures).
  • Expand CONTRIBUTING.md with a 'Building fonts locally' section: document the exact UFO editor needed, link to FontTools docs, and show example make targets (currently sparse for first-time contributors).
  • Create a minimal test file (e.g., tests/test_build.py) that validates font binary integrity: load a built font, check glyph count matches source, verify WOFF2 compression ratio—currently no visible test suite despite 143KB of C utilities.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 353b61b — sync metrics keys (rsms)
  • 458bcd4 — adds "missing" alternate /a glyphs for superscript & subscript. Closes #456 (rsms)
  • 9bdd60c — tooling: simplify makefile by updating PATH (which is broken in macOS "make", so require GNU make on macOS) (rsms)
  • 41ce65b — fixes shape bug in U+0490 /Geupturn-cy. Closes #766 (rsms)
  • 4f4db2f — fixes bug with alternate /aturn glyphs in roman (rsms)
  • f60b3aa — reduce tail length of atail at 900 + more kerning (rsms)
  • dcec7c7 — a.2 kerning (rsms)
  • 76aa381 — Adds character variant 16: Lower-case a with tail (roman only) (rsms)
  • 80a5fc0 — readme: add mention of "Raveo" (rsms)
  • a264bbe — adds alternate tabular one without bottom stroke via cv15 (rsms)

🔒Security observations

The Inter font repository has a generally secure posture as a font distribution project. No critical vulnerabilities were identified. Primary concerns are around dependency management (Python and Ruby), build artifact distribution, and lack of cryptographic verification for releases. The codebase is primarily focused on font design and distribution rather than complex application logic, limiting traditional software vulnerabilities like injection attacks. Regular dependency audits and implementation of release signing would improve the security score.

  • Medium · Pipfile.lock Dependency Management — Pipfile, Pipfile.lock. The presence of Pipfile and Pipfile.lock indicates Python dependency management. Without visibility into the actual content of these files, there's a risk of outdated or vulnerable dependencies. Python projects should regularly audit dependencies for known CVEs. Fix: Regularly run 'pip-audit' or 'safety' to check for vulnerable dependencies. Enable Dependabot on GitHub to automatically detect and alert on vulnerable packages.
  • Low · Build Artifacts in Repository — docs/font-files/. Pre-built WOFF2 font files are committed to the repository under docs/font-files/. While fonts themselves are not typically a security risk, this increases repository size and could theoretically be used to distribute modified versions if the repository is compromised. Fix: Consider removing build artifacts from version control and generating them during CI/CD pipeline only. Use Git LFS for large binary files if retention is necessary.
  • Low · Potentially Outdated Ruby Dependencies — docs/Gemfile, docs/Gemfile.lock. The docs folder contains Gemfile and Gemfile.lock, indicating a Jekyll site (Ruby-based). Without visibility into specific versions, there's a risk of using outdated gems with known vulnerabilities. Fix: Regularly audit Ruby dependencies using 'bundle audit' or 'bundler-audit'. Enable Dependabot monitoring for Ruby dependencies.
  • Low · Build Script Security — .github/workflows/build-fonts.yml, .github/workflows/pages.yml, docs/_scripts/build-fontkit.js.sh. Shell scripts in .github/workflows and docs/_scripts are used for building and deployment. Shell scripts can be vulnerable to injection attacks if they process untrusted input. Fix: Review all shell scripts for proper input validation and sanitization. Avoid using eval() or executing user input directly. Use explicit set -euo pipefail at script start.
  • Low · Lack of Code Signing — Release process (not visible in structure). No evidence of code signing or integrity verification for released font files or build artifacts. Users cannot verify the authenticity of downloaded files. Fix: Implement GPG signing for releases. Generate and publish checksums (SHA256) for all distributed files. Document signature verification process for users.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · rsms/inter — RepoPilot