Published on: July 4, 2026
Just a little over a month ago, I was announcing EndBASIC 0.13 with a brand new compiler and VM implementation. 0.13 was the result of six months of work and I had to “flush those out” to clear my mind. At the end of the day, however, 0.13 “just” improved performance. Yes, the wins were massive, but they didn’t do much to make EndBASIC any cooler for you.
Today’s 0.14 is a different beast. This shiny release is a collection of new features all over the place with the special addition of basic sound support. Specifically because of the latter, 0.14 marks a major milestone because it unlocks the last frontier towards a possible 1.0. There are many more things I wanted to include in this release—and one feature I had to eventually give up on due to its difficulty—but at some point one has to stop and get the code out. So here we are!
There is a lot to talk about, but before we get to that, here are the must-visit links:
The primary thing I wanted to do after the large performance wins brought by 0.13 was to offer extra graphics primitives to let the extra performance shine. We now have commands to draw triangles (GFX_TRI and GFX_TRIF), polygons (GFX_POLY and GFX_POLYF), and to bucket-fill an area (GFX_FILL).
As part of this work, I “productionized” one of the very first demos I wrote for EndBASIC—a little program that renders a number of circles and makes them bounce within a container box—to demonstrate the new graphics primitives. This demo is now bundled within EndBASIC’s DEMOS drive and accessible via the gallery. You can witness it below, and beware that this is a real-time running program, not a video! You can interact with it right here, in the browser.
Back when I added support for LCD displays and the NetBSD-backed console for the EndBOX, I had to implement a bitmap font rendering “engine” for framebuffers. While this was cool, it also introduced inconsistencies with the web and SDL consoles, which relied on the IBM Plex Mono TTF font. This font looked nice and was inspired by old PC fonts, but it was still too… “modern”.
So, to unify the look and feel of all consoles, and to make EndBASIC look more “retro”, I yanked all TTF support and instead switched to using my own font rendering facilities. As part of this, I added the standard IBM VGA 8x16 font to the fonts collection and made it the default across all consoles.
This makes the console look retro, but also dull, and if you launch EndBASIC for the first time, you might never imagine that its console can mix text and graphics. So to make it clear from the get go that the console is hybrid, I’ve also modified the welcome banner, which had remained unmodified for years, so that it displays a little icon next to it. Here, take a peek!

The SDL graphical console in EndBASIC has been around for years now, and when I originally wrote the code, it worked correctly on macOS. Unfortunately, while my original implementation offloaded all graphics operations to a separate thread, it had a critical flaw: that separate thread was not the primary thread. macOS didn’t complain at the time, but since a not-so-recent release, EndBASIC started crashing on startup.
Fixing this issue was conceptually easy because the separate threading architecture was already in place, but flipping roles proved to be tricky. In any case, this finally works again as well!
That said, I’ll warn you that running the prebuilt EndBASIC binaries on macOS is kinda annoying. I have not codesigned them because I do not have an Apple Developer certificate, and with every macOS release, it is getting exceedingly more difficult to run unsigned binaries. In my last attempt in macOS Tahoe, you have to approve both running the binary and the bundled shared libraries, one at a time. Windows also shows the same scary warnings about untrusted binaries, but at least it’s easier to bypass them.
I understand trusting random binaries from the Internet is a hard pill to swallow, so at the very least let me tell you that the binaries you can download are all produced via GitHub Actions from checked-in code so you have a clear audit trail of where they came from. This was a pain to set up years ago, but I intentionally did it so that you wouldn’t have to trust a “random binary from developer workstation” situation.
Another trick up the sleeve is new support for direct execution of EndBASIC binaries in Unix-like systems. Nothing fancy, right? This is table stakes for an interpreter, after all. But nonetheless, it’s a cool new feature!
This was trivial to do in principle, but there was a little wrinkle: some programs may want specific console dimensions and, if you use the common #!/usr/bin/env endbasic shebang, you just cannot specify the console flag because the shebang line can only contain two arguments. I had to implement a secondary mechanism to tune console settings, and of course this was inspired by Emacs’ property line. The shebang can be followed by a magic comment to specify which console to use for a given program so that programs are “standalone”:
#!/usr/bin/env endbasic
REM endbasic cli: console=sdl:resolution=1024x768
I’ll remind you that #!/usr/bin/env is considered harmful (by me, yes).
Here is a little video demonstrating two runnable scripts, one providing a textual interface (same terminal window), and one spawning the graphical console as a separate window:
And we get to the biggest feature I had been wanting to implement for literally years: sound support. I had been putting it off, thinking that it would be really tedious to plumb through, but then it hit me: audio is just one more output “type” of a console. I didn’t have to implement a brand new abstraction for it: I could just tag along the already-existing Console framework and implement audio primitives through it!
With this idea in mind, the implementation was actually trivial, so now we have a BEEP command that works even in the terminal, and a SOUND command that is able to play arbitrary tones. There is nothing else for now though: I thought of implementing a PLAY command à la QBASIC, but that requires its own mini-language parser and background playback and, honestly, those are a lot of work.
You can play a trivial sound demo right now. Just click on the embedded interpreter and then press a key:
That’s all for the recap of the major changes in EndBASIC 0.14. There are several other smaller updates worth mentioning that aren’t large enough to make it into this article, but you’ll find all details in the NEWS.md file.
EndBASIC 0.14 marks a major milestone because it unblocks the path to 1.0. As I mentioned earlier, there is always stuff that could be added, like support for sprites, file management, or records… but 0.14 brings to the table everything I had in mind when I started this project in 2020: the ability to write retro-style mini-games with the simplicity of BASIC.
Give it a try and, as usual, have fun! And if you happen to be in 🇺🇸 like myself, happy 250th anniversary!