TIC-80 v1.3.0
TIC-80 v1.3.0 adds MiniScript and Forth runtimes, new audio-analysis APIs, native Metal rendering for macOS/iOS, and a wide set of web, editor, controller, and platform fixes since v1.2.0.
What's new
- New runtimes: MiniScript and Forth are now supported, with MiniScript updated to the latest MiniScript 2 main. Help/version docs now name both as post-1.2.0 runtimes.
- Audio APIs: Added VQT audio analysis and spectral whitening APIs, plus raw FFT magnitude APIs
fftrandfftrs. - Script eval: Python and JavaScript now implement
eval; JavaScript also no longer crashes when there is nothing to evaluate. - Editor & templates: Python editor now outlines defs/classes; code from
codeimportupdates before running; new TinyGo-based Go starter template; Zig template updated for Zig 0.17. - Web & export: Added a Surf build option, a sokol web system layer, 4M wasm stack plus a check, and HTML export/site-player improvements. A played cart now returns to the browser on CLOSE GAME, and Surf no longer starves the browser or leaks fetch bodies.
Platform
- Apple: New Metal renderer with native macOS/iOS support; optimized gamepad polling, border rendering, and file-change checks on Metal.
- Linux/ARM: Added Linux ARM GLESv2 support; Linux icons/mimetypes moved to the hicolor theme.
- Android: Manifest now uses the Game category and fixes
.ticassociation on Android 12+. - Controllers: Dynamic controller assignment; SDL right stick moves the cursor and only shows after first movement.
- Web/libretro: WASM libretro core no longer fails at runtime; optional libretro environment calls are non-fatal; console
addsurvives Emscripten runtime trimming. - Console: Improved eval feedback when no cart is loaded; help tables and VRAM docs cleaned up.
Bug fixes
- Fixed bookmark panel crash when a bookmark is on a blank line.
- Fixed Squirrel out-of-bounds array indexing and a scanline/border callback memory leak.
- Fixed Python
sfx()ignoring note/octave/speed from the SFX editor. - Fixed world map preview ignoring the map editor BPP setting.
- Fixed space key with
KEYBOARD_LAYOUT_ESaftertic_key_iso_extraremoval. - Fixed code editor tab width after horizontal scroll.
- Fixed same-platform export preferring an external native template instead of the local one.
- Fixed JavaScript eval crash when there is nothing to evaluate.
- Improved code rendering by adjusting viewport handling.
- Fixed Studio net field declaration and
tic80_tickcallback declarations.
Build & infrastructure
- CI now builds main and pull requests instead of every branch, builds players on every build, and restores stubs to releases.
- Site now consumes per-language HTML pairs on every build.
- Added a PRO linux-arm64 build; removed GCC 14 from the matrix.
- Configure now warns when the build has no network.
- Release tag builds receive Android signing secrets; stub lists include MiniScript and Forth.
- Release notes now lead with this summary before GitHub's PR list;
SECURITY.mdno longer pins specific versions. - Build asset directory now follows the build itself; toolbar modularized.
Statistics: 62 commits, 54 pull requests, 19 contributors.
On tic80.com
The site moved on too:
- Games delete and restore. Your own cartridges, from their page or your
profile: hidden at once, recoverable for 30 days, comments and +1s included.
An account can delete itself the same way. - A notifications page — comments and +1s on your cartridges, with a
counter in the navigation. - A liked-games page — everything you have +1'd, in one place.
- +1 is open to everyone: the old gate that required your own games to be
liked first is gone. - Sign in with your e-mail as well as your user name.
- A full-screen player — a game page, and the browser IDE, can open the
cartridge alone: no site chrome, the player fills the screen, and the game
starts as soon as the page opens. - Every game states the language it is written in.
- Game pages load a player built for that language — several times smaller
than the universal one, so they start faster. - New games are announced in the community chat again.
What's Changed
- Fix #2773: space key broken with KEYBOARD_LAYOUT_ES after tic_key_iso_extra removal by @joshgoebel in #2962
- Fix #2920: Python sfx() ignores note/octave/speed from SFX editor by @joshgoebel in #2963
- Fix #1558: world map preview ignores map editor bpp setting by @joshgoebel in #2964
- fix: squirrel scanline/border callback memory leak (#2825) by @joshgoebel in #2965
- Update SECURITY.md to remove specific versions by @pixelbath in #2948
- libretro: don't treat optional environment calls as fatal by @wescopeland in #2980
- Declare tic80_tick's callbacks as they are defined and called by @annejan in #2981
- Declare Studio's net field under the condition it is used by @annejan in #2982
- Fix WASM libretro core build failing at runtime by @Ferk in #2983
- Fix attempting to out-of-bounds index Squirrel arrays by @swoolcock in #2988
- Fix bookmark panel crashing if there is a bookmark on a blank line by @swoolcock in #2993
- [Fix] [Export] prefer local native template for same-platform export by @RDeckard in #2916
- Fix code editor tab width after horizontal scroll by @RDeckard in #2957
- web: 4M of stack for the wasm build, and a check on it by @nesbox in #3006
- ci: build main and pull requests, not every branch by @nesbox in #3008
- AndroidManifest -> Set to Game category, and fix
.ticassociation on Android 12+ by @imsys in #2956 - Optimize code rendering by adjusting viewport handling by @Wang-Yue in #2974
- [SDL] Uses right stick to move cursor + only shows after first move by @imsys in #2936
- Dynamic controller assignment by @imsys in #2958
- Change in the index.html file for html exports by @bettywolfy in #2998
- Adds support for Linux ARM GLESv2 by @imsys in #2912
- templates: add Go starter project template using TinyGo by @akhenakh in #3002
- Add raw FFT magnitude APIs fftr and fftrs by @aliceisjustplaying in #3000
- Add VQT audio analysis and spectral whitening APIs by @aliceisjustplaying in #3001
- Add MiniScript support by @MineRobber9000 in #2992
- Forth by @luginf in #2947
- release: grow the stub lists with MiniScript and Forth by @nesbox in #3009
- version: a build's asset directory follows from the build itself by @nesbox in #3010
- help version: name the two runtimes added after 1.2.0 by @nesbox in #3011
- console: one definition per help table, and VRAM without angle brackets by @nesbox in #3013
- ci: a PRO linux-arm64 build, and gcc14 out of the matrix by @nesbox in #3014
- surf: a played cart returns to the browser on CLOSE GAME by @nesbox in #3016
- Add Metal Renderer and native macOS/iOS support for TIC-80 by @Wang-Yue in #2973
- ci: the per-language html pairs on every build the site consumes by @nesbox in #3027
- html: the site's players keep the editors by @nesbox in #3030
- ci: the players on every build, the stubs back to releases by @nesbox in #3031
- python: implement eval by @zayfod in #3019
- js: implement eval, and stop crashing when there is nothing to eval by @zayfod in #3020
- console: say when eval has no cart to evaluate against by @zayfod in #3022
- Update MiniScript 2 to latest main by @MineRobber9000 in #3012
- Always update code from codeimport before running game by @MartinRykfors in #3025
- console: the add command survives emscripten's runtime trimming by @zayfod in #3018
- macOS Metal: optimize gamepad polling, border rendering & rate-limit file change checks by @Wang-Yue in #3021
- Move Linux Icon to hicolor Theme by @amayer5125 in #3026
- Add Linux Mimetype Icon by @amayer5125 in #3029
- python: outline the code editor's defs and classes by @zayfod in #3023
- #3033: warn at configure time when the build has no network by @nesbox in #3034
- Surf build option by @nesbox in #3041
- The toolbar becomes a module by @nesbox in #3046
- sokol: a system layer for the web build by @nesbox in #3048
- surf: covers stop starving the browser, and a fetch body is freed once by @nesbox in #3049
- Update Zig template to support Zig 0.17 by @sergeypdev in #3050
New Contributors
- @pixelbath made their first contribution in #2948
- @wescopeland made their first contribution in #2980
- @annejan made their first contribution in #2981
- @Ferk made their first contribution in #2983
- @swoolcock made their first contribution in #2988
- @bettywolfy made their first contribution in #2998
- @akhenakh made their first contribution in #3002
- @luginf made their first contribution in #2947
- @zayfod made their first contribution in #3019
- @amayer5125 made their first contribution in #3026
- @sergeypdev made their first contribution in #3050
Full Changelog: v1.2.0...v1.3.0