Changelog
0.5
August 25 2026
Playbit.app
- Improved system load when receiving many input events in rapid succession
- Added the ability to click on links output to the logging view
- Added the ability for signed-in users to publish an app to the Playbit website for easy sharing
- Added "sign in" and "sign out" items to macOS menubar
- Changed the default remote-control screenshot location to
./_pb/screenshots(relative to the working directory)
Web Runtime
- Added keyboard and scroll input support
- Improved aperture to now get its "window size" from page layout
- Added
playbit.runconvenience function to JS embedding API - Reduced file size by shipping fewer fonts
C API
- Added several new audio playback control functions to
playbit/audio.h- See new
PBAudioSoundResume - See new
PBAudioSoundPause - See new
PBAudioSoundTell - See new
PBAudioSoundSeek - See new
PBAudioBufferPlayAfter - See new
PBAudioBufferUpload - See new
PBAudioSoundGetPosition - See new
PBAudioSoundIsPlaying
- See new
- Improved multiplayer robustness when edit history entries fail to decrypt
- Improved multiplayer robustness when receiving certain kinds of invalid edit history entries
- Fixed a multiplayer assertion when removing a struct from a list while a peer edits the struct
- Added generated multiplayer functions for getting a map's item count
- Added generated multiplayer functions for removing an item from a map
- Added new
PBMPNetChannelOpenAssociatedExtoplaybit/multiplayer.h - Added multiline text layout and editing functionality to UI3
- Improved UI3 multiplayer-backed input field to better handle selection when replacing multiplayer object
- Improved UI3 text selection with multiple input fields to prefer the input field at the same y-level as the mouse
- Added
U3TextHitTesttoplaybit/ui3.h - Added
U3AttributedStringMake2toplaybit/ui3.h - Added
U3BodyUserSelectingTexttoplaybit/ui3.h - Fixed a bug in
PBPoolwhere the last item in a chunk could not be looked-up - Added new
PBEventType_WGPU_CALLBACKtoplaybit/event.h
Runtime
- Continued to further improve text rendering quality
- Added renderer support for rendering text decorations (underlines)
- Fixed an bug where the renderer would not be able to render new glyphs after filling a texture atlas
- Changed render command AABB and corner radius values to be
f32- This is a breaking ABI change and necessitates recompiling apps to work with this change
- Improved canvases to allow being created offscreen
- Added new additional audio syscalls to
playbit/sys/syscalls/audio.h- See new
PBSysAudioSoundtype, representing a currently playing sound - See changed
PBSysAudioSetVolume - See new
PBSysAudioSoundPlayback - See new
PBSysAudioSoundTell - See new
PBSysAudioSoundSeek - See new
PBSysAudioBufferPlayAfter - See new
PBSysAudioBufferUpload - See new
PBSysAudioSoundGetPosition - See new
PBSysAudioSoundIsPlaying
- See new
- Added new
PBSysWindowWorkspaceOpenURLtoplaybit/sys/syscalls/window.h - Added new
PBSysGuiPrefsGetandPBSysGuiSignal_PREFStoplaybit/sys/syscalls/gui.h- Used to query about OS like light vs dark theme, accent color, ect
- Improved general macOS IO integration reliability
- This improves multiplayer latency dramatically
- Added many more cursor styles
- Improved quality of WebGPU support
- Improved runtime exit to reflect the guest program's exit status as its own
Developer tools
- Added
pb run --script=<script>for driving apps via the remote-control automation protocol - Changed
pb runto run Playbit.app as a child process propagate the app's exit status as its own - Added new
pb bundleto process an existing wasm file produced by a different tool - Added new
app_restoml key to embed a folder's contents as individual resources automatically
Examples
- Added new
audio-streamexample - Added new
boxesmath visualization example
Version 0.4
July 20 2026
Playbit.app
- Improved the performance of scrolling large program logs
- Added the ability to horizontally scroll program logs
- Added system URI schema handler for
playbit://to launch an app (with confirmation) by opening a link - Added menubar entry and shortcut for launching an app via a URL
Web Runtime
- Improved correctness of event polling internals
- Switched to our hardware accelerated WebGPU 2d renderer for UI
- This means that we now also require WebGPU to be supported to run
- Fixed
PBSysClockReadreturning a value with the wrong precision level - Implemented
PBSysWindowSetCursorfor all styles other than custom image - Fixed an issue where the virtual window could flicker when spanning the full viewport on some systems
C API
- Added
PBHandleGetInfoandPBHandleGetRightstoplaybit/handle.h - Added
*FeaturesGet,*FeaturesCheck, and*HasFeaturefunctions to several object headers- See
playbit/net.h - See
playbit/thread.h
- See
- Added a bunch of math functions to
playbit/math.h - Improved correctness of
PBMutexRUnlock - Fixed key state query
PBKeyPressed,PBKeyRepeated,PBKeyReleased, andPBKeyDownsilently not working - Improved
PBTimeDurationMillisecondsandPBTimeDurationMicrosecondstoroundinstead offloor - Fixed a situation where
PBArenacould leak memory - Improved general-purpose-allocator's behavior in out-of-memory situations
- Improved
PBDrawperformance around drawing text - Fixed a situation where
PBDrawcould leak drawn text strings - Improved
PBDrawto throw an assertion when a rectangle bounds are negative or otherwise inverted - Fixed
U3Utilbox not taking stroke thickness into account when calculating its size - Improved layout correctness of
U3Flex - Improved UI3 key reuse assert to have a more helpful failure message
- Added new
U3AttributedStringConcatenateArraytoplaybit/ui3.h - Added new
U3AttributedStringConcatenatetoplaybit/ui3.h - Improved
U3AttributedStringMaketo take aPBColorinstead ofu32 - Improved
U3AttributedStringto better handle the case where it contains no text at all - Improved UI3 to send a final mouse move event to boxes after the cursor leaves its bounds
- Fixed
U3PrimaryAxisAlignment_SPACE_BETWEENandU3PrimaryAxisAlignment_SPACE_AROUNDhaving each others behavior - Fixed a couple of cases where UI3 could attempt to draw rectangles with nonsensical bounds
- Added special comment to autogenerated multiplayer header to disable clang-format
- Improved multiplayer stability and correctness
- Added
PBMPGetObjectUUIDtoplaybit/multiplayer.h - Added
*_deserializefunctions to generated and builtin multiplayer types - Added multiplayer schema compiler error disallowing nesting maps directly inside lists
- Added
PBMPDocCreate2andPBMPDocOpen2fromplaybit/multiplayer.h- These new functions take a
schemaVersionargument - The previous functions
PBMPDocCreateandPBMPDocOpennow use the schema version from your autogenerated header
- These new functions take a
- Changed
PBMPImportto return aboolindicating success - Fixed incorrect min constants
I8_MIN,I16_MIN,I32_MIN, andI64_MIN
Runtime
- Improved text rendering in many situations
- Introduced new 2d rendering syscalls with many new capabilities
- See new
playbit/sys/syscalls/canvas.h - Added HDR and wide color gamut support
- Added transparent window support when window canvas background color has an alpha < 1
- Color byte-wise layout is now 0xAAAABBBBGGGGRRRR
- Try out the subset of WebGPU now accessable via the canvas syscalls
- See new
- Removed old 2d rendering syscall
PBSysWindowRendererPackageWrite - Marked
PBSysWindowTextplanCreateas deprecated - Added new
PBSysWindowTextplanCreate2toplaybit/sys/syscalls/window.h - Added
PBSysTextureFormat_RGBAF16toplaybit/sys/syscalls/texture.h - Improved performance when frequently setting mouse cursor style on macOS
- Improved reliability of runtime
paniclog reporting - Fixed
PBSysGesturePhase_BEGANandPBSysGesturePhase_ENDnever firing on macOS - Added new
PBSysObjectFeaturestoplaybit/sys/syscalls/object.h - Added new feature enums to several object headers
- See
playbit/sys/syscalls/net.h - See
playbit/sys/syscalls/thread.h
- See
- Added new
PBSysHandleListFilterflags forPBSysHandleListtoplaybit/sys/syscalls/handle.h - Fixed
PBSysHandleListto only include live handles - Improved
PBSysWindowTextplanCreateandPBSysWindowTextplanCreate2to returnPBSysErr_NO_MEMwhen failing to allocate
Examples
- Ported all examples with a graphical user interface to our UI3 library
- Added a set of more focused API examples with the prefix
api- - Added new example
sync3 - Added multiplayer support to
jump-gameexample
Version 0.3
June 23 2026
Playbit.app
- Made installing new toolchain and examples more robust
- Fixed text selection being incorrect after clearing the log
Web Runtime
- Introduced playbit.js technology preview
- Intended to allow running unmodified apps with the Playbit runtime running on the web
- Visit https://playbit.app/ for a demo
C API
- Added new UI library
UI3- See new
playbit/ui3.h
- See new
- Added new multiplayer sync-ed data library
- See new
playbit/multiplayer.h
- See new
- Added APIs for interacting with Human-Interface Devices (HID) such as gamepads
- See
PBGamepadAxisandPBGamepadEventinplaybit/event.h - See new
playbit/hid.h
- See
- Added
PBNetChannelDirecttoplaybit/net.h - Added generic TCP/UDP networking
PBNetTransport- See new
PBNetTransportOpeninplaybit/net.h - See new
PBNetTransportOpenStreaminplaybit/net.h - See new
PBNetTransportOpenExinplaybit/net.h - See new
PBNetTransportOpenStreamExinplaybit/net.h - See new
PBNetTransportSetKeepAliveinplaybit/net.h
- See new
- Improved the correctness of
PBArenaPush - Added
PBDrawTextAligntoplaybit/draw.h - Added
PBDrawSetBackgroundColortoplaybit/draw.h - Added various functions for querying a window's mouse and keyboard state
- See new
PBWindowGetMousePositioninplaybit/window.h - See new
PBKeyPressedinplaybit/window.h - See new
PBKeyReleasedinplaybit/window.h - See new
PBKeyRepeatedinplaybit/window.h - See new
PBKeyRepeatedinplaybit/window.h - See new
PBMousePressedinplaybit/window.h - See new
PBMouseReleasedinplaybit/window.h - See new
PBMouseDowninplaybit/window.h - See new
PBWindowProcessEventsinplaybit/window.h - See new
PBWindowEndFrameinplaybit/window.h
- See new
- Added
PBPanicvtoplaybit/base.h - Fixed compilation error with
PBBufSlice - Added various
PBStrindex finding functions- See new
PBStrIndexOfStrinplaybit/string.h - See new
PBStrLastIndexOfStrinplaybit/string.h - See new
PBStrIndexOfByteinplaybit/string.h - See new
PBStrLastIndexOfByteinplaybit/string.h
- See new
- Added various
PBStrnumeric parsing functions- See new
PBStrSliceParseIntinplaybit/string.h - See new
PBStrSliceParseUIntinplaybit/string.h - See new
PBIntOfStrinplaybit/string.h
- See new
- Added various
PBStrtrimming functions- See new
PBStrSliceTriminplaybit/string.h - See new
PBStrSliceTrimStartinplaybit/string.h - See new
PBStrSliceTrimEndinplaybit/string.h
- See new
- Added various
PBMemFindfunctions- See new
PBMemFindByteinplaybit/mem.h - See new
PBMemFindLastByteinplaybit/mem.h - See new
PBMemFindSegmentinplaybit/mem.h - See new
PBMemFindLastSegmentinplaybit/mem.h
- See new
- Fixed compilation error with
PBCheckStrEq - Fixed potential compilation error with
PB_UNREACHABLE - Improved the correctness of
PBWindowGetMousePosition - Improved potential link error with some math functions in
playbit/math.h - Improved logging behavior to be defined as always logging one full complete message at a time
- Renamed
PB_GUI_ENABLEDdefine toPB_NO_GUIwith approriate behavior change
Runtime
- Improved rendering latency and frame pacing
- Fixed an issue where popping the root render clip region did not clear clipping
- Fixed an issue where
SysWindowFrameSyncEnablewould not enforce rights control - Fixed an issue where the frame sync signal could continue to fire even after the guest does not want it
- Fixed an issue where the runtime event loop could get confused and idle forever
- Fixed an issue where unreasonable window sizes could cause a crash
- Improved window resize signal to not fire when macOS reported a resize but the window was the same size
- Added
PBTextPlanLayoutFlagsenum to specify already supported text layout flags - Added
PBSysWindowSetCursorand various associated types - Added various syscalls for handling window fullscreen state
- See new
PBSysWindowFullScreenGetinplaybit/sys/syscalls/window.h - See new
PBSysWindowFullScreenSetinplaybit/sys/syscalls/window.h
- See new
- Added various syscalls and associated types for handling GUI presentation
- See new
PBSysGuiPresentationGetinplaybit/sys/syscalls/gui.h - See new
PBSysGuiPresentationSetinplaybit/sys/syscalls/gui.h
- See new
- Added various syscalls for Human-Interface Devices (HID) such as gamepads
- See new
playbit/sys/syscalls/hid.h - See new
PBSysGamepadButtonandPBSysGamepadEventinplaybit/sys/syscalls/event.h
- See new
- Added various syscalls for
PBNetTransport- See new
PBSysNetTransportOpenStreaminplaybit/sys/syscalls/net_transport.h - See new
PBSysNetTransportSetKeepAliveinplaybit/sys/syscalls/net_transport.h
- See new
- Added
PBSysTextureFormat_BGRA8 - Added syscalls for getting a texture's size
- See new
PBSysTextureGetWidthinplaybit/sys/syscalls/texture.h - See new
PBSysTextureGetHeightinplaybit/sys/syscalls/texture.h
- See new
- Added syscall for opening file panels (dialogs)
- See new
playbit/sys/syscalls/file_panel.h - See new
PBFilePanelEventinplaybit/sys/syscalls/event.h
- See new
- Added new
PBSysFileOpenFlag_TRUNCATEandPBSysFileOpenFlag_EXCLUSIVE - Added new
PBSysFileOpenFlag_MODE_USER_RW,PBSysFileOpenFlag_MODE_GROUP_RW, andPBSysFileOpenFlag_MODE_OTHER_RW - Added various syscalls and associated types specifically for creating files:
- See new
PBFileCreateinplaybit/sys/syscalls/file.h - See new
PBFileCreateOrPanicinplaybit/sys/syscalls/file.h - See new
PBFileCreateOrTruncateOrPanicinplaybit/sys/syscalls/file.h
- See new
- Added new helper functions for converting flag open/create types
- See new
PBFileModeOfFlagsinplaybit/sys/syscalls/file.h - See new
PBFileOpenFlagsOfModeinplaybit/sys/syscalls/file.h
- See new
- Fixed an issue where a network connection could fail to reconnect
- Fixed an issue where a guest thread could hang upon a network disconnect
- Fixed an issue where a connection was not properly disconnected on app exit
- Fixed an issue where network messages could be become corrupted and unable to decode
- Added PEM-encoded root certificate fields
certPemandcertPemLentoPBSysNetTransportConfig - Renamed
PBSysNetTransportOpenFlagstoPBSysNetTransportStreamFlags - Added
PBSysNetTransportFlagstoPBSysNetTransportConfig - Added
PBSysThreadReadRandomtoplaybit/sys/syscalls/thread.h - Improved no-gui codepaths to shut down faster than before
- Enabled use of WASM's expection-handling extension in guest programs
- Removed unused
PBSysRight_GET_PROPERTYandPBSysRight_SET_PROPERTY - Fixed a case where updating an observer could cause it to miss a signal
- Improved
SysWindowTextplanCreateto accept a null pointer when len is zero
Developer tools
- Improved logging around failure to launch Playbit.app
- Fixed an issue where launched Playbit.app would never exit after no-gui program exits
- Improved detail in
pb run --helpmessage - Fixed an issue where building an app with
--no-guiwould not be noted in the built app's manifest - Added
--colorsflag for controlling ANSI color output
Examples
- Added notes example
- Added sync1 and sync2 examples
- Added jump-game example
- Fixed an incorrect comment in
renderer-package - Improved styling and simplified
hello - Slightly simplified
game-of-life
Version 0.2
May 7 2026
Errata
A previous version of the 0.2 changelog erroniously said that a new library UI3 had been released. This was incorrect, and this library was instead later released in 0.3.
C API
- Added APIs for retrieving resources embedded into your wasm-compiled app
- See
PBAppResourceWithNameandPBAppResourceAtIndexinplaybit/app.h
- See
- Added
PBAppNametoplaybit/app.h - Added
PBAppIdtoplaybit/app.h - Renamed
printlntoprint- Use
PBPrintffor formatted printing without automatic newline
- Use
- Added APIs for interacting with various window properties
- See
playbit/window.h
- See
- Changed
UIBoxIsClickto be calledUIBoxOnClick - Improved initial window presentation behavior
- Added
PBStrLitfor makingPBStrSlicefrom c-string literals - Deprecated previous catch-all
PB_STRhelper macro- For usage not covered by
PBStrLittryPBStrSliceOf
- For usage not covered by
- Added
PBStr_FMTandPBStr_FMT_ARGmacros for easier println formatting of strings - Added new
PBDrawRectWithStrokefunction to the drawing API - Added new
PBDrawTextWithPlanfunction to the drawing API - Added new
PBDrawTexturedRectExtandPBDrawTexturedRectExt2functions to the drawing API - Added new
PBDrawTextLineandPBDrawTextMultilinefunctions to the drawing API - Improved
PBDrawBeginFrameto auto-allocate a draw API context if one is not set - Improved implicit cached text drawing cache implementation in the drawing API
- Fixed an issue where usage of the
PBArrayAllocAtmacro would not compile - Improved
PBAnyArrayFreeto now makePBArraygo into a "null" statevbecomesNULL,lenandcapbecome0
- Fixed
PBArenaFromAllocatorignoring size paramter - Introduced new
PBSemaphore- See new
playbit/semaphore.h
- See new
- Added
PBRGBandPBRGBAhelper macros for creatingPBColorvalues - Added new
PBColorToRGBA8function - Fixed an issue where
PBDateFormatcould format a date's month incorrectly - Added new
PBDateComponentsfunction - Added new
PBTimeZoneUTCOffset2function - Added new
PBRectangleOfRectandPBRectangleOfSizefunctions
Runtime
- Fixed various underlying thread correctness issues on macOS
- Fixed a rare deadlock when rendering during a window resize
- Improved the situation around some renderer setup race conditions
- Added various syscalls for audio playback
playbit/sys/syscalls/audio.h
- Added various syscalls for filesystem access
- See new
playbit/sys/syscalls/file.h - See new
playbit/sys/syscalls/file_list.h
- See new
- Added clipboard access syscalls to the window object
- Syscall:
PBSysWindowClipboardWriteText - Syscall:
PBSysWindowClipboardReadText - See
playbit/sys/syscalls/window.h
- Syscall:
- Added texture creation and modification syscalls
- See new
playbit/sys/syscalls/texture.h - See
playbit/sys/syscalls/window.h
- See new
- Added various syscalls for Playbit network access
- See new
playbit/sys/syscalls/net.h - See new
playbit/sys/syscalls/net_session.h
- See new
- Removed "scene graph" rendering syscalls
- Fixed floating point value handling of
PBSysWindowSetRect - Fixed monotonic clock not advancing when system is asleep on macOS
Playbit.app
- Improved display of recent apps to be sorted
- Added release notes to log shown on startup
- Fixed a bug which could cause some log messages to crash the app
Developer tools
- Increased default wasm stack size to 512 KiB
- Added command line flag
--stack-size