Dominic Szablewski’s Tweets
Lossless Image Compression in O(n) Time — introducing QOI, the Quite OK Image Format. 300 lines of C, single header library: phoboslab.org/log/2021/11/qo
Fiddling with the leaked WipEout source. It may not look like much, but getting this thing to compile and run on x86-64 was a royal pain. Rendering is in OpenGL, but all transforms still in software, hence the wobbliness.
The specification for the QOI format for lossless image compression has been finalized! It fits on a single-page PDF. Thanks to everyone who helped to make this happen! phoboslab.org/log/2021/12/qo
At last, here's the final specification of the Quite OK Audio Format, along with some benchmark results: phoboslab.org/log/2023/04/qo
For a fixed size array of objects, you can maintain two arrays of pointers to keep track of active/free ones. Seems a bit easier (and more efficient?) than a linked list and is always O(1) unlike a scan through the objects array. Does this pattern have a name?
Time Domain Audio Compression at 3.2 bits per Sample -- introducing QOA, the Quite OK Audio Format. 400 lines of C, single header library: phoboslab.org/log/2023/02/qo
My HTML5 Game Engine – Impact – is now Free & Open Source:
As proposed by some people on my last tweet, just copying the actual particle storage in-place is both simpler and faster than maintaining a separate index or ptr array. This stays true even when the object size is increased to 1kb. memcpy() is fast!
Please read The Making of Q1K3 - A “Tour de Force” of cramming the essence of Quake into 13kb phoboslab.org/log/2021/09/q1
Just finished the first draft of the QOA file format specification: qoaformat.org/qoa-specificat
If you're looking for a challenge: try to implement a decoder using only this spec... and then let me know what I need to fix/clarify :]
Single file C library for decoding MPEG1: github.com/phoboslab/pl_m ~3k LOC. This took me way longer than I expected. I don't write much C, so could use some feedback. /cc
Ported the JSMpeg MPEG1 and MP2 decoders to WebAssembly. Not that it's a good idea, but you can now decode 4k MPEG1 videos in your Browser in real time. Try it: jsmpeg.com/perf.html
I'm paying my respects to the greatest game on its 25th anniversary for #js13k - not really matching the theme, but I wanted to do this for a long time!
For the technically inclined, don't miss the blog post and source code: Reverse Engineering WipEout phoboslab.org/log/2015/04/re
The source code is on github, complete with the .map files:
I finally started to work on my #js13k entry. This time I'm generating all the textures instead of relying on a PNG file. Worked out way better than I expected - super fun, too!
Wow, some people on Reddit are mad, because QOI is not REAL image format! I don't know man, I kinda loaded some pixels from a QOI file today.
Slowly getting somewhere. No sound and still tons of bugs to fix. The game/HUD is now resolution independent, but the menu is still all over the place.
Very cool to see implementations of QOI popping up for Zig, Go and Rust (4x!):
Zig: github.com/MasterQ32/zig-
Go: github.com/xfmoulet/qoi
Rust: github.com/ChevyRay/qoi_rs
Rust: github.com/whentze/qoi_rs
Rust: github.com/steven-joruk/q
Rust: github.com/Masterchef365/
Just found out that QOI was posted on Slashdot. Everybody there hates it. I feel like I unlocked an achivement! m.slashdot.org/story/394299
Great in depth explanation of how PNG works and how QOI compares to it: youtube.com/watch?v=EFUYNo
Be sure to also check our their explanation of JPEG!
I love this project so much! The pure positive energy SerenityOS brings to the tech world is immeasurable. Great work everyone and a happy new year!
Quote Tweet
Replying to @awesomekling
Update: Tim Flynn tracked down the red line and got it fixed!
github.com/SerenityOS/ser
We can now render a perfect Acid2 Guy in Ladybird, with hours remaining of 2022 


