Wolly

WOLLY steht für Web-ready, OpenBSD-first, Linear, Lean, Yours. Eigenwillig, laut und liebenswert.

Wolly ist ein Web-Framework, geschrieben in Hilde. Eine Wolly-Anwendung ist ein FastCGI-Responder auf einem Unix-Socket hinter dem Webserver Hiawatha. Die Ereignisschleife liefert Standard.FcgiServer aus Hildes Standardbibliothek, Wolly ergänzt alles, was ein Handler darüber hinaus braucht. Wolly selbst hat kein unsafe-Modul. Quelltext: github.com/heikozim/hilde-wolly; die Sprache: github.com/heikozim/hilde.

Der Name

Wolly ist wie Hilde eine echte Hauskatze, Europäisch Kurzhaar, braun mit Weiß. Mehr auf der Seite Über Hilde.

Warum ein einzelnes Binary

Die jüngsten Sicherheitslücken in PHP- und Node.js-Umgebungen haben mich darin bestärkt, dass sich ein einzelnes Binary mit linearen Typen und Verträgen lohnt: eines, das Fehler wie ein doppeltes Freigeben von Speicher schon durch seinen Aufbau ausschließt, statt dem zu folgen, was bisher oft als Stand der Technik gilt. — Heiko Zimmermann

Gemeint sind PHP2Shell (CVE-2026-109618 und CVE-2026-109619) und Node2Shell (CVE-2026-111497). Hilde schließt doppeltes Freigeben und das Schreiben über das Ende eines Puffers hinaus von vornherein aus: Ein linearer Wert wird genau einmal beendet, und jeder Index wird geprüft. Das ist kein Urteil über PHP oder Node.js, sondern der Grund, warum ich Wolly so baue.

Was Wolly mitbringt

ModulAufgabe
Wolly.Server, Wolly.Request, Wolly.ResponseLebenszyklus des Prozesses und Socket; Methode, Pfad und Query; die Antwort, wobei Header mit Steuerzeichen abgelehnt werden
Wolly.Router, Wolly.MiddlewareRouten nach Methode und Muster, dazu 404, 405 und 400; Schritte vor und nach dem Router, eine Zeile im Zugriffsprotokoll je Anfrage mit Request-ID
Wolly.Auth, Wolly.Totp, Wolly.Bearer, Wolly.Role, Wolly.LimitAnmeldung mit Argon2id, neue Sitzungs-ID nach der Anmeldung und Drosselung, das __Host--Cookie und ein Audit-Protokoll; TOTP als zweiter Faktor; Bearer-Tokens; Rollen; Ratenbegrenzung mit 429
Wolly.PasskeyPasskeys (WebAuthn, Serverseite): eine Challenge, einmal gültig für 300 Sekunden, ES256 oder EdDSA in COSE, der Signaturzähler, Prüfung von Anwesenheit und Verifizierung des Benutzers
Wolly.Guard, Wolly.FormGuard, Wolly.PassphraseSchutz vor Cross-Site Request Forgery, Schutz öffentlicher Formulare vor Bots, Regeln für Passphrasen nach NIST SP 800-63B-4
Wolly.Ramboder Client für RAMBO: OpenID Connect mit PKCE, ID-Tokens werden gegen ML-DSA-Schlüssel geprüft
Wolly.Gif, Wolly.Jpeg, Wolly.WebpBilder, in Hilde dekodiert, jede Länge geprüft
Wolly.Feed, Wolly.Highlight, Wolly.Qr, Wolly.AssetAtom-Feeds, Syntaxhervorhebung, QR-Codes als Data-URIs, Versionierung statischer Dateien
Wolly.BuntiBUNTI, ein Farbcode für Kameras

Diagramme

Wolly.Chart rechnet die Werte eines Balkendiagramms in ganzen Zahlen aus: lesbare Zahlen wie 1.2 k, den Median, die Höhe der Balken und die Abweichung vom Median in Zehnteln. Gezeichnet wird dort nichts. Das übernimmt Wolly.Svg: Es zeichnet Balken, Linien und Kacheln als SVG auf dem Server, ohne Skript, mit currentColor für helles und dunkles Design, mit <title> und aria-label. Wolly.Dashboard baut darauf auf.

Markdown

Wolly.Markdown wandelt Markdown in einen Syntaxbaum und dann in HTML um. Das HTML läuft anschließend noch einmal durch den Filter von Standard.Html. Stand von Code und Tests:

Wolly.TextLayout misst die Breite eines Texts im Terminal nach Graphem-Clustern und ostasiatischer Zeichenbreite. Im Verhalten folgt es der Textansicht von go-lea.

Mit Wolly gebaut