Skip to main content

Professional font library management with metadata extraction, search, and format conversion

Project description

HOLE Fonts - Professional Font Management System

Version: 2.0.0 Status: โœ… Production Ready Python: 3.11+

Professional font library management with metadata extraction, intelligent search, duplicate detection, and format conversion.


Installation

# From PyPI (coming soon)
pip install hole-fonts

# From source
git clone https://github.com/The-HOLE-Foundation/hole-fonts.git
cd hole-fonts
pip install .

# Verify
hole-fonts --help

See INSTALLATION.md for detailed installation options.


Quick Start

# 1. Scan your fonts
hole-fonts scan /path/to/your/fonts --output my-fonts.json

# 2. Search by designer
hole-fonts search my-fonts.json --designer "Adrian Frutiger"

# 3. Find sans-serif fonts
hole-fonts search my-fonts.json --classification "sans-serif"

# 4. Find duplicates
hole-fonts dedup my-fonts.json

See USER-QUICKSTART.md for complete usage guide.


Overview

HOLE Fonts is a professional-grade font management system that provides:

  • Metadata Extraction - Designer, foundry, copyright, description from font files
  • Intelligent Search - Find fonts by designer, foundry, classification, weight, style
  • Duplicate Detection - Find duplicate fonts with 95%+ accuracy
  • Format Conversion - Convert between TTF, OTF, WOFF2
  • Variable Font Support - Automatic detection and preservation
  • FontBase Integration - Export for use with FontBase organizer

Key Features (v2.0.0)

๐Ÿ” Search & Discovery

  • Search 24,000+ fonts in milliseconds
  • Filter by designer (93.9% coverage)
  • Filter by foundry (94.9% coverage)
  • Classification inference (sans-serif, serif, display, mono)
  • Weight, width, italic filtering
  • Variable font detection

๐Ÿ“Š Metadata Intelligence

  • Designer names extracted from font files
  • Foundry/manufacturer information
  • Copyright and licensing info (98.9% coverage)
  • Font descriptions and history
  • Vendor and designer URLs
  • No external API dependency

๐ŸŽฏ Duplicate Detection

  • Strict matching rules (95%+ name similarity)
  • Weight/width/italic exact matching
  • Monotype unique ID validation
  • Confidence scoring
  • Space savings calculation

๐Ÿ”„ Format Conversion

  • TTF โ†” OTF โ†” WOFF2
  • Variable font preservation
  • Batch processing
  • FontBase-optimized export

The Smart Division of Labor

HOLE Fonts = Conversion Engine

  • โœ… Batch font conversion (TTF โ†” OTF โ†” WOFF2)
  • โœ… Variable font detection & preservation
  • โœ… Automated export to FontBase-friendly structure
  • โœ… 100% success rate on 126+ font families

FontBase (Free!) = Organization & Management

  • โœ… Auto-import from watched folders
  • โœ… Collections for virtual organization
  • โœ… Font activation/deactivation
  • โœ… Beautiful previews & search
  • โœ… Design tool integration

Quick Start

1. Export Your Fonts

# Single family
uv run python -m hole_fonts.cli export Input/FamilyName/

# All families (batch)
uv run python -m hole_fonts.cli export Input/Organized-Folders/

# Custom location
uv run python -m hole_fonts.cli export Input/Fonts/ --to ~/FontBase-Library/

2. Install FontBase

  1. Download: https://fontba.se/
  2. Install and launch
  3. Add Folder โ†’ FontBase-Export/
  4. Enable "Watch for changes"

3. Start Organizing!

Use FontBase Collections to organize fonts by:

  • Project (Website 2025, Brand Guidelines)
  • Foundry (Adobe, Monotype, Google)
  • License (Commercial, Personal, Open Source)
  • Style (Sans Serif, Serif, Display, Script)

Features

Font Conversion

  • Formats Supported: TTF, OTF, WOFF, WOFF2
  • Variable Font Detection: Automatic detection with axis preservation
  • Batch Processing: Process entire directories
  • Format Conversion: Convert between any supported formats
  • Quality: Zero data loss, metadata preserved

Export Structures

flat-by-family (Recommended for FontBase)

FontBase-Export/
โ”œโ”€โ”€ AgencyFB/
โ”‚   โ”œโ”€โ”€ AgencyFB-Bold.ttf
โ”‚   โ”œโ”€โ”€ AgencyFB-Bold.otf
โ”‚   โ””โ”€โ”€ AgencyFB-Bold.woff2
โ””โ”€โ”€ Helvetica/
    โ””โ”€โ”€ ...

