The readme of fr-08: .the .product, the 64K intro that won at The Party in December 2000, gives one of its six makers a deadpan job title: “Ryg [fg], compression technology supervisor”. Compression became Fabian Giesen’s speciality. Over the next few years he wrote kkrunchy, the executable packer that squeezed the group’s intros and was taken up by other groups too, and most of the engine behind .kkrieger and debris.. Then he took the same skills to a job writing compression software for the games industry.
Fast facts
- Handle: ryg (credited in fr-08’s readme as “Ryg [fg]”).
- Group: farbrausch.
- Known for: kkrunchy; the texture generator, mesh generator and 3D engine shared by Candytron, .kkrieger and debris.; organising the Breakpoint demo party.
- Studied: computer science at the University of Bonn.
- Since 2010: RAD Game Tools, Kirkland, Washington, where he works on the Oodle compression library.
Compression technology supervisor
A 64K intro has to fit everything into 65,536 bytes: code, generated graphics, music, and the program that unpacks it all. fr-08‘s final version carries its packer’s credit in the file header: “rygs and torus’ exe packer”. That packer came before kkrunchy, which Giesen started in 2003. He later said that all of farbrausch’s “really serious 64k efforts were done with packers much worse than what you can use now. With a current version of kkrunchy, the original executable of fr-08 ends up below 48k.”
kkrunchy
kkrunchy is, in Giesen’s own words, “a small exe packer primarily meant for 64k intros”, and “relatively useless for anything else”. It was first used in farbrausch’s fr-030: Candytron, second in the PC 64K competition at Breakpoint 2003. Other groups took it up, including Fairlight, Rgba, Conspiracy and Equinox.
There are two versions. The first, written between 2003 and 2005, uses an LZ77 coder with an arithmetic-coding back end and a depacker of about 300 bytes of hand-written x86 code. The second, written roughly between 2006 and 2008, uses context mixing, an approach borrowed from the PAQ family of compressors. It predicts each bit from several statistical models at once and blends their guesses. The price was speed and size: its depacker is about 1.5K and unpacks only about 90 to 120 kilobytes a second, but it more than paid for itself. Recompressed with the new engine, .kkrieger shrank by more than 10K.
Giesen’s “secret ingredient” was a filter on the x86 code itself. Most executable packers only rewrite jump and call addresses so that they repeat more often. kkrunchy roughly disassembles the program and sorts the bytes of each instruction into separate streams by their job, such as opcodes, addressing bytes, jump offsets, displacements and immediate values. Values of one kind resemble each other far more than they resemble the bytes around them, so each stream compresses better on its own. He based this on the “split-stream” method in the PPMexe research paper. The filter also keeps a list of the 255 most recent call targets, so a repeat call to the same function costs one byte instead of four; he measured hit rates of 70 to 80 per cent.
.kkrieger and debris.
Giesen described Candytron, .kkrieger and debris. as sharing one codebase, and listed his part of it: “large parts of the texture generator, most of the mesh generation code, the 3D engine, the material/lighting systems (there are several), and the executable compressor used to pack them.” The .kkrieger readme credits him with the mesh generator, the 3D engine and kkrunchy, and the debris. credits name him and Chaos as its coders.
.kkrieger had to fit in 96K, and in late March 2004, less than two weeks before Breakpoint, it did not. Giesen later told the story on his blog. The compressed program had started at about 120K. Once the group had thrown out unused code and tightened the data formats, it was still about 102K, with content missing. Chaos pinned up a hand-drawn sign reading “98304”, the target in bytes. He and Giesen then wrote lekktor, a tool that ran the game once while recording which code was used, then deleted every path that never ran. It saved about 4.5K and got the game under the limit. It also threw away code that simply had not run during the recording, including part of the collision handling, and the released game has the bugs to show for it. Giesen called lekktor “one of the best bad ideas we ever had”.
He helped organise the parties where these productions were released. He was an organiser at Mekka & Symposium in 2001 and 2002, and has been on the Breakpoint organising team since the first Breakpoint in 2003, heading its competitions team from 2004.
Writing and released code
When farbrausch published its tools on GitHub in April 2012, Giesen was the contributor named on the most projects: GenThree, RG2, Werkkzeug3, the .kkrieger branch of Werkkzeug3, Altona and Werkkzeug4, the texture generator OpenKTG, lekktor and two versions of kkrunchy. He placed the kkrunchy code in the public domain. On his blog he wrote a series called “Debris: Opening the box” explaining how the tools worked.
His blog ranges well beyond the demo scene. His 13-part series “A trip through the Graphics Pipeline 2011” explains how graphics cards actually carry out Direct3D and OpenGL work. Some of his code has been taken up outside the scene. The public-domain stb_dxt.h, a small compressor for the DXT texture formats that graphics cards decode, is credited as “original by fabian “ryg” giesen”. In 2014 he published ryg_rans, a public-domain implementation of rANS, an entropy coder from Jarek Duda’s paper “Asymmetric numeral systems”.
RAD Game Tools and Oodle
Giesen joined RAD Game Tools in Kirkland, Washington, in 2010, and works on its Oodle data compression library, which game developers license to pack their data. In 2025 he described how crashes in the Oodle decoder, seen in Epic’s crash reports for Fortnite and from other Unreal Engine and Oodle licensees, turned out to come from a hardware fault in some Intel 13th and 14th generation desktop processors.
Sources
- fr-08: .the .product, party version and final version 1.01, readme files and executables (farbrausch, December 2000 and January 2001): “compression technology supervisor”; “rygs and torus’ exe packer” in the final version’s file header. https://files.scene.org/view/parties/2000/theparty00/in64/fr08_final.zip
- Fabian Giesen, homepage (web, secondary): real name, University of Bonn, RAD Game Tools in Kirkland and the note “December 2010: I’ve been at RAD for over half a year now”, his part in Candytron, .kkrieger and debris., party organising. https://www.farbrausch.de/~fg/
- Fabian Giesen, kkrunchy page (web, secondary): “primarily meant for 64k intros”, depacker speeds, the code transform, users including Conspiracy, Equinox, Fairlight and RGBA. https://www.farbrausch.de/~fg/kkrunchy/
- Fabian Giesen, “x86 code compression in kkrunchy”, The ryg blog, 24 January 2011 (web, secondary): first use in Candytron, the two engines and their dates, depacker sizes, .kkrieger 10K smaller, the split-stream filter and PPMexe. https://fgiesen.wordpress.com/2011/01/24/x86-code-compression-in-kkrunchy/
- Fabian Giesen, “Metaprogramming for madmen”, The ryg blog, 8 April 2012, part of the series “Debris: Opening the box”, and his reply in its comments (web, secondary): the .kkrieger deadline, “98304”, lekktor, “all of our really serious 64k efforts…”. https://fgiesen.wordpress.com/2012/04/08/metaprogramming-for-madmen/
- Breakpoint 2003, results (web, secondary copy of the organisers’ file): Candytron second in PC 64K. https://files.scene.org/get/parties/2003/breakpoint03/results.txt
- .kkrieger, chapter I, beta version, readme (.theprodukkt, April 2004): ryg’s credits. https://files.scene.org/view/demos/groups/farb-rausch/kkrieger-beta.zip
- fr-041: debris., readme (farbrausch, April 2007): code by Chaos and ryg. https://files.scene.org/view/parties/2007/breakpoint07/demo/fr-041_debris.zip
- farbrausch,
fr_publicrepository, README and kkrunchy licence files, April 2012 (web): contributors by project; “kkrunchy code written 2003-2007 by Fabian “ryg” Giesen. I hereby place this code in the public domain.” https://github.com/farbrausch/fr_public - Fabian Giesen, “A trip through the Graphics Pipeline 2011, index”, The ryg blog, 9 July 2011 (web, secondary). https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/
stb_dxt.hv1.12, header comment (web): “original by fabian “ryg” giesen”, public domain. https://github.com/nothings/stb/blob/master/stb_dxt.h- Fabian Giesen,
ryg_ransrepository, README, February 2014 (web): public-domain rANS coder, after Duda’s “Asymmetric numeral systems”. https://github.com/rygorous/ryg_rans - Fabian Giesen, “Oodle 2.9.14 and Intel 13th/14th gen CPUs”, The ryg blog, 21 May 2025 (web, secondary): “the data compression library I work on”; Fortnite and Unreal Engine crash reports. https://fgiesen.wordpress.com/2025/05/21/oodle-2-9-14-and-intel-13th-14th-gen-cpus/