Repository navigation
Releases
tiko 0.1.4 — toolchains 3ca5ef67 (2026-11-11)
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 --versionprintstiko 0.1.4and__TIKO_VERSION__is"0.1.4". tkEdit is 0.1.4 too. -
Time zones by name:
std/tzandstd/tzdata.TimeZone.FindById( "Europe/Paris" )finds any IANA zone, with its history, andZonedDateTimeis a moment in a zone:AddCalendarDaysand its siblings keep the wall-clock time across the clock changes, whileAddadds elapsed time.WithZoneSameInstantandWithZoneSameLocalchange the zone.StartOfDaygives 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
Disambiguationpolicy (dzCompatible,dzEarlier,dzLater,dzReject), andMapLocaltells you which case you have. - ISO text carries the zone:
2025-07-04T12:00:00-04:00[America/New_York](RFC 9557), with anOffsetPolicyfor text whose offset no longer matches its zone. Patterns gainVV(zone id) andv(abbreviation).
On Linux and macOS
std/tzreads 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 missingUS/Eastern. On Windows,TimeZone.Localnow reports the machine's IANA id through the Unicode CLDR table. The embedded database is refreshed with each toolchain release; between releases,$TZDIRcan point at newer zone files. -
std/chronotime-zone fixes.AddCalendarDays,AddCalendarMonthsandAddCalendarYearsno 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/DaylightNameno 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
.tkformon 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,.tkthemefiles) and translatable captions. -
tkControls for the designer:
- Anchor and Dock layout (
tkLayout) and a form base (tkForms); - five new controls:
tkLabel,tkPanel,tkGroupBox,tkPictureandtkTabControl; - control metadata, and themes with scopes, recipes, named styles and shape, which
tkTheme_Loadreads from a.tkthemeat run time.
- Anchor and Dock layout (
-
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 typeandpartial classspread 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 shareddynamic arrays link across modules;cast( string, udt )is typedSTRINGwhen the type declares that cast;- a narrow string slice no longer reaches a C-string reader unterminated, and
select caseover 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,ChoiceArrayandChoiceDequefor 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:
TIKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, with all sevensys/winmodules, 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/tzandstd/tzdatatests 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...
tiko 0.1.3 — toolchains 7515ba56 (2026-11-08)
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 --versionprintstiko 0.1.3and__TIKO_VERSION__is"0.1.3". tkEdit is 0.1.3 too. - String slices.
slice,usliceandwsliceare zero-copy views of astring,ustringorwstring(and of fixed-length strings andzstring/wstringpointers), writtens[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 aconstslice 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 intype X as viewtypes); 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/stringsgainsFind,Equals,StartsWith,EndsWith,TrimStart,TrimEnd,TrimSpaceand aSplitSlicesiterator over slices, in all three widths. - Interfaces and classes.
interface,class,implementsandinherits; calls through an interface, conversions,trycastandis, interface properties, generic interfaces, and interfaces as generic constraints. - Properties. Auto-properties,
get/setblocks, any number of indices,staticand namespace properties. A property passedbyrefis written back through its setter, andswap,@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
-gand runs to it, and F10 / F11 / Shift+F11 step. It drives LLVM'slldb-dap(see Requirements). -gnames a type the way its declaration does (as int64shows asint64in a debugger, notlongint). On macOS,-gnow gathers the debug information into<program>.dSYM.- Environment variables are
TIKO_*.TIKO_INCLUDE,TIKO_LIBPATH,TIKO_PKG,TIKO_CLANG,TIKO_MODCACHEand the rest. The oldTKO_*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
-dlllinks without amain. - Now refused at compile time, where tiko used to accept them or fail inside the compiler: a
constinitialiser that reads a variable or calls a procedure (TKO0605); a second genericsuborfunctionof 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/uboundof something that is not an array (TKO1023);spawnof 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, propertyset/end set, and theTIKO_PKG/TIKO_INCLUDEvariables.
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:
TIKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, with all sevensys/winmodules, 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 onlytiko-lang/, with tkEdit at its top andtiko-lspnext to the compiler, answering--version. The macOStkEdit.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)
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 --verifyon 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 underenv -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)
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 --versionprintstiko 0.1.2and__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 asthis.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-tdoes 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_menuinsettings.tomlremembers 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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and with all sevensys/winmodules. 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 onlytiko-lang/, with tkEdit at its top andtiko-lspnext to the compiler, answering--version. The macOStkEdit.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)
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 --versionprintstiko 0.1.1and__TIKO_VERSION__is"0.1.1", with no-devsuffix. 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 withTRUEand 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, , 4now 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 awstring * Nbuilt fromwchrcodes 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 findsllvm-ar-18beside it, andTKO_ARnames the archiver if it is set. A missing archiver is now TKO0111 with its path, instead ofTKO0115 archiving failed (exit -1). This affected-libbuilds withTKO_CLANG=/usr/bin/clang-18on Debian and Ubuntu. - Linux binaries.
tiko,tkeditandtiko-lspno 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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and with all sevensys/winmodules. 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 onlytiko-lang/, with tkEdit at its top andtiko-lspnext to the compiler, answering--version. The macOStkEdit.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)
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/winfixes:- Resource leaks:
CIOpenSaveFile's name getters free the shell's string,DSafeArray's string getters free theBSTR,CRichEditCtxfrees the printer DC and releases its OLE storage,CXpButtondestroys icons withDestroyIcon, and the GDI+ procedures shut GDI+ down on every path. CRichEditCtx.ExGetSelreturnscpMax(it wasbyval);RichEdit.SetTextModepasses its flags in the right parameter; the TOM interfaces'GetIDsOfNamesslots have the right signature.Edit.GetCueBannerTextandCombo.GetCueBannerTextreturn the text without its trailing padding, or""when there is none;Combo,Editandwintext getters return exactly the text.- The WIC functions (
WICConvertBitmapSourceand five more) are imported fromWindowscodecs.dll, where they live, notd2d1.dll. CMaskedEditpasses the repeat count and scan code the right way round.
- Resource leaks:
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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and with all sevensys/winmodules. 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 thissys/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 andstdthis release keeps unchanged. It passed that repository's release gates: the whole suite, the dependency gates (Windows: onlykernel32.dllanducrtbase.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 onlytiko-lang/, with tkEdit at its top andtiko-lspnext to the compiler, answering--version. The macOStkEdit.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)
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 --verifyon 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), andvendor/sqlite3linked 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 ranhello.tiko, and itstiko-lspanswered--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)
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: fasterMapandSet.- 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. PutandAddcopy the key and value only when the table is about to grow.Removeshifts 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
mainwith 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.GetLineandCRichEditCtx.GetLineoverran the heap on long lines.ComboandListBoxCalcHorizontalExtentwrote 2 bytes past each item's buffer.- A
byref as wstringproperty setter takes the wide encoding;p->P( i ) = v,(*p).P( i ) = vand a byref receiver reach the setter; memberoperator @on an imported type is a member call;space( )andstring( )widen for awstring ptrparameter;{ obj, ... }into a pointer array stores each object's cast. - The
tpadexample 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 alwaysTKO0997, 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
HashOfoverloads are the identity (MapandSetdo the mixing). A user type that combines field hashes with a plainxorshould mix one side withcontainers.HashInt, or(2, 0)and(0, 1)hash alike.Map/Setiteration order changes, as before it was unspecified. sys/win:Combo.GetEditSelandDTP.SetFormatareFUNCTIONs.
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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and with all sevensys/winmodules. 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/containersand 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.dllanducrtbase.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 onlytiko-lang/, with tkEdit at its top andtiko-lspnext to the compiler, answering--version. The macOStkEdit.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)
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-lsp0.1.2 sits next to the compiler, so atikoon yourPATHputstiko-lspthere too. With no toolchain option, it uses the toolchain it is installed in. Its licence islicences/LICENSE-tiko-lsp. sys/win: José Roca's update.CPrint(sys/win/gui), a printing class, with an example inexamples/win64/CPrint Examples.SetRenderingPolicy( hwnd, policy )sets the DWM non-client rendering policy of a window.Edit.SetLeftMarginForDpiandEdit.SetRightMarginForDpiscale the margin for the window's DPI.examples/win64: the GDI+ examples are.tikosources now. All 639 programs inexamples/win64compile 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 astdmodule (directly, or throughvendor/SDL3) no longer fails withTKO0406on names such asSEEK_SET.- Fixes:
- tiko-rt:
SLEEPreleases the runtime's I/O lock before it sleeps, as fbc does. Before, one thread'sSLEEPheld up every other thread's console output andSLEEPfor its whole length. sys/winreports that it is Windows-only when it is imported for another target, rather than failing inside a C runtime header.- The Windows
tkedit.exehas a version resource.
- tiko-rt:
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,SurrogatePairToCodePointcom/DVARIANT.tiko:VariantMsgcom/com.tiko:Guidgdiplus/GdipObj.tiko:GdiPlusAdjustableArrowCap,GdiPlusBitmap,GdiPlusBrush,GdiPlusCustomLineCap,GdiPlusEffect,GdiPlusFont,GdiPlusFontFamily,GdiPlusGraphics,GdiPlusGraphicsPath,GdiPlusHatchBrush,GdiPlusImage,GdiPlusImageAttributes,GdiPlusLinearGradientBrush,GdiPlusMatrix,GdiPlusObjects,GdiPlusPathGradientBrush,GdiPlusPathIterator,GdiPlusPen,GdiPlusRegion,GdiPlusSolidBrush,GdiPlusStringFormat,GdiPlusTextureBrushwin.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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and with all sevensys/winmodules. 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.dllanducrtbase.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 inexamples/win64, and the P...
tiko toolchains b2ac8cac (2026-10-28)
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/tkControlson 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 isSDL_KMOD_GUIon macOS andSDL_KMOD_CTRLelsewhere, 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:
TKO_CLANG, if set- Windows:
C:\Program Files\LLVM\bin\clang.exe; Linux:/usr/bin/clang; macOS:/opt/homebrew/opt/llvm/bin/clang(Homebrew's,brew install llvm) clangonPATH, 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 --verifycompiled, linked and ran a program on every packaged target. It did the same with fbcunit, withvendor/sqlite3linked statically and dynamically, with eleven of thestdmodules, and withsys/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 ahello.tiko. On macOS this was done with an empty environment: a freshHOMEandPATH=/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