Skip to content

Releases

tiko 0.1.4 — toolchains 3ca5ef67 (2026-11-11)

Choose a tag to compare

@PaulSquires PaulSquires released this 11 Nov 22:18

tiko 0.1.4: prebuilt toolchains, packaged by build/package.sh --verify from commit 3ca5ef6 on 2026-11-11.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-3ca5ef67.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-3ca5ef67.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-3ca5ef67.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

Warning

The tkEdit visual Form Designer is a work in progress and is not ready for production-quality code yet. It is in this release so that you can try it and tell us what you find. Parts of it are incomplete, and the .tkform file format, the code it generates (.design.tiko) and the tkForms / tkLayout / theme APIs underneath it may change in ways that are not backwards compatible before it is finished. Please don't build applications you depend on with it yet. The rest of tkEdit, the compiler and the libraries in this release are not affected by this warning.

What's new

  • Version 0.1.4. tiko --version prints tiko 0.1.4 and __TIKO_VERSION__ is "0.1.4". tkEdit is 0.1.4 too.

  • Time zones by name: std/tz and std/tzdata. TimeZone.FindById( "Europe/Paris" ) finds any IANA zone, with its history, and ZonedDateTime is a moment in a zone:

    • AddCalendarDays and its siblings keep the wall-clock time across the clock changes, while Add adds elapsed time.
    • WithZoneSameInstant and WithZoneSameLocal change the zone.
    • StartOfDay gives the first moment of a date, which is not always midnight.
    • A wall-clock reading that happens twice, or never, when the clocks change is resolved by a Disambiguation policy (dzCompatible, dzEarlier, dzLater, dzReject), and MapLocal tells you which case you have.
    • ISO text carries the zone: 2025-07-04T12:00:00-04:00[America/New_York] (RFC 9557), with an OffsetPolicy for text whose offset no longer matches its zone. Patterns gain VV (zone id) and v (abbreviation).

    On Linux and macOS std/tz reads the system's zone files. #import "std/tzdata" puts the database in the program (tzdata 2026f, about 250 KB), which is what makes named zones work on Windows; it also fills in ids a system lacks, such as Ubuntu 24.04's missing US/Eastern. On Windows, TimeZone.Local now reports the machine's IANA id through the Unicode CLDR table. The embedded database is refreshed with each toolchain release; between releases, $TZDIR can point at newer zone files.

  • std/chrono time-zone fixes.

    • AddCalendarDays, AddCalendarMonths and AddCalendarYears no longer move a UTC or other fixed-offset value onto the machine's offset; only a local reading follows the machine's zone.
    • A local reading just after a clock change now gets the right offset.
    • DateTime.AssumeLocal (new) and the calendar steps resolve a repeated reading to the earlier instant and move a skipped one forward.
    • TimeZoneInfo.TryLocalOffsetAt (new) says when there was no offset to give.
    • On Linux and macOS, StandardName / DaylightName no longer depend on what other lookups ran first.
    • Windows answers before 1601 are the zone's standard offset, no longer 0.
  • tkEdit gains a visual Form Designer (work in progress, see the warning above). You lay out a .tkform on a canvas, with a toolbox, an object tree, a property and event inspector, and item editors. tkEdit generates the form's code and joins it to your own. Test Form shows a form running without a build, and there are New Form and New Form Project, project themes (Theme Center, .tktheme files) and translatable captions.

  • tkControls for the designer:

    • Anchor and Dock layout (tkLayout) and a form base (tkForms);
    • five new controls: tkLabel, tkPanel, tkGroupBox, tkPicture and tkTabControl;
    • control metadata, and themes with scopes, recipes, named styles and shape, which tkTheme_Load reads from a .tktheme at run time.
  • tkEdit:

    • File > New opens a picker of a blank file, starter programs, a form and projects;
    • an Explorer side panel lists a project's files;
    • a tab right-click menu with Rename and Duplicate;
    • -> opens the member picker and qualifies calltips and F12, as . does;
    • the debugger stops at a breakpoint on a procedure's first statement, and Globals lists every module.
  • Partial types. partial type and partial class spread one type across several blocks and module files. Mixing partial and non-partial parts, generic partial types and disagreeing parts are refused (TKO1063–TKO1068).

  • Fixes:

    • common shared dynamic arrays link across modules;
    • cast( string, udt ) is typed STRING when the type declares that cast;
    • a narrow string slice no longer reaches a C-string reader unterminated, and select case over one no longer corrupts the string pool;
    • a package name need not be an identifier (name = "my-app" works);
    • a method named like a statement keyword is the method;
    • misuse of the cva_* intrinsics is an error (TKO0987–TKO0989), not an internal compiler error.
  • std/numeric: ShuffleArray, ShuffleDeque, ShuffleList, ChoiceArray and ChoiceDeque for the containers.

  • Language server: rebuilt with this compiler from tiko-lsp's current main: partial types and classes, and slice types highlighted in VS Code, Sublime and Neovim.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TIKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

tkEdit's debugger needs LLVM's lldb-dap: on Windows it comes with LLVM (C:\Program Files\LLVM\bin); on Linux, your distribution's lldb package (lldb-dap or lldb-dap-NN); on macOS, Xcode's Command Line Tools, with Developer Mode on (tkEdit says so if it is off).

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download

The archives are public: no account or token is needed. From a terminal:

# Windows (PowerShell)
curl.exe -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-3ca5ef67/tiko-windows-x86_64-3ca5ef67.zip
tar -xf tiko-windows-x86_64-3ca5ef67.zip

# Linux
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-3ca5ef67/tiko-linux-x86_64-3ca5ef67.tar.gz
tar -xzf tiko-linux-x86_64-3ca5ef67.tar.gz

# macOS
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-3ca5ef67/tiko-macos-arm64-3ca5ef67.tar.gz
tar -xzf tiko-macos-arm64-3ca5ef67.tar.gz

Check the download against SHA-256 below: certutil -hashfile <file> SHA256 on Windows, sha256sum <file> on Linux, shasum -a 256 <file> on macOS. gh release download toolchain-3ca5ef67 -R PaulSquires/tiko-lang fetches all three.

On macOS, download with curl (or gh), not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server; curl adds no mark. If you did use a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, with all seven sys/win modules, and with a graphics program. Every check passed, 17 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 1716 passed, Linux (X11, under WSLg) 1718 passed, macOS 1677 passed, 0 failed on each. On Windows the first run reported 3 failures that did not recur in two reruns. tkEdit's core and Form Designer suites passed at the version bump (948 and 397, 0 failed).
  • The book and tiko by Example, every listing compiled and run with these toolchains on Windows, Linux and macOS: book 484 of 484 and tiko by Example 313 of 313 on each, nothing blocked.
  • Time zones: the std/tz and std/tzdata tests passed on Windows, Linux and macOS, including a comparison against the C library's own answers on Linux and macOS, and the embedded tzdata 2026f against the same build's zone files.
  • The language server is tiko-lsp 0.1.3, built by each host's pa...