Adding an extra if statement to QOA's clamp function speeds up decoding by ~8%. Quite an unexpected gain!
Replying to
Interestingly the game doesn't use a depth buffer. Instead, polygons are sorted into one of 8192 bins, based on their z-coord. Rendering is simply back to front. It's a re-implementation of the PSX LIBGPU's Ordering Table.
The what, why and how of an MPEG1 decoder in a single file C library: phoboslab.org/log/2019/06/pl
Including some unsolved design problems...
The Making of Underrun for - A WebGL twin stick shooter in 13kb of JavaScript: phoboslab.org/log/2018/09/un
900 bytes left. Calling it a day. Play my entry UNDERRUN: phoboslab.org/underrun/ - source: github.com/phoboslab/unde
Cross Code is one of the most beautiful games yet. I love the pixel art! http://t.co/vNOCTwzZ
Going full circle by finally implementing my own sqrt() for no good reason. Here you go, Facebook interview person!
Quote Tweet
Just failed hard at a phone interview for Facebook. "Please implement sqrt() in JavaScript" WTF?
Replying to
I re-ran all the benchmarks from yesterday to write to /dev/null, so it doesn't measure disk writing speed. QOA was the fastest format to decode (probably because ffmpeg has quite a bit of overhead – but still!).
Ejecta WebGL now supports antialias! ThreeJS happily runs with 60fps, 4xMSAA on the iPhone5s github.com/phoboslab/Ejec
I'm not a sponsor for this year (since ImpactJS is now free) so I figured I might as well participate! Going for Quake1 vibe with some gritty low res graphics.
Finally, WebGL on the iPhone with Ejecta: github.com/phoboslab/Ejec
Maybe the most original game idea since Portal? http://t.co/HAPyADzv - made by
Yep, my game XType Plus was built with the NWF. Nintendo actually used my JS game engine (ImpactJS) to build a Pachinko Game. Overall it is my understanding that the NWF wasn't as successful as they had hoped.
Wohooo, 1st place! Thanks again to for the awesome soundtrack! This year's #js13k had some crazy ambitious games and I can't wait till next year. Congrats everyone!
Quote Tweet
HERE ARE THE #js13k 2018 WINNERS! 2018.js13kgames.com/#winners @phoboslab, @dhmstark, @elliotnelson, @ryanmalm, @f_oatley, @sirxemic, @regularkid CONGRATULATIONS! #gamedev
Ejecta, a fast Canvas implementation for iOS, is now Open Source. Watch the intro video here impactjs.com/ejecta
Ejecta now supports instanced_arrays. ThreeJS example with 65k instances runs with 60fps: github.com/phoboslab/Ejec
Replying to
Most common complaint is, that it doesn’t solve every possible problem under the sun. Well, thats the point!
I enjoyed your interview with Rogan. Would you consider doing one with ? It would be great to have an interviewer who is more familiar with the subject matter!
After lots of useful discussion (and some bikeshedding), we have arrived at the final specification for QOI. If you already worked on an implementation, I'd like to ask you to update it <3
In the process of rewriting all fixed point maths to float in wipEout. This function had me stumped for a while. It's trying to project a point to a line (to center the camera on the track), but it only sorta, kinda works because there is an int32 overflow in the cos_alpha calc!
Seeing porting my pl_mpeg code to his Jai language is quite humbling. Sorry for the mess, dude!
Proud to release Ejecta 2.1: JavaScript+Canvas on iOS & tvOS – now faster than ever impactjs.com/blog/2016/09/e
Building a UI in SerenityOS is quite liberating! No need to care about any styling. The VideoPlayer is coming along nicely, but I still need to figure out audio playback.
Updated Quake to run on the Oculus DK2 in Direct Mode with positional tracking: phoboslab.org/log/2015/07/qu
#js13k I'm using TrenchBroom to build my levels. Amazing tool; a real pleasure to work with!
You don't often see a JS game getting re-implemented in C, let alone one made for the size restricted #js13k. Great work!
Quote Tweet
Today I've finished a 2-month project of porting @phoboslab's Q1K3 to C and GLES. It's available for download here: computermouth.itch.io/c1k3
Received lots of great feedback for QOA including some cool ideas to improve the quality. Should have launched this sooner; the hive mind is way more knowledgeable than I could ever be!
Very cool video from , using Biolab Disaster as a test case to improve performance in the SerenityOS Browser: youtube.com/watch?v=9-9Xra
That desktop wallpaper is 😙👌
Play GTA V in your browser - sort of phoboslab.org/log/2015/07/pl - a giant hack of C, JavaScript and lot's of glue.
If you want to know how the WebGL shooter Xibalba was made, don't miss the Making Of screencast: phoboslab.org/log/2014/07/xi
VOIDCALL is finally finished! Play here: phoboslab.org/voidcall/ - The game clocks in just 8 bytes shy of 13kb. I had to fight for every last byte! #js13k
There's a MoveDonkey() function in the wipEout source and I carried it through all the refactoring while wondering what the hell this donkey was. Turns out it's this thing - apparently also know as a "Nodding Donkey". #NamingThingsIsHard
Just published “Magic Webcam” for iOS – a complete rewrite of my older “Instant Webcam” App. Better stability & performance, higher resolution video and robust audio streaming. And it's free! (unlocking all features is an In-App Purchase). Get it here: apps.apple.com/us/app/magic-w
Probably the most elaborate game ever made with Impact (it's still in there, deep down, right?). Congrats, - CrossCode looks fantastic!
Quote Tweet
After ~7 years of development "CrossCode" is now available for PC!
>2D Action RPG w/ SNES-inspired 16-bit #pixelart
>Developer: @RadicalFishGame | Publisher: @Deck13_de
Trailer: youtube.com/watch?v=zuN-5y
Steam: store.steampowered.com/app/368340/Cro
GOG: gog.com/game/crosscode
I decided to build a tool to aid with the texture creation for #js13k. Lets me minify the definitions even more. Will release later today, hopefully :)
Added some much needed screen shake and explosion effects when killing enemies; sadly, the compo version will have to do without these. Play here: phoboslab.org/underrun/
jsmpeg.com - Decode It Like It's 1999. My JavaScript MPEG1 decoder.
The Making of VOIDCALL: phoboslab.org/log/2019/09/vo - contains some detailed technical info how the terrain generation and animated models work.
The things you dig out form your parents’ basement. Schneider EuroXT, 8086 from 1989 with a beautiful amber monochrome CRT. BIOS battery was empty, but it still runs flawlessly, HDD and all.
I fed the QOI specification into ChatGPT and asked it to write a decoder. Here's the result: phoboslab.org/files/gpt-qoi/
I also wrote about JSMpeg's development and internals in my blog: phoboslab.org/log/2017/02/de
Me: can I have an object with two propert–
Safari: I CREATED A SPARSE ARRAY FOR YOU!! XOXO
Get your shit together Safari (iOS 10.3.1)
OculusWeb - a minimal WebSocket tracking server for the Rift in 160 lines of C https://t.co/naPWS6sdLY
HTML5 Game running on Apple TV using Ejecta - github.com/phoboslab/Ejec
25 years after release, distribution of Wolfenstein 3D still is a criminal offense in Germany. Glad you can buy this, though. /cc
Cool experiment using QOI for video (demo only seems to work in Chrome, for now)
This is something I still want to explore myself, too. Maybe with block based motion compensation in I-Frames this could become competitive?!
Quote Tweet
QOV Fast lossless video encoding based on QOI github.com/wide-video/qov
three.js running in Ejecta. Still hundreds of bugs to fix, but many demos are working. I'll put it on github tomorrow!
My retro FPS Xibalba is now free for iPhone and AppleTV! itunes.apple.com/at/app/xibalba
My new Shoot'em'Up: http://www.phoboslab.org/xtype/ - this is meant as a WebGL stress test :)
This is so cool! You can now get a hardware QOI en-/decoder for your ASIC or FPGA. My understanding of these things is quite limited, but it seems to be very attractive in terms of compression ratio vs. die area, power consumption and throughput. Very exciting!
Quote Tweet
@phoboslab We are excited to be launching hardware encoder & decoder IP cores for your awesome QOI format:
cast-inc.com/compression/lo
PR & a compression benchmarks white paper coming soon.
Replying to
Also happy to report that I found some extra 80 bytes to have an animated torch model!
zty.pe was embedded into a popular gaming site today. Glad I added IFrame detection and pre-roll ads!
The two(!) animation frames of that angry pile of triangles clocks in at 195 bytes. Well worth it!
Some benchmark results of QOA vs. other codecs (using ffmpeg) with a 2h43m audio file. Not too bad. Worthwhile tradeoffs between file size and decode speed.
Here's the Tiny Texture Tumbler: phoboslab.org/ttt/#W1szMiwzM
Pretty quick and dirty. Let me know if you find any bugs! Source is on github.com/phoboslab/ttt
Replying to
Replying to
It's very fast, but doesn't compress as much. Images with a very limited palette are not QOI's strong suit.
Newest jsmpeg version decodes a video frame in just 4ms on the iPhone5s phoboslab.org/files/jsmpeg/b
Updated the Model Viewer with the tracks from WipEout 2097/XL (same data format): phoboslab.org/wipeout/
I have now unfollowed a few people who's tweets I enjoy because Twitter keeps insisting to also show me which tweets they liked. I DONT FUCKING CARE. Where's the option to turn this shit off ?
Updated Quakespasm in my VR fork. Allows you to play Arcane Dimensions & other modern mods! phoboslab.org/log/2016/05/qu
Replying to
I love what you are doing and I feel honored that you even considered a QOI implementation <3
Many of my experiments with QOI looked a lot like that. So much fun to get it right, piece by piece :)
What the requestAnimationFrame API Should Have Looked Like http://t.co/WcMXYF7Q
Foobar2000 is such an amazing piece of software; for 16 continuous years it sat in my taskbar. Today I had a good reason to install it again: wrote a QOA plugin for Foobar!
Started working on that no-dependencies, single-file mpeg1 decoder. Setting up an OpenGL project on Windows for testing is still a major pain; settled for SDL and GLEW now.
Ejecta 2.0 impactjs.com/blog/2015/12/e – tvOS & Gamepad support, system provided JavaScript engine + countless bugfixes.
Xibalba made it into the AppStore! Only discoverable by search, though. Who do I have to bribe to get it featured?






