TypeScript-like syntax. C++ runtime.
ThicketScript compiles directly to bytecode for a C++ VM. No JavaScript, no V8, no transpilation. Write .tks files with full IDE support; the runtime handles the rest.
ThicketScript is a scripting language with familiar TypeScript-style syntax and its own .tks file extension. It compiles directly to bytecode for a C++ VM, skipping JavaScript entirely. Dedicated language plugins for JetBrains and VS Code provide autocomplete, type checking, and go-to-definition.
The language is designed for game logic, UI scripting, editor tooling, modding, and server-side scripting. It has first-class structs, series and parallel for cleaner async code, workers for thread-level concurrency, built-in reactive state (Signal, Ref, computed), and 22 easing curves for animation.
ThicketScript integrates with the Dev Thicket ecosystem; Willow for 2D rendering, with shared Heartwood utilities built into the runtime. Willow is optional; the language works without it.
Dedicated language plugins for JetBrains and VS Code give you autocomplete, type checking, go-to-definition, and error highlighting. First-class tooling from day one.
No JavaScript anywhere in the pipeline. Source goes in, optimized bytecode comes out. Types are checked at compile time, not at runtime. The result is fast startup, low memory use, and smooth frame rates.
ThicketScript is a library, not a platform. It does not own your main loop, manage windows, or assume it is the only thing running. Link it into your C++ app, register your own functions, and control execution step by step. The tks CLI is itself just a thin wrapper around the same runtime.
Scripts start with zero access. No filesystem, no network. You opt in to exactly what scripts can do. Stack overflows, infinite loops, and out-of-memory are caught and reported; the host app keeps running, even when scripts misbehave.
The standard library covers Math, collections, reactive state, HTTP, TCP, WebSocket, UDP, database (SQLite, MySQL, Redis), filesystem, crypto, compression, shell, environment, terminal I/O, Bitmap, and DateTime. No package manager. No node_modules. Everything you need to build real tools is already there.
If your team already knows TypeScript, ThicketScript has almost no learning curve. Same syntax, same patterns: classes, generics, destructuring, async/await, template literals. What you lose is the JavaScript ecosystem overhead. What you gain is a fast C++ VM, static dispatch, and a language designed for embedding rather than the browser.
What you can do with tks and nothing else.
Build scripts, file processing, code generation. tks run app.tks and you are done.
HTTP servers, API endpoints, background workers. Built-in system.http and system.net modules.
Task runners, data pipelines, deployment scripts. Same language whether you are scripting or building.
Resize, crop, filter, and composite images in script. Decode PNG, JPEG, WebP, Aseprite, and more; apply filters and transforms; encode to any supported format.
Add Willow or Willow UI.
Build games with Willow's scene graph, sprites, cameras, and input handling.
Menus, HUDs, inventory screens, dialog systems. Build with Willow UI's component library while the host renders at native speed.
Level editors, asset browsers, debug tools. Same language your game uses, so tools share types and code.
Link the runtime into any C++ application.
Script gameplay, AI, and events in your own engine. The sandbox keeps scripts from breaking things.
Let players write mods in ThicketScript. Grant only the permissions you want; asset loading yes, filesystem no.
Event handlers, world rules, admin tools. Run game logic on the server with full access to the ThicketScript runtime.
Structs are first-class value types that live on the stack, not the heap. No garbage collection, no allocations. Fields use typed numerics like float32 and uint8 for compact memory. Define methods and operator overloads directly on the struct.
Primary types are int, uint, and float. Sized variants (int8, int16, int32, uint8, uint16, uint32, float32, float64) give explicit control in struct fields. A Color with four uint8 fields is 4 bytes, not 32.
Use series and parallel as function modifiers or scope blocks. series awaits every async call automatically. parallel runs everything at once and waits for the last one to finish. Nest scope blocks however you want.
Mark any function as async worker to run it in a separate thread with full VM isolation. Arguments and return values are deep-copied automatically. No shared state, no races, no locks.
Serialize concurrent calls to the same resource with async mutex. Use $ parameters as lock keys for fine-grained control; different keys run in parallel.
Built-in tweening with 22 easing curves. Plus smoothstep, snap, wrap, moveTowards, and fract for frame-rate-independent game logic.
Built-in Signal, Ref, and computed for reactive programming. Ref tracks value changes and notifies subscribers. computed derives state lazily. No external library needed.
Run cleanup code when a scope exits, no matter how it exits. Works with return, throw, break, and continue. Multiple defers run in reverse order, like Go.
The dump() function accepts multiple arguments and prints each value alongside its variable name, captured at compile time. No string labels, no manual formatting.
And so much more.
| ThicketScript | Lua | V8 / Node | Wren | |
|---|---|---|---|---|
| Static Types | ✓ Built-in | × Third-party (Teal) | ✓ TS layer | × |
| IDE Plugins | ✓ JetBrains, VS Code, Neovim | ✓ Community | ✓ Built-in | × |
| Direct C++ Linking | ✓ | ✓ C API | ✓ Complex | ✓ C API |
| Value Types / Structs | ✓ Stack-allocated | × | × | × |
| async/await | ✓ + series/parallel | ✓ Coroutines | ✓ | ✓ Fibers |
| Thread Workers | ✓ async worker | × | ✓ Worker threads | × |
| Reactive State | ✓ Signal, Ref, computed | × | ✓ Third-party | × |
| Built-in Tweening | ✓ 22 easing curves | × | × | × |
| Embedder Sandbox | ✓ Fine-grained capabilities | × Manual only | × Runtime isolates | × |
| Host GC Control | ✓ Collect on demand | ✓ Incremental stepping | × | ✓ |
| Built-in DB Drivers | ✓ MySQL, Redis, SQLite | × | ✓ Third-party | × |
| Bitmap / Image API | ✓ Built-in (CPU) | × | ✓ Third-party | × |
ThicketScript is a scripting language compiled to bytecode for a purpose-built C++ VM. You write .tks files with dedicated IDE support (JetBrains and VS Code). There is no JavaScript transpilation, no V8, and no intermediate language. The runtime is designed for embedding in C++ applications; games, editors, servers, tools.
We wanted to live in TypeScript-like syntax for day-to-day game logic and app logic, without writing C++ for everything. C++ is great for the engine and libraries underneath, but scripting on top of that should feel lightweight and familiar. ThicketScript gives you that comfortable syntax while compiling to bytecode for a C++ VM, so you get the best of both worlds.
No. ThicketScript is its own language with its own compiler, VM, and .tks file extension. It does not use the TypeScript compiler, libraries, or ecosystem in any way. That said, the syntax is heavily inspired by TypeScript; roughly 80% of TypeScript syntax works in ThicketScript as-is. It removes some TypeScript features and adds new ones: first-class structs with operator overloading, series and parallel as function modifiers and scope blocks for async control flow, compact numeric types (float32, uint8, int32), and dump() with compile-time variable name capture. Dedicated IDE plugins for JetBrains and VS Code provide full language support.
Both are embeddable scripting languages with stack-based VMs and mark-and-sweep GC. ThicketScript has static type checking, async/await, classes, and dedicated IDE plugins for JetBrains and VS Code. Lua is smaller and more mature. ThicketScript has a richer type system, a stricter default posture, and a broader standard library.