Show HN: GGG – Declarative SVG Badge Generation Using Guile Scheme and SXML

jjba231 pts0 comments

jjba23/ggg: Guile Glyph Generator: SVG images, handy useful glyphs, org/markdown badges - Codeberg.org

This website requires JavaScript.

jjba23/ggg

Watch

Star

21

Fork

Code

Issues

Pull requests

Activity

Guile Glyph Generator: SVG images, handy useful glyphs, org/markdown badges

badge

guile

guix

lisp

markdown

org

scheme

svg

185 commits

1 branch

65 tags

794 KiB

Scheme

91.4%

Shell

6.4%

HTML

2.2%

trunk

Find a file

HTTPS

Download ZIP<br>Download TAR.GZ<br>Download BUNDLE

Open with VS Code

Open with VSCodium

Open with Intellij IDEA

Repository files (latest commit first)

Filename<br>Latest commit message<br>Latest commit date

Josep Bigorra

9c3f869740

All checks were successful

ci/woodpecker/push/tag-bumper Pipeline was successful

Details

ci/woodpecker/push/byggsteg Pipeline was successful

Details

ci/woodpecker/tag/byggsteg Pipeline was successful

Details

feat: ✨ Coreutils to Coreutils minimal

2026-07-20 16:29:15 +02:00

.woodpecker

✨ feature: Add maak file and docker

2025-08-27 18:16:44 +02:00

dist

feat: ✨ Add new logos and glyphs

2026-07-20 10:03:26 +02:00

glyphs

feat: ✨ Add new logos and glyphs

2026-07-20 10:03:26 +02:00

resources

feat: ✨ Add new logos and glyphs

2026-07-20 10:03:26 +02:00

scripts

feat: ✨ Improve package definitions and make build more reproducible

2026-07-20 09:26:26 +02:00

src/ggg

feat: ✨ Add new logos and glyphs

2026-07-20 10:03:26 +02:00

test

added jointhefreeworld.org badge

2025-07-22 15:25:00 +02:00

.gitignore

✨ feature: Add maak file and docker

2025-08-27 18:16:44 +02:00

channels.scm

feat: ✨ Improve package definitions and make build more reproducible

2026-07-20 09:26:26 +02:00

COPYING

2025-05-20 11:51:26 +02:00

guix.scm

feat: ✨ Coreutils to Coreutils minimal

2026-07-20 16:29:15 +02:00

maak.scm

feat: ✨ Improve package definitions and make build more reproducible

2026-07-20 09:26:26 +02:00

manifest.scm

feat: ✨ Improve package definitions and make build more reproducible

2026-07-20 09:26:26 +02:00

README.org

feat: ✨ Add AI policy

2026-05-30 22:42:57 +02:00

README.org

GGG: Guile Glyph Generator

What is this black magic? 🪄

How to define a glyph?

Help

Installing

On Guix

On Podman/Docker

Licensing

AI Policy

REPL: Interactive workflow, developer power

Code of conduct

GGG Project

Generate SVG images for handy useful glyphs, Org/Markdown badges and more, leveraging the power of Lisp (Guile Scheme)

Be proud and appreciate technologies and techniques you use, distinguish clearly supported versions of things, etc.

With flexible support for badges between ONE and THREE parts.

If you like my work, please support me by buying me a cup of coffee ☕ so I can continue with a lot of motivation.

Tired of bland, static status badges for your projects?

Say hello to the Guile Glyph Generator (GGG) , a small but mighty tool crafted in the elegant λ Lisp (Guile Scheme) programming language.

Based on the provided Lisp configuration, GGG will produce something like the following badges (1-3 part) (as both SVG and PNG files).

What is this black magic? 🪄

Through SVG generation from Lisp (Guile Scheme) we leverage a beautiful DSL (Domain-Specific Language) and apply some mathematical knowledge to build pixel perfect badges.

The SVG (Scalable Vector Graphics) can then be easily converted without quality loss to any desired format. Create your badges programatically with a polished aesthetic!

Scheme Powered

Built with the expressive and functional Guile Scheme, ensuring a concise and maintainable codebase.

Vector Graphics (SVG)

Generates crisp and scalable SVG images, perfect for any screen resolution.

Raster Images (PNG)

Also produces PNG versions for broader compatibility.

Highly Customizable

Customize the text, background colors, text colors, logos, etc.

Simple Definition

Badge configurations are defined in an easy-to-understand data structure within the Scheme code.

ggg dynamically estimates text width for the elements, specially text, looking up a rough width per character based on the font size. Then, multiplies this by the number of characters and add some padding. Finally, we slightly adjust the width based on whether the text is very short, short, medium, or long to make the badge look better.

ggg tries to provide sensible defaults to every option, but allow customization. We construct the SVG structure using SXML (S-expressions representing XML). This makes it easy to define the SVG elements and their attributes programmatically.

We choose for geometricPrecision in SVG to allow highest quality and fidelity, to prioritize geometric accuracy over rendering speed. This is often desirable for crisp, clean vector graphics like badges. In essence, the "magic" lies in the combination of:

Data-driven generation

The badge is created based on the input data.

Precise calculations

The dimensions and positions of elements are precisely calculated to achieve the desired layout.

Using SVG...

feat guile scheme badges glyphs badge

Related Articles