Read more

tiko 0.1.3 — toolchains 7515ba56 (2026-11-08)

Choose a tag to compare

@PaulSquires PaulSquires released this 08 Nov 04:15

tiko 0.1.3: prebuilt toolchains, packaged by build/package.sh --verify from commit 7515ba5 on 2026-11-08.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-7515ba56.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-7515ba56.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-7515ba56.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

  • Version 0.1.3. tiko --version prints tiko 0.1.3 and __TIKO_VERSION__ is "0.1.3". tkEdit is 0.1.3 too.
  • String slices. slice, uslice and wslice are zero-copy views of a string, ustring or wstring (and of fixed-length strings and zstring / wstring pointers), written s[lo to hi]: inclusive, 0-based code units, range-checked when the slice is made. A slice reads like a string — len, v[i], compare, &, print, for each, select case — and any string passes where a const slice parameter is wanted. cast( ustring, v ), cast( string, v ) or an assignment makes an owned copy. Slices cannot outlive what they view: they live only in locals, parameters and results (and in type X as view types); a slice that would outlive its source, a slice of a temporary kept in a variable, or a change to a string that might move it while a slice of it is still in use, is a compile error (TKO1050–TKO1062). Under -earray (part of -exx) each use is also checked at run time against the source's current buffer. std/strings gains Find, Equals, StartsWith, EndsWith, TrimStart, TrimEnd, TrimSpace and a SplitSlices iterator over slices, in all three widths.
  • Interfaces and classes. interface, class, implements and inherits; calls through an interface, conversions, trycast and is, interface properties, generic interfaces, and interfaces as generic constraints.
  • Properties. Auto-properties, get / set blocks, any number of indices, static and namespace properties. A property passed byref is written back through its setter, and swap, @ and per-accessor visibility work on properties.
  • Graphics on Linux and macOS. The fbgfx-compatible graphics library now has an X11 driver on Linux (libX11 loaded at run time, no X11 libraries needed to link) and a Cocoa driver on macOS, beside Windows' GDI one.
  • tkEdit has a debugger. A Debug menu, and a Debug tab in the Output pane (Locals, Globals and Watch beside the Call Stack and Breakpoints), with data tips on hover. F9 sets a breakpoint, F6 builds with -g and runs to it, and F10 / F11 / Shift+F11 step. It drives LLVM's lldb-dap (see Requirements).
  • -g names a type the way its declaration does (as int64 shows as int64 in a debugger, not longint). On macOS, -g now gathers the debug information into <program>.dSYM.
  • Environment variables are TIKO_*. TIKO_INCLUDE, TIKO_LIBPATH, TIKO_PKG, TIKO_CLANG, TIKO_MODCACHE and the rest. The old TKO_* names are no longer read, so rename any you set.
  • Array results: a function returning a fixed-size local array moves it out, and var p( ) = f( ) works.
  • macOS: runtime calls extend their narrow integer arguments correctly, and -dll links without a main.
  • Now refused at compile time, where tiko used to accept them or fail inside the compiler: a const initialiser that reads a variable or calls a procedure (TKO0605); a second generic sub or function of one name in one scope (TKO0600); a body for an interface member (TKO0434); a function with no result type (TKO0320, fbc's error 147); a broken generic constraint (TKO1022 alone); lbound / ubound of something that is not an array (TKO1023); spawn of a method or namespace procedure (TKO0943).
  • Language server: tiko-lsp 0.1.3, rebuilt with this compiler from its repository's current main: string slices, type X as view, interfaces and classes, property set / end set, and the TIKO_PKG / TIKO_INCLUDE variables.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TIKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

tkEdit's debugger needs LLVM's lldb-dap: on Windows it comes with LLVM (C:\Program Files\LLVM\bin); on Linux, your distribution's lldb package (lldb-dap or lldb-dap-NN); on macOS, Xcode's Command Line Tools, with Developer Mode on (tkEdit says so if it is off).

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download

The archives are public: no account or token is needed. From a terminal:

# Windows (PowerShell)
curl.exe -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-7515ba56/tiko-windows-x86_64-7515ba56.zip
tar -xf tiko-windows-x86_64-7515ba56.zip

# Linux
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-7515ba56/tiko-linux-x86_64-7515ba56.tar.gz
tar -xzf tiko-linux-x86_64-7515ba56.tar.gz

# macOS
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-7515ba56/tiko-macos-arm64-7515ba56.tar.gz
tar -xzf tiko-macos-arm64-7515ba56.tar.gz

Check the download against SHA-256 below: certutil -hashfile <file> SHA256 on Windows, sha256sum <file> on Linux, shasum -a 256 <file> on macOS. gh release download toolchain-7515ba56 -R PaulSquires/tiko-lang fetches all three.

On macOS, download with curl (or gh), not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server; curl adds no mark. If you did use a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, with all seven sys/win modules, and with a graphics program. Every check passed, 17 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window, debugger sessions included on Windows and Linux: Windows 885 passed, Linux (X11, under WSLg) 887 passed, macOS 856 passed, 0 failed on each.
  • The compiler passed the full test suite on Windows at the commit before the version bump (2571 passed; one threading test timed out under the suite's load and passes on its own), and at 7515ba5 it rebuilt itself at -O2 to a fixed point (stages 1, 2 and 3 byte-identical, every statement of all 174 modules lowered).
  • The language server is tiko-lsp 0.1.3, built by each host's packaged compiler from tiko-lsp d66f3ee; each build passed its own suite and an LSP session.
  • The archives, each unpacked into an empty directory with no TIKO_* variables, compiled and ran a program. Each one holds only tiko-lang/, with tkEdit at its top and tiko-lsp next to the compiler, answering --version. The macOS tkEdit.app's signature verifies.

SHA-256

2b98f1d50eec390f0f1bb9e5e206cbbf78af43d085899523e0208912398eaffe *tiko-windows-x86_64-7515ba56.zip
70483196c37a4f895a4d4bb805f2b46bc64a2890bc65bdf6a506b0cd7ec01907 *tiko-linux-x86_64-7515ba56.tar.gz
6aa23352581fda41a57b662bb9fd47cf09ed6100655d305798f523807db8d20c *tiko-macos-arm64-7515ba56.tar.gz

seed-9 (b1a2b33f)

Choose a tag to compare

@PaulSquires PaulSquires released this 08 Nov 01:20

The ninth seed: the first that compiles string slices (slice / uslice / wslice, s[lo to hi]), so pkg/std may use them from the commit that pins it. All three archives were built by seed-8, and each one reproduces its commit on the first bootstrap step.

The archives are the toolchains build/package.sh --verify --no-tkedit produced from commit b1a2b33 on 2026-11-07 (Release). Compiler only: unlike the seed-8 archives there is no tkEdit and no tiko-lsp in them, and there is no matching toolchain- release. Each unpacks to a single folder, tiko-lang/; seed/fetch-seed.sh renames it to tiko-<host>/, where build/build.sh looks.

Archive SHA-256
tiko-seed-windows-x86_64-b1a2b33f.zip 46d8810aec858ad7e127256b97089a8e8afda89cbe193a70e20801169db41939
tiko-seed-linux-x86_64-b1a2b33f.tar.gz 48cf23304951ece5ecaefed6b57c970425c707dcbfea64c10e74e8575e0ea22f
tiko-seed-macos-arm64-b1a2b33f.tar.gz 805b48e12c1836cb04ec3fbe4c31607c2465c616f3ea5db5cb27b1ba1227b444

What was checked

  • Packaging: package.sh --verify on Windows, on Linux under WSL, and on macOS, all at the same commit, with seed-8 as stage0. 17 checks passed on each host, 0 failed.
  • Each archive, unpacked into an empty directory, compiled and ran hello.tiko (macOS under env -i).
  • Bootstrap from each archive (build/bootstrap.sh --seed <its tiko>) on windows-x86_64, linux-x86_64 and macos-arm64:
    • every statement of all 174 modules lowered;
    • stage1 == stage2 == stage3, byte for byte, on every host;
    • stage3's hello printed what the seed's printed.
  • Not run for this seed: --gate (the suite against stage2). The suite at b1a2b33 ran on Windows before the push, from a tree compiler.

Use as a seed

seed/fetch-seed.sh
build/build.sh                    # finds seed/cache/<host> by itself
build/bootstrap.sh --gate         # the self-hosting fixpoint, from the seed

Or point at an unpacked archive directly: TIKO_SEED=<dir>/tiko-lang/bin/tiko build/build.sh (Windows: <dir>\tiko-lang\tiko.exe).

The archives are public, so fetch-seed.sh needs no token; without gh it downloads them with curl. On macOS, if a browser fetched an archive, clear the quarantine first: xattr -dr com.apple.quarantine tiko-lang.

clang (LLVM 18 or later) is required and not bundled. On macOS that is Homebrew's (brew install llvm), with Xcode's Command Line Tools.

tiko 0.1.2 — toolchains cfa02199 (2026-11-05)

Choose a tag to compare

@PaulSquires PaulSquires released this 05 Nov 22:40

tiko 0.1.2: prebuilt toolchains, packaged by build/package.sh --verify from commit cfa0219 on 2026-11-05.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-cfa02199.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-cfa02199.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-cfa02199.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

  • Version 0.1.2. tiko --version prints tiko 0.1.2 and __TIKO_VERSION__ is "0.1.2". tkEdit is 0.1.2 too.
  • Large UDT copies no longer stall the build. Copying a UDT of 512 bytes or more is now always a memcpy. That includes copies where other code runs between reading the value and storing it, such as this.d = f( str( x ) ), where the temporary string is destroyed in between. Before, such a copy reached clang as one large value, and clang's code generation slowed sharply with its size: about 50 seconds for each 5,008-byte copy. A decimal-arithmetic library with sixteen of them spent about 13 minutes in clang. It now builds in about a second.
  • Windows executables get a 2 MB stack, as fbc gives them. tiko used to leave the linker's 1 MB default, so a program with deep recursion over large local UDTs could stop with a stack overflow (0xC00000FD) under tiko while running under fbc.
  • -t <KB> sets the stack size, with fbc's rules: the value in KB sets both the reserve and the commit, anything under 64 KB becomes 64 KB, a negative value changes nothing, and #cmdline "-t ..." overrides the command line. It applies to Windows executables and DLLs. On Linux and macOS, as with fbc, the main thread's stack comes from the system (ulimit -s), and -t does not change the binary.
  • tkEdit: the menu bar is back along the top, one menu per command group (File, Edit, Search, View, Project, Build), each item with its current shortcut. Items are greyed out while they would do nothing. Ctrl+Shift+M shows or hides it, and [ui] show_menu in settings.toml remembers the choice. The menu titles are translated into Spanish, French, German and Chinese.
  • Language server: tiko-lsp 0.1.3, unchanged from 0.1.1.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download

The archives are public: no account or token is needed. From a terminal:

# Windows (PowerShell)
curl.exe -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-cfa02199/tiko-windows-x86_64-cfa02199.zip
tar -xf tiko-windows-x86_64-cfa02199.zip

# Linux
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-cfa02199/tiko-linux-x86_64-cfa02199.tar.gz
tar -xzf tiko-linux-x86_64-cfa02199.tar.gz

# macOS
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-cfa02199/tiko-macos-arm64-cfa02199.tar.gz
tar -xzf tiko-macos-arm64-cfa02199.tar.gz

Check the download against SHA-256 below: certutil -hashfile <file> SHA256 on Windows, sha256sum <file> on Linux, shasum -a 256 <file> on macOS. gh release download toolchain-cfa02199 -R PaulSquires/tiko-lang fetches all three.

On macOS, download with curl (or gh), not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server; curl adds no mark. If you did use a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with all seven sys/win modules. Every check passed, 16 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 777 passed, Linux (X11, under WSLg) 773 passed, macOS 773 passed, 0 failed on each.
  • The compiler passed the full test suite on Windows (2490 passed, 0 failed), and it rebuilt itself at -O2 to a fixed point (stage 2 and stage 3 byte-identical).
  • The language server is tiko-lsp 0.1.3, taken from that repository's own release archives.
  • The archives, each unpacked into an empty directory with no TKO_* variables, compiled and ran a program. Each one holds only tiko-lang/, with tkEdit at its top and tiko-lsp next to the compiler, answering --version. The macOS tkEdit.app's signature verifies.

SHA-256

593dde9559a88e4e62985660e1aee4cbba56971dabfdcf754e0582d33896d1ed *tiko-windows-x86_64-cfa02199.zip
8615faab9ca614ca8ae938322f07950f06babea438d1d7606613a5e9d9396698 *tiko-linux-x86_64-cfa02199.tar.gz
879921e73017613a90f453e4d864e1085cf5c1b8bfe9a9a5b0d53adf2fd924b1 *tiko-macos-arm64-cfa02199.tar.gz

tiko 0.1.1 — toolchains 9cfc9e7c (2026-11-05)

Choose a tag to compare

@PaulSquires PaulSquires released this 05 Nov 18:46

tiko 0.1.1: prebuilt toolchains, packaged by build/package.sh --verify from commit 9cfc9e7 on 2026-11-05.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-9cfc9e7c.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-9cfc9e7c.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-9cfc9e7c.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

  • Version 0.1.1. tiko --version prints tiko 0.1.1 and __TIKO_VERSION__ is "0.1.1", with no -dev suffix. tkEdit is 0.1.1 too.
  • Compiler fixes. These were found by compiling the FreeBASIC solutions from Rosetta Code:
    • true 1 (a statement that opens with TRUE and has arguments) crashed the compiler. It is now an error.
    • A value, constant or literal given arguments as if it were called (v, 1, X 1, "a" 1, pf 1), or a literal alone as a statement, is now a diagnostic: TKO0617, TKO0874 or TKO0652. These were internal compiler errors (TKO0994).
    • A scalar typedef or enum called where a value is needed (s = sock( 1, 2, 3 ), int32( 5 )) is now TKO0971, as it is uncalled. This was TKO0994.
    • clear a, , 4 now compiles: an omitted fill value is 0, as it is in fbc.
    • Static initialisers that fbc folds now fold in tiko too: len( chr( ... ) ), and a wstring * N built from wchr codes above 255 (static as wstring * 8 w = wchr( &h2581 ) & wchr( &h41 )). These were TKO0994.
  • Archiver lookup. A clang named with a version (clang-18) now finds llvm-ar-18 beside it, and TKO_AR names the archiver if it is set. A missing archiver is now TKO0111 with its path, instead of TKO0115 archiving failed (exit -1). This affected -lib builds with TKO_CLANG=/usr/bin/clang-18 on Debian and Ubuntu.
  • Linux binaries. tiko, tkedit and tiko-lsp no longer require libtinfo's symbol versions, so Fedora and Arch no longer print "no version information available" at every start.
  • tkEdit:
    • Duplicate Line (Ctrl+D) copies every line the selection touches.
    • Comment Block inserts '' by default, or ' with [editor] double_comment = false. Uncomment removes one or two marks.
  • Language server: tiko-lsp 0.1.3. Its grammar, server and editor support catch up with tiko's current syntax.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download

The archives are public: no account or token is needed. From a terminal:

# Windows (PowerShell)
curl.exe -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-9cfc9e7c/tiko-windows-x86_64-9cfc9e7c.zip
tar -xf tiko-windows-x86_64-9cfc9e7c.zip

# Linux
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-9cfc9e7c/tiko-linux-x86_64-9cfc9e7c.tar.gz
tar -xzf tiko-linux-x86_64-9cfc9e7c.tar.gz

# macOS
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-9cfc9e7c/tiko-macos-arm64-9cfc9e7c.tar.gz
tar -xzf tiko-macos-arm64-9cfc9e7c.tar.gz

Check the download against SHA-256 below: certutil -hashfile <file> SHA256 on Windows, sha256sum <file> on Linux, shasum -a 256 <file> on macOS. gh release download toolchain-9cfc9e7c -R PaulSquires/tiko-lang fetches all three.

On macOS, download with curl (or gh), not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server; curl adds no mark. If you did use a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with all seven sys/win modules. Every check passed, 16 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 741 passed, Linux (X11, under WSLg) 737 passed, macOS 737 passed, 0 failed on each.
  • The compiler passed the full test suite on Windows (2483 passed, 0 failed) and the release gate's corpus comparison (no change in diagnostics over 2,709 files).
  • The language server is tiko-lsp 0.1.3, taken from that repository's own release archives.
  • The archives, each unpacked into an empty directory with no TKO_* variables, compiled and ran a program. Each one holds only tiko-lang/, with tkEdit at its top and tiko-lsp next to the compiler, answering --version. The macOS tkEdit.app's signature verifies.

SHA-256

7bc36c00860377069df07536bcea9f18046a2311f11c6b5636714e0b00c7f823 *tiko-windows-x86_64-9cfc9e7c.zip
21d5f5c2e5cbb4551bd0e7d35452d93890c868af3bb7dd7734359bf93538d4ef *tiko-linux-x86_64-9cfc9e7c.tar.gz
882d159ee4f2e1a2ada0899bf44debb9b82f973a6801c3e977ee00f7e87a019b *tiko-macos-arm64-9cfc9e7c.tar.gz

tiko toolchains 49c4a7b7 (2026-11-04)

Choose a tag to compare

@PaulSquires PaulSquires released this 04 Nov 13:50

Prebuilt tiko toolchains, packaged by build/package.sh --verify from commit 49c4a7b on 2026-11-04.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-49c4a7b7.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-49c4a7b7.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-49c4a7b7.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

The compiler, the runtime and std are unchanged since toolchain-1f7635cb. This release brings José Roca's review of sys/win and its examples.

  • sys/win fixes:
    • Resource leaks: CIOpenSaveFile's name getters free the shell's string, DSafeArray's string getters free the BSTR, CRichEditCtx frees the printer DC and releases its OLE storage, CXpButton destroys icons with DestroyIcon, and the GDI+ procedures shut GDI+ down on every path.
    • CRichEditCtx.ExGetSel returns cpMax (it was byval); RichEdit.SetTextMode passes its flags in the right parameter; the TOM interfaces' GetIDsOfNames slots have the right signature.
    • Edit.GetCueBannerText and Combo.GetCueBannerText return the text without its trailing padding, or "" when there is none; Combo, Edit and win text getters return exactly the text.
    • The WIC functions (WICConvertBitmapSource and five more) are imported from Windowscodecs.dll, where they live, not d2d1.dll.
    • CMaskedEdit passes the repeat count and scan code the right way round.
  • examples/win64: four examples updated (GDI+ StringFormatSetTrimming, RichEdit, two WebView2).

Breaking

All in sys/win:

Was Now
RichEdit.GetStoryTpe RichEdit.GetStoryType
RichEdit.SetElipsisMode RichEdit.SetEllipsisMode
ListView.GetText ListView.GetItemText (the ustring overload)
ListView.SetText removed: use ListView.SetItemText
ListView.GetWorkAreas returning a tuple removed: the RECT ptr form remains
WinCtrl.IsBlank a SUB a FUNCTION
GDIP_GetAlpha/Red/Green/Blue return byte return ubyte
StatusStr returns string returns ustring
CWebView2NavigationStartingdEventHandler CWebView2NavigationStartingEventHandler
CWebView2AddScriptToExecuteOnDocumentCreatedCompleteHandler CWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler
CWebView2AddCapturePreviewCompletedHandler CWebView2CapturePreviewCompletedHandler

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download

The archives are public: no account or token is needed. From a terminal:

# Windows (PowerShell)
curl.exe -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-49c4a7b7/tiko-windows-x86_64-49c4a7b7.zip
tar -xf tiko-windows-x86_64-49c4a7b7.zip

# Linux
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-49c4a7b7/tiko-linux-x86_64-49c4a7b7.tar.gz
tar -xzf tiko-linux-x86_64-49c4a7b7.tar.gz

# macOS
curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-49c4a7b7/tiko-macos-arm64-49c4a7b7.tar.gz
tar -xzf tiko-macos-arm64-49c4a7b7.tar.gz

Check the download against SHA-256 below: certutil -hashfile <file> SHA256 on Windows, sha256sum <file> on Linux, shasum -a 256 <file> on macOS. gh release download toolchain-49c4a7b7 -R PaulSquires/tiko-lang fetches all three.

On macOS, download with curl (or gh), not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server; curl adds no mark. If you did use a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with all seven sys/win modules. Every check passed, 16 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 731 passed, Linux (X11, under WSLg) 727 passed, macOS 727 passed, 0 failed on each.
  • examples/win64: all 639 example programs compile and link against this sys/win.
  • Bootstrap from each packaged toolchain (build/bootstrap.sh --seed <its tiko> --gate) on Windows, Linux and macOS: every statement of all 160 modules lowered, stage1 == stage2 == stage3 byte for byte, stage3's hello prints what the seed's prints, and the suite fails exactly the same tests against stage2 as against stage1. These toolchains are also published as seed-8.
  • The language server is the tiko-lsp 4de013e build shipped in toolchain-1f7635cb, whose compiler, runtime and std this release keeps unchanged. It passed that repository's release gates: the whole suite, the dependency gates (Windows: only kernel32.dll and ucrtbase.dll; Linux: glibc 2.34 or older, only libc, libm and libtinfo; macOS: system libraries only, macOS 13.0 or later, signed), and one LSP session.
  • The archives, each unpacked into an empty directory with no TKO_* variables, compiled and ran a program. Each one holds only tiko-lang/, with tkEdit at its top and tiko-lsp next to the compiler, answering --version. The macOS tkEdit.app's signature verifies.

SHA-256

8769c82cc6f47951aea076885e06b1cd049457c0559a25eabdb260a0fb90d77b *tiko-windows-x86_64-49c4a7b7.zip
ebca1272ebe66868c294b7e6bd285106d9b4d733df0ba207f6934d4d7272f986 *tiko-linux-x86_64-49c4a7b7.tar.gz
879f2494bf6e3df73bb7950e6a60836843f33b6f49c4b9d6747cdc08d22bdf9b *tiko-macos-arm64-49c4a7b7.tar.gz

seed-8 (49c4a7b7)

Choose a tag to compare

@PaulSquires PaulSquires released this 04 Nov 13:51

The eighth seed. It is byte-identical to release toolchain-49c4a7b7: the same three archives, renamed. All three were built by seed-7, and each one reproduces master on the first bootstrap step.

The archives are the toolchains build/package.sh --verify produced from commit 49c4a7b on 2026-11-04 (Release). Like the toolchain releases since toolchain-6828165b, each unpacks to a single folder, tiko-lang/; seed/fetch-seed.sh renames it to tiko-<host>/, where build/build.sh looks.

Archive SHA-256
tiko-seed-windows-x86_64-49c4a7b7.zip 8769c82cc6f47951aea076885e06b1cd049457c0559a25eabdb260a0fb90d77b
tiko-seed-linux-x86_64-49c4a7b7.tar.gz ebca1272ebe66868c294b7e6bd285106d9b4d733df0ba207f6934d4d7272f986
tiko-seed-macos-arm64-49c4a7b7.tar.gz 879f2494bf6e3df73bb7950e6a60836843f33b6f49c4b9d6747cdc08d22bdf9b

What was checked

  • Packaging: package.sh --verify on Windows, on Linux under WSL, and on macOS, all at the same commit. 16 checks passed on each host, among them the eleven std modules, sys/win (and its guard elsewhere), and vendor/sqlite3 linked statically and dynamically. tkEdit, built by each packaged compiler, passed its GUI self-test (731 / 727 / 727, 0 failed).
  • Each archive, unpacked into an empty directory with no TKO_* set, compiled and ran hello.tiko, and its tiko-lsp answered --version.
  • Bootstrap from each packaged toolchain (build/bootstrap.sh --seed <its tiko> --gate) on windows-x86_64, linux-x86_64 and macos-arm64:
    • every statement of all 160 modules lowered;
    • stage1 == stage2 == stage3, byte for byte, on every host;
    • stage3's hello printed what the seed's printed;
    • the suite failed exactly the same tests against stage2 as against stage1.

Use as a seed

seed/fetch-seed.sh
build/build.sh                    # finds seed/cache/<host> by itself
build/bootstrap.sh --gate         # the self-hosting fixpoint, from the seed

Or point at an unpacked archive directly: TKO_SEED=<dir>/tiko-lang/bin/tiko build/build.sh (Windows: <dir>\tiko-lang\tiko.exe).

The archives are public, so fetch-seed.sh needs no token; without gh it downloads them with curl. On macOS, if a browser fetched an archive, clear the quarantine first: xattr -dr com.apple.quarantine tiko-lang.

Use as a compiler

It is a complete toolchain, the same as toolchain-49c4a7b7:

  • Windows: tiko-lang\tiko.exe hello.tiko -o hello.exe
  • Linux: tiko-lang/bin/tiko hello.tiko -o hello
  • macOS: tiko-lang/bin/tiko hello.tiko -o hello

clang (LLVM 18 or later) is required and not bundled. On macOS that is Homebrew's (brew install llvm), with Xcode's Command Line Tools.

tiko toolchains 1f7635cb (2026-11-03)

Choose a tag to compare

@PaulSquires PaulSquires released this 03 Nov 16:15

Prebuilt tiko toolchains, packaged by build/package.sh --verify from commit 1f7635c on 2026-11-03.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-1f7635cb.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-1f7635cb.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-1f7635cb.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

  • tkEdit:
    • Scrollbars on each pane. The vertical bar counts rows as shown (folds and wraps); it appears while the rows overflow the pane, and always while the view is split. The horizontal bar appears while the mouse is over the view or the bar.
    • A start panel when no file is open: New File, Show All Commands, Open Recent, Open File and Show Settings, each with its shortcut. Click one, or use Up/Down and Enter.
  • std/containers: faster Map and Set.
    • A key's home slot comes from the top bits of its hash times 2^64/phi (Fibonacci hashing), so dense integer keys spread over nearly distinct slots.
    • Each slot has a control byte holding 7 bits of the hash, so a probe compares a key only when that byte matches.
    • Each operation hashes once and probes once. m[ k ] on a missing key probed three times before.
    • Put and Add copy the key and value only when the table is about to grow.
    • Remove shifts the rest of the probe run back instead of leaving a tombstone.
    • On a 1M-key benchmark with string keys: inserts 41% faster, lookups 28%, misses 77%, remove-and-re-add churn 20%. String Sets are 18-47% faster, and integer misses 22%. Integer churn is 29% slower, the cost of the backward shift. Every operation returns what it did before (500,000 random operations give byte-identical results), only the iteration order changes, and a stored string keeps its buffer across every growth and removal.
  • macOS: full backtraces. Every function now sets up a frame record, as Apple's arm64 ABI expects. Crash reports and debuggers show the whole call chain; before, they showed the faulting function and main with nothing between.
  • Fixes:
    • vendor/tkControls: a tooltip still showing when its window was destroyed was closed again after being freed. This crashed tkEdit on macOS.
    • sys/win: Edit.GetLine, RichEdit.GetLine and CRichEditCtx.GetLine overran the heap on long lines. Combo and ListBox CalcHorizontalExtent wrote 2 bytes past each item's buffer.
    • A byref as wstring property setter takes the wide encoding; p->P( i ) = v, (*p).P( i ) = v and a byref receiver reach the setter; member operator @ on an imported type is a member call; space( ) and string( ) widen for a wstring ptr parameter; { obj, ... } into a pointer array stores each object's cast.
    • The tpad example uses Cmd on macOS, and its menus show the platform's key.

Breaking

  • A procedure named as a type (dim a as F, dim a as win.MsgBox) is now always TKO0997, as fbc reports it (error 14). In a file that declared a generic it compiled, as a 4-byte variable.
  • New refusals, each what fbc reports for the same code:
Code Was Now
sub F( ) as long accepted TKO0598
assigning a property that has no setter of that shape a store through the getter, or an internal error TKO0680
T( args ) that two constructors take equally well accepted TKO0660
an overload set reached only through a base type's CAST that the type's own CAST hides an internal error TKO0632
  • The integer HashOf overloads are the identity (Map and Set do the mixing). A user type that combines field hashes with a plain xor should mix one side with containers.HashInt, or (2, 0) and (0, 1) hash alike. Map/Set iteration order changes, as before it was unspecified.
  • sys/win: Combo.GetEditSel and DTP.SetFormat are FUNCTIONs.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download the macOS archive with curl

Download with curl, not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server. An archive fetched with curl (or gh release download) carries no mark, so nothing needs clearing.

While the repository is private, a download needs a GitHub token with read access to it. gh auth token prints yours if you use gh; otherwise use a fine-grained token with Contents: read. In Terminal:

TOKEN=$(gh auth token)
curl -fL -H "Authorization: Bearer $TOKEN" -H "Accept: application/octet-stream" \
     -o tiko-macos-arm64-1f7635cb.tar.gz \
     https://api.github.com/repos/PaulSquires/tiko-lang/releases/assets/706239254
shasum -a 256 tiko-macos-arm64-1f7635cb.tar.gz
tar -xzf tiko-macos-arm64-1f7635cb.tar.gz

The checksum should match the one in SHA-256 below. Once the repository is public, no token is needed:

curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-1f7635cb/tiko-macos-arm64-1f7635cb.tar.gz

If you did download with a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with all seven sys/win modules. Every check passed, 16 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 731 passed, Linux (X11, under WSLg) 727 passed, macOS 727 passed, 0 failed on each.
  • The test suite passed on Windows: 2479 tests, 0 failed. The std/containers and tkTooltip tests also passed on Linux and macOS.
  • The language server was built by each packaged toolchain from tiko-lsp 4de013e, by that repository's release scripts: the whole suite, the dependency gates (Windows: only kernel32.dll and ucrtbase.dll; Linux: glibc 2.34 or older, only libc, libm and libtinfo; macOS: system libraries only, macOS 13.0 or later, signed), and one LSP session.
  • The archives, each unpacked into an empty directory with no TKO_* variables, compiled and ran a program. Each one holds only tiko-lang/, with tkEdit at its top and tiko-lsp next to the compiler, answering --version. The macOS tkEdit.app's signature verifies.

SHA-256

ad8e7a3aa1acc011a02c1be9570f7b5257b9507a6cbedb52b54ae04db7be652f *tiko-windows-x86_64-1f7635cb.zip
f5bedfcffff0bc08e382fae80fece859641f0798eb829d600983ffe2e0cc5fe8 *tiko-linux-x86_64-1f7635cb.tar.gz
c515571a76b133594053211dd85c75ccc4a48f761c604fd4f1b1ed22829877a2 *tiko-macos-arm64-1f7635cb.tar.gz

tiko toolchains 9b5bf78f (2026-10-31)

Choose a tag to compare

@PaulSquires PaulSquires released this 31 Oct 17:29

Prebuilt tiko toolchains, packaged by build/package.sh --verify from commit 9b5bf78 on 2026-10-31.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, tkEdit, the tiko language server, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. There are three archives: Windows, Linux and macOS (Apple Silicon). Each one unpacks to a single folder, tiko-lang/:

Archive Compiler tkEdit Language server
tiko-windows-x86_64-9b5bf78f.zip tiko-lang\tiko.exe tiko-lang\tkedit.exe tiko-lang\tiko-lsp.exe
tiko-linux-x86_64-9b5bf78f.tar.gz tiko-lang/bin/tiko tiko-lang/tkedit tiko-lang/bin/tiko-lsp
tiko-macos-arm64-9b5bf78f.tar.gz tiko-lang/bin/tiko tiko-lang/tkEdit.app tiko-lang/bin/tiko-lsp

What's new

  • The language server ships with tiko. tiko-lsp 0.1.2 sits next to the compiler, so a tiko on your PATH puts tiko-lsp there too. With no toolchain option, it uses the toolchain it is installed in. Its licence is licences/LICENSE-tiko-lsp.
  • sys/win: José Roca's update.
    • CPrint (sys/win/gui), a printing class, with an example in examples/win64/CPrint Examples.
    • SetRenderingPolicy( hwnd, policy ) sets the DWM non-client rendering policy of a window. Edit.SetLeftMarginForDpi and Edit.SetRightMarginForDpi scale the margin for the window's DPI.
    • examples/win64: the GDI+ examples are .tiko sources now. All 639 programs in examples/win64 compile and link with this toolchain.
  • #pragma push_macro( "X" ) / #pragma pop_macro( "X" ) save a macro's definition, and restore it exactly. On Linux and macOS, a program that reads a C runtime header before it imports a std module (directly, or through vendor/SDL3) no longer fails with TKO0406 on names such as SEEK_SET.
  • Fixes:
    • tiko-rt: SLEEP releases the runtime's I/O lock before it sleeps, as fbc does. Before, one thread's SLEEP held up every other thread's console output and SLEEP for its whole length.
    • sys/win reports that it is Windows-only when it is imported for another target, rather than failing inside a C runtime header.
    • The Windows tkedit.exe has a version resource.

Breaking: sys/win names removed

This release removes 153 public names from sys/win: files and folders, locale names, memory and battery queries, environment strings, Base64 and surrogate-pair helpers. A program that used one of them can switch to the std modules (std/fs, std/os, std/codec, std/strings) or call the Windows API directly. Two names are renamed:

Was Now
Msg( ... ) MsgBox( ... )
Guid( text ) (sys/win/com) GetGuid( text )

The GDI+ wrapper types GdiPlusBrush, GdiPlusPen, GdiPlusGraphics and the rest of the GdiPlus* family are gone. Use the CGp* classes in sys/win/gdiplus (CGpBrush, CGpPen, CGpGraphics and the others) instead.

Every removed name, by file
  • StrProcs.tiko: Base64DecodeA, Base64DecodeW, Base64EncodeA, Base64EncodeW, ChrW, CodePointToSurrogatePair, IsValidSurrogatePair, ScanForSurrogates, StrHasSurrogates, StrRemove, StrReplace, SurrogatePairToCodePoint
  • com/DVARIANT.tiko: VariantMsg
  • com/com.tiko: Guid
  • gdiplus/GdipObj.tiko: GdiPlusAdjustableArrowCap, GdiPlusBitmap, GdiPlusBrush, GdiPlusCustomLineCap, GdiPlusEffect, GdiPlusFont, GdiPlusFontFamily, GdiPlusGraphics, GdiPlusGraphicsPath, GdiPlusHatchBrush, GdiPlusImage, GdiPlusImageAttributes, GdiPlusLinearGradientBrush, GdiPlusMatrix, GdiPlusObjects, GdiPlusPathGradientBrush, GdiPlusPathIterator, GdiPlusPen, GdiPlusRegion, GdiPlusSolidBrush, GdiPlusStringFormat, GdiPlusTextureBrush
  • win.tiko: ACLineStatus, AbbrevDayName, AbbrevMonthName, BatteryChargeStatus, BatteryFullLifeTime, BatteryLifePercent, BatteryLifeTime, CountryName, CurrencySymbol, DateSeparator, DayName, DecimalSeparator, DigitsGrouping, DisplayName, EnglishCountryName, EnglishCurrencyName, EnglishDisplayName, EnglishLanguageName, ExpandEnvironmentStrings, FileCopy, FileExists, FileScanA, FileScanW, FolderExists, ForwardSizeMessage, FreeEnvironmentStrings, GetAllMACAddresses, GetAllPhysicalMACAddresses, GetAvailablePageFile, GetAvailablePhysicalMemory, GetAvailableVirtualMemory, GetComputerName, GetComputerNameDnsFullyQualified, GetComputerNameDnsHostname, GetComputerNameNetBIOS, GetCurrentDirectory, GetEnvironmentStringsCount, GetEnvironmentVariable, GetFileCreationTime, GetFileDateTime, GetFileLastAccessTime, GetFileLastWriteTime, GetFileSize, GetLongPathName, GetMACAddressEx, GetMemoryLoad, GetPhysicallyInstalledSystemMemory, GetProcessorArchitecture, GetShortPathName, GetSystemInfo, GetTotalPageFile, GetTotalPhysicalMemory, GetTotalVirtualMemory, GetUserDefaultLocaleName, GetUserDomain, GetUserName, ISO3166CountryName, ISO3166CountryName2, ISO639LanguageName, ISO639LanguageName2, InternationalMonetarySymbol, IsCompressedFile, IsEncryptedFile, IsFile, IsFolder, IsHiddenFile, IsNormalFile, IsNotContentIndexedFile, IsOffLineFile, IsProcessElevated, IsReadOnlyFile, IsReparsePointFile, IsSparseFile, IsSystemFile, IsTemporaryFile, IsUserAdmin, LanguageName, ListItemsSeparator, LocaleName, LocalizedCountryName, LocalizedDisplayName, LocalizedLanguageName, LongDateFormatString, MakeDir, MonetaryDecimalSeparator, MonetaryGrouping, MonetaryThousandsSeparator, MonthDayFormatString, MonthName, Msg, NanString, NativeCountryName, NativeCurrencyName, NativeDigits, NativeDisplayName, NativeLanguageName, NegativeInfinityString, NegativeSign, OpenTypeLanguageTag, PermilleSymbol, PositiveInfinityString, PositiveSign, ProcessorsCount, RemoveDir, RemoveEnvironmentVariable, RenameFile, ScriptsList, ShortDateFormatString, ShortTimeFormatString, ShortestDayName, SortLocale, SortName, ThousandsSeparator, TimeFormatString, TimeSeparator, WindowsInstallDate, YearMonthFormatString

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do, and so does link static with the SDL packages: they use the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS it needs Homebrew's openssl@3. vendor/SDL3 linked dynamically on macOS needs Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf). tkEdit does not.

Download the macOS archive with curl

Download with curl, not a browser. A browser marks what it downloads, and macOS then refuses the unsigned compiler, tkEdit and the language server. An archive fetched with curl (or gh release download) carries no mark, so nothing needs clearing.

While the repository is private, a download needs a GitHub token with read access to it. gh auth token prints yours if you use gh; otherwise use a fine-grained token with Contents: read. In Terminal:

TOKEN=$(gh auth token)
curl -fL -H "Authorization: Bearer $TOKEN" -H "Accept: application/octet-stream" \
     -o tiko-macos-arm64-9b5bf78f.tar.gz \
     https://api.github.com/repos/PaulSquires/tiko-lang/releases/assets/696010473
shasum -a 256 tiko-macos-arm64-9b5bf78f.tar.gz
tar -xzf tiko-macos-arm64-9b5bf78f.tar.gz

The checksum should match the one in SHA-256 below. Once the repository is public, no token is needed:

curl -fLO https://github.com/PaulSquires/tiko-lang/releases/download/toolchain-9b5bf78f/tiko-macos-arm64-9b5bf78f.tar.gz

If you did download with a browser, clear the mark right after unpacking, before you run anything: xattr -dr com.apple.quarantine tiko-lang.

Use

Windows:

tiko-lang\tiko.exe hello.tiko -o hello.exe
tiko-lang\tkedit.exe

Linux:

tiko-lang/bin/tiko hello.tiko -o hello
tiko-lang/tkedit

macOS:

tiko-lang/bin/tiko hello.tiko -o hello
open tiko-lang/tkEdit.app

You don't need any environment variables: tiko finds its inc/, lib/ and pkg/ next to itself, tkEdit finds tiko next to itself or in bin/, and the language server uses the toolchain it is installed in.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with all seven sys/win modules. Every check passed, 16 on each host.
  • tkEdit was built by the packaged compiler on each host, and its GUI self-test drove the real window: Windows 617 passed, Linux (X11, under WSLg) 613 passed, macOS 613 passed, 0 failed on each. On Linux the first run failed 1 of 613, the known X11 timing flake, and a full repackage passed.
  • The language server was built by each packaged toolchain from tiko-lsp 15c2560, by that repository's release scripts: the whole suite, the dependency gates (Windows: only kernel32.dll and ucrtbase.dll; Linux: glibc 2.34 or older, only libc, libm and libtinfo; macOS: system libraries only, macOS 13.0 or later, signed), and one LSP session.
  • sys/win: all 639 programs in examples/win64, and the P...
Read more

tiko toolchains b2ac8cac (2026-10-28)

Choose a tag to compare

@PaulSquires PaulSquires released this 29 Oct 01:35

Prebuilt tiko toolchains, packaged by build/package.sh --verify from commit b2ac8ca on 2026-10-28.

Each archive has the compiler, the runtime (tiko-rt), the headers, the std, sys and vendor packages, fbcunit, the example programs in examples/, and the licence notices in licences/. MANIFEST.txt in each archive lists the full contents. The Windows and Linux archives also carry tkEdit in tkedit/. There are three archives: Windows, Linux and macOS (Apple Silicon).

What's new

  • vendor/tkControls on macOS. The controls' command keys are Cmd on a Mac, where Windows and Linux use Ctrl:

    • In the text box, Cmd+C, Cmd+V, Cmd+X, Cmd+A, Cmd+Z and Cmd+Y work, Cmd+Left and Cmd+Right move by word, and Cmd+Home and Cmd+End go to the ends. That is Ctrl's job elsewhere, not the Mac's own line-start/line-end.
    • In the list/tree, Cmd+click adds a row to the selection.
    • The calendar's Ctrl keys are Cmd keys on a Mac.

    tkCodeEdit already worked this way.

    • New TK_KMOD_PRIMARY (tkHost): the command modifier as an SDL mask. It is SDL_KMOD_GUI on macOS and SDL_KMOD_CTRL elsewhere, for your own key handling.
    • A tkCodeEdit call tip now has its border on macOS. On a Retina display it also fills its window, where it used to leave a one-pixel strip.
    • Every tkControls self-test passes on macOS: 34 suites.
  • tkEdit builds and runs on macOS. It shows Cmd for the Primary modifier, keeps its settings in ~/Library/Application Support/tkEdit, and runs a program in Terminal.app. It is still not in the macOS archive: build it from the tiko-lang sources with Homebrew's SDL3.

  • #cinclude / tiko c2t: a C type kind the importer does not know (clang 22's __size_t) now falls back to its builtin type instead of being refused.

Requirements

clang 18 or newer, which is not bundled. tiko uses clang to compile and to link. It uses the first of these that it finds:

  1. TKO_CLANG, if set
  2. Windows: C:\Program Files\LLVM\bin\clang.exe; Linux: /usr/bin/clang; macOS: /opt/homebrew/opt/llvm/bin/clang (Homebrew's, brew install llvm)
  3. clang on PATH, only if step 2 found nothing

The windows-x86_64 target does not need Visual Studio. #cinclude and tiko c2t on Windows do: they read the C runtime's and the Windows SDK's headers from the Visual Studio Build Tools.

macOS also needs Xcode's Command Line Tools (xcode-select --install): the macOS SDK, and Apple's linker, which every link uses.

std/tls on Linux needs OpenSSL 3 (libssl.so.3), which most distributions install by default; on macOS, Homebrew's openssl@3. vendor/SDL3 and vendor/tkControls on macOS need Homebrew's SDL3 (brew install sdl3 sdl3_image sdl3_ttf).

macOS: clear the quarantine before the first run. A browser marks what it downloads, and macOS then refuses the unsigned compiler. Measured: it hangs rather than failing, and clearing the mark afterwards did not release it. Clear it right after unpacking, before you run anything:

xattr -dr com.apple.quarantine tiko-macos

An archive downloaded with curl or gh release download is not marked.

Use

Windows:

tiko-windows\tiko.exe hello.tiko -o hello.exe
tkedit\tkedit.exe

Linux:

tiko-linux/bin/tiko hello.tiko -o hello
tkedit/tkedit

macOS:

tiko-macos/bin/tiko hello.tiko -o hello

You don't need any other environment variables: tiko finds its inc/, lib/ and pkg/ next to itself.

Verification

  • package.sh --verify compiled, linked and ran a program on every packaged target. It did the same with fbcunit, with vendor/sqlite3 linked statically and dynamically, with eleven of the std modules, and with sys/win: all seven modules on Windows, and elsewhere the check that importing it stops with its error. Every check passed, 16 on each host.

  • tkEdit was built by the packaged compiler on Windows and Linux, and its GUI self-test drove the real window. Windows: 616 passed, 0 failed. Linux (X11, under WSLg): 612 passed, 0 failed.

  • tkControls self-tests before packaging, at this commit:

    • macOS: all 34 suites, 5327 checks, 0 failed;
    • Windows: 34 of 34;
    • Linux: 66 of 68 runs on X11 and Wayland. The two misses were Wayland popup timing, and both passed on a rerun.

    tkEdit on macOS, built from the sources: 823 and 612 checks, 0 failed. From the macOS archive, with no TKO_* variables, tkCodeEdit's self-test passed 212 checks. Its 2 failures are one check that reads a file from the tiko-lang source tree, which an archive does not have.

  • Smoke test. Each archive was extracted into an empty directory and used with no TKO_* variables set, and compiled and ran a hello.tiko. On macOS this was done with an empty environment: a fresh HOME and PATH=/usr/bin:/bin.

  • Not run:

    • real key presses on a Mac: the self-tests send SDL events;
    • tkEdit on a Linux desktop outside WSL, and on Windows 10;
    • the macOS archive under a new user account, and on macOS 13 itself (tested on macOS 26).

SHA-256

d7447780392c42124b401a52199b556411c4cfe0b777c72c3ac7a9505b9856e8 *tiko-windows-x86_64-b2ac8cac.zip
09140ffc9202867f3c9a23ae8d60600f77632002d0251670f91729badfc27c51 *tiko-linux-x86_64-b2ac8cac.tar.gz
c28e1fa83d9a0ddcb48827e61e7a91d3abd08f28b45c3125e05ecacd2ce8545a *tiko-macos-arm64-b2ac8cac.tar.gz