format-separated

FontBase-Export/
โ””โ”€โ”€ AgencyFB/
    โ”œโ”€โ”€ OTF/
    โ”œโ”€โ”€ TTF/
    โ””โ”€โ”€ WOFF2/

single-flat

FontBase-Export/
โ”œโ”€โ”€ AgencyFB-Bold.ttf
โ”œโ”€โ”€ AgencyFB-Bold.otf
โ””โ”€โ”€ AgencyFB-Bold.woff2

Variable Font Support

  • โœ… Automatic detection (fvar table)
  • โœ… Axis information extraction
  • โœ… Variation data preservation
  • โœ… Named instances preserved
  • โœ… Visual indicators in output (๐ŸŽจ)

Supported axes: wght, wdth, slnt, opsz, ital, SERF, CONT, and custom axes


Project Structure

HOLE-Fonttools-Project/
โ”œโ”€โ”€ hole_fonts/              # Core package
โ”‚   โ”œโ”€โ”€ converter.py        # Font conversion engine
โ”‚   โ”œโ”€โ”€ exporter.py         # FontBase integration
โ”‚   โ”œโ”€โ”€ organizer.py        # Library organization (legacy)
โ”‚   โ””โ”€โ”€ config.py           # Configuration
โ”œโ”€โ”€ Input/                  # Source fonts
โ”œโ”€โ”€ FontBase-Export/        # Exported fonts โ†’ Add to FontBase
โ”œโ”€โ”€ Output/                 # Temporary conversions
โ”œโ”€โ”€ config.yaml             # Configuration
โ”œโ”€โ”€ pyproject.toml          # Package definition
โ””โ”€โ”€ Documentation/
    โ”œโ”€โ”€ QUICKSTART.md
    โ”œโ”€โ”€ FONTBASE_SETUP_GUIDE.md
    โ”œโ”€โ”€ IMPLEMENTATION_PLAN.md
    โ””โ”€โ”€ ARCHITECTURE_PROPOSAL.md

Commands

Scanning & Database Building

# Scan fonts directory and create database
hole-fonts scan /path/to/fonts --output my-fonts.json

# Scan with progress tracking (processes ~10-20 fonts/second)
hole-fonts scan ~/Library/Fonts --output system-fonts.json

Searching Fonts

# Search by designer
hole-fonts search my-fonts.json --designer "Adrian Frutiger"

# Search by foundry
hole-fonts search my-fonts.json --foundry "Monotype"

# Search by classification
hole-fonts search my-fonts.json --classification "sans-serif"

# Find variable fonts
hole-fonts search my-fonts.json --variable

# Combine filters
hole-fonts search my-fonts.json --foundry "Adobe" --classification "sans-serif" --weight-min 700

Duplicate Detection

# Find duplicate fonts
hole-fonts dedup my-fonts.json

# Use custom confidence threshold
hole-fonts dedup my-fonts.json --min-confidence 0.80

# Save report to file
hole-fonts dedup my-fonts.json > duplicates-report.txt

Font Conversion

# Simple in-place conversion (creates format subdirectories)
hole-fonts convert-simple /path/to/fonts

# Convert single font to all formats
hole-fonts convert font.ttf

# Export to FontBase-friendly structure
hole-fonts export /path/to/fonts --to ~/FontBase-Export/

Legacy Commands (v1.0)

# List library (old organization system)
uv run python -m hole_fonts.cli list

# Show family info
uv run python -m hole_fonts.cli info FamilyName

# Validate library structure
uv run python -m hole_fonts.cli validate

Configuration

Edit config.yaml:

export:
  default_path: 'FontBase-Export'
  structure: 'flat-by-family'

formats:
  - ttf
  - otf
  - woff2

processing:
  parallel_workers: 4

Results

Batch Conversion Stats

First Batch (126 families):

  • โœ… 126/126 families processed successfully
  • โœ… 0 failures (100% success rate)
  • โœ… 7 variable fonts detected
  • โœ… Thousands of fonts converted
  • โœ… All formats generated

Notable Collections:

  • Area: 175 fonts per format (525 total)
  • BentonSans: 140 fonts (420 total)
  • VariableFonts: 126 variable fonts (378 total)
  • HelveticaNow: 96 fonts (288 total)
  • And many more professional typefaces

Variable Fonts Detected

Width Variations:

  • wdth: Width (50-200)
  • CONT: Contrast (1-1000)

Weight Variations:

  • wght: Weight (100-900)

