Journal Chères moules, votre bouchot est trop lourd ? J'ai la soluce (libre, en Go, sans Node)

Posté par  . Licence CC By‑SA.
Étiquettes :
5
17
juil.
2026

Cher journal, chères moules,

Votre site pèse trois tonnes, vos polices tirent des mégaoctets et vos SVG partent sur le web sans même être décortiqués ? J'ai deux petites soluces. Libres (MIT1), en Go, et qui ne réclament ni Node ni Python pour tourner. Transparence d'abord : je les ai extraites d'un service que je bricole (patu.dev, hop, le lien est passé ; et comme il est court, vous allez vous en souvenir longtemps, trop tard pour le « -1 pub », pire qu'un rickroll). Mais le code est à vous, et c'est lui le sujet.

woffify : décortiquer vos polices jusqu'au WOFF2

L'encodeur WOFF2 de référence, c'est google/woff2 (woff2_compress). Sauf qu'il ne mange que du TTF/OTF et ne fait pas de subsetting. Or un TTF brut sur le web, c'est deux tiers de gras2, et le subsetting (ne garder que les glyphes utiles) est le plus gros levier.

woffify enrobe le même encodeur et ajoute les deux trucs qui manquaient :

  • Entrée WOFF 1.0, décodée en SFNT en Go pur, pour recompresser vos vieux .woff sans perte.
  • Subsetting via HarfBuzz (hb-subset) : un sous-ensemble latin fait couramment 80 à 95 % de moins.

Détail pour les maniaques (bonjour) : sur du TTF/OTF sans subsetting, la sortie est octet pour octet identique à woff2_compress (même encodeur, Brotli qualité 11). Pas « presque pareil », pareil.

Formats avalés : .woff, .ttf, .otf, .ttc, .eot. Oui, EOT, pour exhumer vos assets Internet Explorer3 ; seul l'EOT non compressé est lu, la compression MicroType Express est refusée avec un message clair plutôt qu'un segfault poli.

Le tout tient dans un seul binaire statique (image ~6 Mo), zéro Node, zéro Python, pensé pour la CI et les clusters.

woffify -subset-text "Salut les moules" Brand.ttf

silk : dégraisser vos SVG sans invoquer Node

Pour les SVG, la référence c'est svgo. C'est du Node. Tirer 300 Mo de node_modules pour raboter une icône de 2 Ko dans un service Go, non merci.

silk réimplémente en Go pur (pas de cgo, pas de runtime externe) les passes de svgo qui pèsent vraiment : convertPathData, mergePaths, et une poignée de passes structurelles sûres. Et surtout, il a une religion : la sortie doit rendre pixel pour pixel comme l'entrée. Toute construction dont l'optimisation ne peut pas être prouvée sûre est réémise telle quelle, octet pour octet. Pas de « ça a marché sur mes trois icônes ».

Le seul vrai risque de fidélité, c'est l'arrondi des coordonnées : il est donc opt-in et borné (-precision). Les translations de transformations ne sont arrondies que si vous le demandez, parce qu'arrondir la translation d'un groupe décale des sous-arbres entiers et transforme un joli motif régulier en moiré4.

out, err := silk.Optimize(svg, silk.DefaultOptions())

Licence, et non ce n'est pas du Rust

Les deux sont en MIT. Je vous laisse lancer le débat permissif contre copyleft en commentaire, c'est vendredi quelque part5. Et non, ce n'est pas réécrit en Rust ; je sais, je sais, on me l'a déjà dit.

  • silk : github.com/Gheop/silk
  • woffify : github.com/Gheop/woffify

Les deux tournent en prod pour de vrai (oui, derrière le service du début, je ne le redis pas, vous l'avez déjà en tête). Mais l'idée du journal, c'est surtout que si vous devez alléger fonts ou SVG dans un pipeline sans Node ni Python, ces deux-là vous éviteront de réinventer le bouchot. Patchs, issues et remarques acides bienvenus.

Voilà, votre bouchot est délesté. Vous pouvez retourner aux moules-frites.


  1. Oui, MIT. Rangez les fourches. 

  2. Chiffre non contractuel, mais franchement pas loin. 

  3. Paix à son âme. 

  4. Demandez à quiconque a déjà arrondi un SVG un peu vite : le moiré, c'est le diable. 

  5. Statistiquement, il est vendredi quelque part sur Terre. CQFD. 

  • # Dredi

    Posté par  (Mastodon) . Évalué à 4 (+1/-0).

    Statistiquement, il est vendredi quelque part sur Terre.

    Ouais enfin ça dépend quand.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Dredi

      Posté par  . Évalué à 2 (+0/-0).

      Statistiquement, il est vendredi quelque part sur Terre.

      c'est pas une chanson de l'anarchiste du Sud Ouest ? (ah non, en fait, c'est Samedi soir sur la terre)

      "Si tous les cons volaient, il ferait nuit" F. Dard

    • [^] # Re: Dredi

      Posté par  . Évalué à 1 (+1/-0).

      Bien vu. En moyenne sur la semaine, « il est vendredi quelque part » n'est vrai qu'environ 50h sur 168 : les fuseaux extrêmes (UTC-12 et UTC+14) sont à 26h d'écart, donc un jour donné existe 24+26 = 50h. Soit ~30% du temps, tu as raison.
      Sauf que là je poste un vendredi en début d'après-midi heure de Paris (UTC+2 en été), soit ~13h UTC : à cet instant c'est vendredi de UTC-12 à UTC+10, environ 85% des fuseaux. Mon CQFD est donc sauf… jusqu'à ce que quelqu'un relise ce journal un mardi. Merci pour le rapport de bug, je passe la note en 0.8-stable !

      • [^] # Re: Dredi

        Posté par  (site web personnel) . Évalué à 3 (+0/-0).

        Il semble essentiel de prendre en compte les personnes n'étant pas sur Terre (ni en orbite directe autour de la Terre disons)). Parce que sur la Lune ou sur Mars, on ne sait pas si c'est soirée disco chez Boris, déjà qu'on ne sait pas si c'est les vendredis.

    • [^] # Re: Dredi

      Posté par  (site web personnel) . Évalué à 5 (+2/-0).

      Vous vous demandez légitimement « Vendredi quelque part sur Terre, mais où ? ». Voici donc l'information que vous attendiez : « sur une île inhabitée à l'embouchure de l'Orénoque, près des côtes vénézuéliennes » (source)
      https://www.openstreetmap.org/relation/1083284#map=12/8.6206/-60.6965

      • [^] # Re: Dredi

        Posté par  . Évalué à 0 (+0/-0).

        Wouah, fallait la trouver celle là !!

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.