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
| Modul | Aufgabe |
|---|---|
| Wolly.Server, Wolly.Request, Wolly.Response | Lebenszyklus des Prozesses und Socket; Methode, Pfad und Query; die Antwort, wobei Header mit Steuerzeichen abgelehnt werden |
| Wolly.Router, Wolly.Middleware | Routen 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.Limit | Anmeldung 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.Passkey | Passkeys (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.Passphrase | Schutz vor Cross-Site Request Forgery, Schutz öffentlicher Formulare vor Bots, Regeln für Passphrasen nach NIST SP 800-63B-4 |
| Wolly.Rambo | der Client für RAMBO: OpenID Connect mit PKCE, ID-Tokens werden gegen ML-DSA-Schlüssel geprüft |
| Wolly.Gif, Wolly.Jpeg, Wolly.Webp | Bilder, in Hilde dekodiert, jede Länge geprüft |
| Wolly.Feed, Wolly.Highlight, Wolly.Qr, Wolly.Asset | Atom-Feeds, Syntaxhervorhebung, QR-Codes als Data-URIs, Versionierung statischer Dateien |
| Wolly.Bunti | BUNTI, 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:
- CommonMark 0.31.2: Blöcke, Listen bis 16 Ebenen, Codeblöcke mit Sprachangabe, Link-Referenzen, Hervorhebung nach dem Algorithmus der Spezifikation, Entities, dazu Tabellen nach GFM.
- Rohes HTML wird als Text angezeigt. Links sind nur mit http, https, mailto,
/oder#erlaubt. - Die Tests prüfen 519 Beispiele aus der CommonMark-Spezifikation 0.31.2 und den GFM-Tabellen sowie 16 bewusste Abweichungen, zusammen 535 Prüfungen in 29 Testfunktionen. Die Abschnitte zu HTML-Blöcken und rohem HTML sind ausgenommen.
- Noch nicht umgesetzt und als Abweichung getestet: Durchstreichen nach GFM, Aufgabenlisten und Autolinks ohne spitze Klammern.
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
- RAMBO, der Anmeldedienst.
- ROXIE, ein Log-Sammler: ein Agent auf jeder Maschine, der Sammler selbst als FastCGI hinter Hiawatha, mit Volltextsuche, Dashboard und Anmeldung über RAMBO.