Slant/Italics:

  • slnt: Slant (-12 to 12)
  • ital: Italic (0-100)

Optical Size:

  • opsz: Optical Size (6-72)

Custom Axes:

  • SERF: Serif amount
  • HGHT: Height
  • SANS: Sans amount

Workflow Examples

New Font Project

# 1. Get fonts
cp ~/Downloads/NewFonts/* Input/ProjectName/

# 2. Export to FontBase
uv run python -m hole_fonts.cli export Input/ProjectName/

# 3. FontBase auto-imports (if watching)

# 4. Create Collection in FontBase
#    Name: "Website 2025"
#    Add fonts, activate, work!

Web Font Generation

# Export only WOFF2
uv run python -m hole_fonts.cli export Input/Fonts/ \
    --formats woff2 \
    --to WebProject/public/fonts/

Archive Preparation

# All formats, organized by type
uv run python -m hole_fonts.cli export Input/Archive/ \
    --structure format-separated \
    --to Archive-Library/

Technical Details

Dependencies

fonttools[woff] >= 4.61.1  # Core conversion
click >= 8.1.0              # CLI interface
pyyaml >= 6.0              # Configuration
rich >= 13.0.0             # Terminal UI
requests >= 2.31.0         # API calls (v0.2)

Supported Platforms

  • macOS (tested)
  • Linux (supported)
  • Windows (supported)

Performance

  • Conversion Speed: ~2-3 seconds per font
  • Batch Processing: Handles 100+ families easily
  • Variable Fonts: Full support with no performance penalty
  • Scalability: Tested with 1000+ fonts

Future Roadmap

v0.2 - Metadata Integration

  • Adobe Typekit API integration
  • Font metadata enrichment (designer, foundry, history)
  • Smart duplicate detection via UUID
  • Search and filtering functionality
  • HTML catalog generation

v0.3 - Advanced Features

  • CSS @font-face generation
  • Font subsetting for web
  • Web font optimization
  • License management
  • Font validation tools

v0.4 - Team Collaboration

  • Shared font registries
  • Multi-library support
  • Audit logs
  • Font approval workflows
  • Client project tracking

Why This Architecture?

Problem: Font Library Organization is Hard

Past attempts at automated organization often fail:

  • Fonts split incorrectly by weight/style
  • Every font becomes its own "family"
  • Complex rules that don't match real-world usage
  • Hard to fix mistakes without reconverting

Solution: Separation of Concerns

HOLE Fonts does what computers do best:

  • Fast, accurate format conversion
  • Batch processing
  • Variable font preservation
  • Standardized export

FontBase does what humans do best (with great tools):

  • Visual browsing and preview
  • Intuitive organization via Collections
  • Context-based grouping (project, client, style)
  • Easy reorganization anytime

Result: Professional workflow, zero frustration


Documentation


Credits

Powered by:

  • FontTools - Font conversion engine
  • FontBase - Font management (free!)
  • Python 3.14 with uv package manager

Created for: HOLE Foundation Branch: HOLE-FONTS-Ext Date: December 2025


License

Internal use for HOLE Foundation


Support

Issues or questions? Check the documentation in this repository or review the implementation logs.

Next steps: Install FontBase and start organizing your professional font library!


HOLE Fonts + FontBase = Professional Font Workflow โœจ

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hole_fonts-2.0.1.tar.gz (495.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hole_fonts-2.0.1-py3-none-any.whl (31.9 kB view details)

Uploaded Python 3

File details

Details for the file hole_fonts-2.0.1.tar.gz.

File metadata

  • Download URL: hole_fonts-2.0.1.tar.gz
  • Upload date:
  • Size: 495.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for hole_fonts-2.0.1.tar.gz
Algorithm Hash digest
SHA256 e440fc21758275aa280bb8431f43df9706e719d071f49ef74c7393f98f8214f1
MD5 9525869dcccbd72e82f3336c2331cea4
BLAKE2b-256 f5f27cc3e3d9277a8fbcf523173670dbaaf8c75356ff71fe5bc6e6223ed183c6

See more details on using hashes here.

File details

Details for the file hole_fonts-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: hole_fonts-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 31.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for hole_fonts-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5af7025f3d30e1c4280d3a300156392b87bf85bc0707d6a22ffa08e2c862941c
MD5 21ad6d705b7e6365c70b51ae3dfd0eff
BLAKE2b-256 02f73163ab3960be0780944c7a6be56aa4904a6a6c4a3991bb94e58c5d5bf64c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page