Frequently asked questions about ThicketScript.
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.
V8 is a general-purpose JavaScript engine with decades of JIT optimization. ThicketScript is a purpose-built bytecode VM. ThicketScript wins on startup time, memory footprint, embedding simplicity, and predictable latency; no JIT warmup, no GC pauses in your frame loop (with host-controlled GC stepping). V8 likely wins on raw compute throughput for long-running workloads. ThicketScript has no eval, no prototype chain, no this rebinding, no implicit coercion.
The runtime starts with zero capabilities. No filesystem, no network, no child processes. The host application opts in to specific capabilities via permission flags; fs_read, fs_write, net_http, net_tcp, crypto_hash, and others. A game embedding ThicketScript for modding can grant access to asset loading but deny everything else. Bytecode is validated before execution. Array access is bounds-checked. No raw pointers are exposed to scripts. Malformed .tbc files cannot corrupt the runtime.
There is no node_modules and no npm ecosystem. ThicketScript ships built-in system modules for the things you would typically reach for packages for: filesystem (fs), HTTP (http), crypto (crypto), path handling (path), compression (zlib), networking (net, udp), and WebSockets (ws).
The host application keeps running. Stack overflows, infinite loops (instruction count limits), out-of-memory conditions, and null dereferences are all caught and reported as runtime errors. The embedder receives error callbacks and decides how to respond. The runtime is designed so that no script error, and no internal VM error, can take down the host process.
Yes. The language runtime is a standalone C++ library with no dependencies on Willow. The tks CLI runs scripts in headless environments with no GPU or display server required.
The core VM and compiler have zero external dependencies beyond the C++ standard library. System modules pull in focused libraries: libuv for async networking, MariaDB Connector/C for MySQL (with OpenSSL for TLS), hiredis for Redis, and SQLite (amalgamation) for embedded databases. Database drivers are optional build flags. All dependencies are statically linked; there is nothing to install at runtime.
Link the thicketscript library into your C++ application. Create a VM instance, register native functions with define_native(), expose objects with define_global(), and call execute() to run a script. For frame-loop integration, use step_instructions(budget) to run bounded work per frame and gc_step(budget_us) to control GC timing. The embedder API gives you instruction limits, memory ceilings, and call-depth caps with callbacks.
Development (the tks CLI, type checking, compilation) runs on Windows, macOS, and Linux. The language runtime itself is portable C++ and builds anywhere with a conforming C++ compiler.
The ThicketScript language runtime (VM, compiler, parser, type checker, GC, standard library, and embedder API) will be open source and free to use in both personal and commercial projects.
ThicketScript is in active development. There is no fixed release date. Follow the changelog on this site for progress updates.