Descarga, renombra y organiza tipografías de Google Fonts a escala sin depender de servicios externos. Mass Font Downloader es un script/CLI en Node.js pensado para equipos de frontend que necesitan preparar sus fuentes para builds estáticos, design systems o pipelines automatizados.
- ✅ Descarga masiva de familias, pesos y estilos directamente desde Google Fonts.
- 🧭 Renombrado consistente de archivos con patrón configurable (por defecto
<familia>-<peso>(-italic).<ext>). - 🎯 Nomenclatura personalizable (
Roboto-Regular.ttf,jetbrains-mono-700.woff2, etc.) mediantefileNameOptions. - 🗂️ Organización automática por carpetas (
output/fonts/<familia>). - 🧾 Generación opcional de un
font-options.tscon metadata lista para tus componentes. - 🛠️ Configuración flexible mediante archivo (
config/fonts.config.js) o CLI (bin/mass-fonts.js). - 🧪 Modo
--debugpara inspeccionar peticiones, variantes y errores durante la descarga.
Node.js · Axios · fs-extra · Commander · Google Fonts Web API
git clone https://github.com/tuusuario/mass-font-downloader.git
cd mass-font-downloader
npm installEl proyecto está escrito en módulos ES, por lo que se recomienda Node.js 18 o superior.
# Ejecuta la descarga usando la configuración del repositorio
npm run download
# o
npm startLos archivos se guardarán en el directorio definido en config/fonts.config.js (por defecto output/fonts). Si has habilitado generateOptionsFile, también se producirá font-options.ts con el arreglo FONT_OPTIONS para consumirlo en tus apps.
Si quieres reutilizar la lista de familias del config pero descargar únicamente ciertos pesos (por ejemplo Regular, SemiBold y Bold), pásalos como bandera al script oficial:
# Solo Regular, SemiBold y Bold para todas las familias del config
npm run download -- --weights regular,semibold,bold
# Para forzar todas las variantes disponibles e ignorar los pesos definidos en el config
npm run download -- --allLa bandera --weights acepta valores numéricos y alias textuales (regular, medium, semibold, bold, black, etc.). El patrón definido en fileNameOptions seguirá aplicándose, por lo que obtendrás nombres como Roboto-Regular.woff2 o Inter-SemiBold.woff2 sin tocar el archivo de configuración.
- Edita
config/fonts.config.jsy ajusta las propiedades:fonts: familias a descargar. Define pesos con arrays (weights: [400, 700]) o usa"all"/downloadAllVariants: truepara traer todas las combinaciones, incluyendo itálicas.formats: formatos globales (entrewoff2,woff,ttf). Cada familia puede sobrescribirlos.fileNameOptions: personaliza la nomenclatura final (familyCase,weightCase, sufijo de itálicas, etc.). UsaweightNaming: "text"para transformar400enRegulary conseguir archivos comoRoboto-Regular.ttf.subsets: subconjuntos de caracteres (latin,latin-ext, etc.).outputDir: carpeta raíz de salida.generateOptionsFileyoptionsFilePath: controlan la creación defont-options.ts.
- Ejecuta
npm run downloadpara aplicar la configuración.
La herramienta respetará los formatos disponibles en Google Fonts; si un formato no existe, se elegirá automáticamente el siguiente mejor (woff2 → woff → ttf) mostrando una advertencia.
Cuando necesites descargas puntuales, usa la CLI mass-fonts sin tocar la configuración:
# Durante el desarrollo
npm run cli -- --fonts "Roboto:400,700;Poppins:400" --output "output/fonts" --ts "output/font-options.ts" --subset latin --formats woff2,woff
# Con npx (sin instalación global)
npx mass-fonts --fonts "Inter:all" --all --output "output/fonts"Si ejecutas la CLI dentro de un proyecto que tenga config/fonts.config.js, puedes omitir --fonts
para reutilizar todas las familias, formatos y nomenclatura definidas allí. Por ejemplo:
npx mass-fonts --all --output "output/fonts"También puedes apuntar a otro archivo con --config ./mi-config.js.
| Opción | Descripción | Valor por defecto |
|---|---|---|
-f, --fonts <fonts> |
Familias y pesos separados por ; y , (opcional si hay config). |
— |
-o, --output <dir> |
Carpeta raíz donde se guardarán las fuentes. | output/fonts o config.outputDir |
--ts <file> |
Ruta del archivo font-options.ts a generar. |
Config o — |
--subset <subset> |
Subconjunto(s) de caracteres (latin, latin-ext, ...). |
latin o config.subsets |
--formats <formats> |
Formatos separados por coma (woff2, woff, ttf). |
config.formats o woff2 |
--weights <weights> |
Sobrescribe los pesos para todas las familias (regular,semibold,bold). |
— |
--config <file> |
Ruta del archivo de configuración a reutilizar. | config/fonts.config.js si existe |
--all |
Descarga todas las variantes disponibles para cada familia. | false |
--debug |
Muestra logs detallados de la petición y cada descarga. | false |
Consejo: combina
--debugcon la variableMASS_FONTS_DEBUG=1para inspeccionar respuestas crudas en pipelines CI.
Los pesos pueden declararse tanto en formato numérico (400, 500, 700) como textual (regular, medium, semibold, bold, black).
La opción --weights acepta los mismos alias y, cuando se usa junto con --config (o el archivo por defecto), reemplaza los pesos definidos allí.
La opción --all ignora la lista explícita y trae todas las variantes publicadas por Google Fonts (incluyendo itálicas cuando existan).
output/
└── fonts/
├── roboto/
│ ├── Roboto-Regular.woff2
│ ├── Roboto-RegularItalic.woff2
│ └── Roboto-Bold.woff2
└── poppins/
├── Poppins-Regular.woff2
├── Poppins-SemiBold.woff2
└── Poppins-Bold.woff2
Si generateOptionsFile está activo, se producirá un font-options.ts similar a:
export const FONT_OPTIONS = [
{
name: 'Roboto',
folder: 'roboto',
files: ['Roboto-Regular.woff2', 'Roboto-RegularItalic.woff2', 'Roboto-Bold.woff2']
}
];- Añade
npm run downloada tu pipeline (GitHub Actions, GitLab CI, etc.) para materializar fuentes antes del build. - Usa
npx mass-fontscon los parámetros necesarios en scripts de despliegue. - Activa
--debugpara obtener visibilidad en entornos donde el acceso a Google Fonts pueda estar restringido.
npm testLas pruebas basadas en node --test cubren el parsing del CSS de Google Fonts, la detección de variantes (incluyendo itálicas) y la normalización de nombres de archivo.
📦 mass-font-downloader
┣ 📂 bin
┣ 📂 config
┣ 📂 lib
┣ 📂 scripts
┣ 📂 tests
┣ 📂 assets
┣ 📜 README.md
┣ 📜 CHANGELOG.md
┗ 📜 package.json
¿Encontraste un caso de uso nuevo o un bug? Abre un issue o envía un PR. Las contribuciones son bienvenidas.
MIT © 2025 AlvaroMaxter