twinBASIC Update: October 20, 2026
Highlights include the initial release of command-line tool tblaunch to support automated workflows and a preview of fafalone's forthcoming rich edit control.
On April 23, 2021, I helped Wayne Phillips introduce the world to twinBASIC at the Access DevCon Vienna conference. I boldly predicted that twinBASIC (along with the Monaco editor) would replace VBA and its outdated development environment by 2025. (And I was oh so close...) With that goal in mind, this weekly update is my attempt to keep the project fresh in the minds of the VBA development community.
Every Sunday Monday week, I will be providing updates on the status of the project, linking to new articles discussing twinBASIC, and generally trying to increase engagement with the project. If you come across items that should be included here, please leave a comment below.
Here are some links to get involved with the project:
- Custom twinBASIC IDE Installation Guide
- twinBASIC Discord Server (chat about the project)
- twinBASIC Documentation (list of new features not in VBx)
- GitHub Issue Tracker (report bugs)
Highlights
*Generated with Claude Opus 5.5
tblaunch: Build twinBASIC Projects Without the IDE
Until now, compiling a twinBASIC project meant running the twinBASIC IDE. Scripted builds, CI pipelines and AI agents had to drive the IDE itself, with no proper way to build without it.
That changed this week. Community member okas_o (the force behind much of the recent twinBASIC documentation overhaul) released tblaunch, a command-line tool that builds twinBASIC projects with no IDE involved. Wayne Phillips highlighted it in the General channel:
For those of you that might've missed it, @okaso has released an experimental tool that allows for proper CLI building of tB projects (without the IDE being attached)
What it is
tblaunch is written in twinBASIC itself. Rather than automating the IDE, it talks to the compiler directly. As okas_o describes it, it "does the fine dance needed to pretend to be an IDE without being an IDE."
It can compile, build and run a project from either a .twinproj file or a folder of exported source files. That second option is a step toward git-friendly twinBASIC development: you can build straight from the text files you keep under source control.
tblaunch build <project> [--arch win32|win64] [--out <dir>]
tblaunch run <tree|project>
tblaunch compile <project> [--json]
tblaunch export <project> <folder>
tblaunch import <project> <folder>
tblaunch ide [<project>]
Version 9.0 (October 18) also:
- builds in the
exportandimportcommands from okas_o's import/export tool; - adds a
--jsonoption that reports results in a form other tools can read; - can open the twinBASIC IDE itself.
What problem it solves
Anything that needs a twinBASIC build without a person at the keyboard: build scripts, automated tests, continuous integration and AI coding tools.
Ben Clothier (bclothier) noted that AI-assisted workflows need a "write-import-build-run" loop and suggested merging tblaunch with the import/export tool as "the foundation for a proper MCP server." okas_o agreed.
tblaunch is also the piece okas_o's peloader project will launch to build twinBASIC projects on Linux. peloader runs the Windows twinBASIC compiler there without Wine. It is not released yet, but okas_o reports it already hosts the compiler under WSL.
How to get it
tblaunch is not on the twinBASIC website yet. For now it is distributed through the twinBASIC Discord server:
- In the #docs channel, download
tblaunch-9.0.twinprojfrom okas_o's October 18 post. - Open it in the twinBASIC IDE and build it for both 32-bit and 64-bit.
- Use the build that matches the project you want to compile: 32-bit tblaunch for win32 projects, 64-bit for win64.
- Run
tblaunchwith no arguments to see its usage reference.
okas_o calls it "rough around the edges, and in continuous development," so treat it as an early preview, not a finished tool.
ucRichEditD2D: Modern Rich Text Editing for twinBASIC
fafalone is building ucRichEditD2D, a rich text editor UserControl for twinBASIC. This week he showed off an unexpected party trick:
ucRichEditD2D will accept MathML input like from the system Math Input Panel and display it as an equation, even with regular msftedit

In other words, write an equation with Windows' built-in Math Input Panel, and the control displays it as a properly typeset formula.
Why build another rich text control?
The standard edit control is decades behind what users expect from a text box today. As fafalone put it:
I think people expect color font support these days, and this is the easiest way to get it in tB without a proprietary 3rd party control, if they even exist
The control is built on the Windows RichEdit engine (msftedit), rendered through Direct2D. That combination is what makes color fonts possible: msftedit only supports them in windowless mode, which a conventional windowed RichEdit control can't use.
Once it's finished, fafalone says twinBASIC "will have an edit control you can drop in with":
- Color fonts, including color emoji, even when printing
- Built-in spellcheck in any installed language. Windows doesn't attach spellchecking to edit or RichEdit controls automatically, so he wrote his own implementation.
- Auto-linkified URLs
- Basic table support
- MathML equations, with a friendlier typed format such as
x=((-b+-sqrt(b^2-4ac))/2aon his to-do list
Because it is a UserControl, it can also go on a VBA UserForm when ActiveX is enabled. He has already built a ColorFontLabel that works in VB6 and VBA.
Status
It is not released yet. fafalone says he is "about done with adding features" and has moved on to cleanup and testing. The demo app will be "basically a full wordpad," complete with a ribbon, table options and zoom.
For the curious, okas_o pointed out that the same quadratic formula takes a single line of TeX, x = \frac{-b \pm \sqrt{b^2-4 a c}}{2a}, instead of a screenful of MathML. fafalone found that TeX input works only with the Office version of RichEdit (riched20.dll), not the version built into Windows (msftedit).
Discord Chat Summary
* Auto-generated via Claude Sonnet 5.5
Overview
This week's General and Docs channels centered on compiler hardening, IDE and LLVM settings feedback, a new Detours package, and a fast-moving documentation overhaul from okas_o. fafalone's MathML-capable rich edit control drew the biggest community response in General. In Docs, okas_o's tblaunch command-line builder, the experimental peloader (Linux compilation) and verifiable, test-backed documentation stood out. Engagement was high across both channels, with frequent BETA releases and many small iterations.
Compiler Fixes & Language Behavior
- waynephillipsea says TwinSight identified an IDE/backend timing bug that caused
[BUILD] failed due to licence error. The fix ships in the next release, and restarting the compiler works around it until then. - waynephillipsea confirms that building an HKLM ActiveX control from an un-elevated IDE reports a misleading "BUILD failed" when only registration fails. He proposes launching an elevated instance to register the control automatically.
- A 64-bit LLVM build can crash when a
ByRef ... As LongAPI parameter receivesByVal 0&. waynephillipsea saysAs AnywithByVal vbNullPtrworks,Optionalpasses a temporary variable instead, and he will harden the codegen. WithEventson arrays works, but the event can't yet tell which element fired. Members favor a leadingIndexargument like VB6 control arrays, and waynephillipsea says it was skipped only because he didn't need it.Class ClassA WithEvents MyArray() As ClassB Private Sub MyArray_MyEvent() ' fires, but the element index isn't available yet End Sub End Class
IDE, Settings & LLVM
- Feedback on the new Project Settings dialog asked for wider text boxes (build output path, Project Id, Fusion/Export path). waynephillipsea will address them in the next release, and COM references can now be dragged into position.
- For LLVM optimization flags, fafalone requested an "all on" option. waynephillipsea proposes a "match to host" option that detects the current CPU, plus presets per CPU generation after he researches instruction sets. Output built that way will crash on older CPUs, so a startup capability check is planned eventually.
- waynephillipsea says macro recording is "a v2 thing for sure," though the command-driven IDE would make most of it fairly easy.
- BETA 1008 now preserves docked state when importing
.vbpfiles. Docking several external controls in sequence still loses their order. - waynephillipsea removed a description-less package from the list, and TWINSERV will enforce a minimum description length.
Packages, Static Linking & Interop
- waynephillipsea released a statically linked Detours package, based on SlimDetours (experimental/beta). It requires BETA 1006 to fix an x64 crash in compiled executables, and okas_o has since documented it.
- Static linking currently works only for libs that don't depend on the C runtime. The compiler provides just a minimal set of built-ins such as
memsetandmemcpy, which is why sqlite's amalgamation and SlimDetours link and arbitrary projects usually don't. - fafalone explains that WinDevLib (v9.5.746) leaves out
hWnd,LRESULT,WPARAMandLPARAMaliases. The package aliases only C types with restricted value ranges, such asBOOL, and usesLongPtrfor generic handles. He also confirms that.tlbtypelibs work like VB6, though his oleexp.tlb is 32-bit only. - VanGoghGaming extended the WinRT package with
mdlMetaDataLocator, which recursively resolves parameterized type IIDs. A test result matched MagnumDB.
Rich Text, XAML & VBA/Excel
- fafalone's ucRichEditD2D (in development) accepts MathML input and renders it as an equation, even with regular msftedit. It also offers color fonts, manual spellcheck in any installed language, auto-linkified URLs and basic tables.
- Limits: TeX input needs riched20.dll rather than msftedit, and Office's riched20 renders badly through Direct2D. VanGoghGaming shows that XAML controls can rotate via
RenderTransformand that XAML spellcheck works out of the box. - XAML Islands can run on Excel UserForms with a manifest change. bclothier notes that this needs admin rights, which locked-down corporate environments rarely allow.
- In VBA, a Frame control (which has an hWnd) stands in for the missing PictureBox, according to kayjaydubya. tB's Frame, like VB6's, has no Resize event.
Documentation Platform & Content
- okas_o's docs now show which tB and package versions each note or warning was tested against. Downloads and run-time error reference pages are live, and he proposes splitting the docs into three books so they build in parallel.
- Public test suites tied to documentation paragraphs now exist for contributed packages, and many fail, which shows where the docs are "forward-looking." gcuser99's tbRegExp v1.9.0.0 PR failed the new check on stale v1.8.0.0 references, and okas_o acknowledged the contributor instructions were unclear.
- BigNumberLib is promoted from Experimental to Contributed. waynephillipsea welcomes the test effort if it improves package quality.
- Community feedback produced fast changes:
- Built-in data types now have a Data-Types reference page.
- A new
Class_InitializeversusSub Newsection was added. Only one runs, depending on how the object is created. - Per-method "Common Errors" tables are in production, starting with the Strings module, and they are exposing tB-versus-VB6 error differences that waynephillipsea is fixing.
- Requested
KeyCountHintdocs are in progress.
Dim obj As New Class1 ' Class_Initialize runs Dim obj2 As New Class1(42) ' parameterized Sub New runs
Command-Line Tooling, Peloader & IDE Protocols
- tblaunch (experimental, written in tB) builds projects without an IDE by talking directly to the compiler. It supports
.twinprojfiles and exported folders, includes full impexp syntax, can launch the IDE, and now ships with a changelog at waynephillipsea's request. bclothier suggests merging impexp and tblaunch as a foundation for an MCP server, and okas_o agrees. - peloader (unreleased, experimental) runs the Windows tB compiler on Linux without Wine or glibc. It reimplements 557 Windows functions in about 50k lines of C and verifies behavior against recordings from real Windows. Its exes match Windows builds byte for byte across about 130 test projects. It already hosts the compiler under WSL, and okas_o expects about a week of cleanup.
- waynephillipsea says the JSON-over-websocket IDE protocols (root, filesystem, language, debugger) will move to a binary format soon and already deviate from standard LSP/DAP. They stay officially undocumented for now, but he is fine with imojenisys reverse-engineering them, and imojenisys is connecting HexIDE to tB.
- waynephillipsea shared the full list of tB warning and error codes, and
ERROR_MissingImplementationis internal.
Conclusion
This week brought concrete fixes (the licence-error timing bug and elevated registration), a new Detours package, and hardening plans for LLVM ByVal 0& handling. Documentation became test-backed and error-aware, and that work is surfacing real VB6 differences. The command-line tooling is maturing quickly, with tblaunch now available as an early preview and peloader pointing toward Linux builds. Ahead are the binary IDE protocol, CPU-preset options for LLVM, and v2 features such as macro recording. The community also remains active on rich text and VBA integration.
Around the Web
tbBlob: Generate twinBASIC Bindings for C Libraries
Posted in show-and-tell by bclothier:
Makes writing FFI slightly easier.
From the project's README, tbBlob "generates twinBASIC bindings for a C library from its header files": Declares, Types, Enums, Delegates and constants. "One generated source works as both win32 and win64." It parses the headers with CastXML, writes .twin source files you add to your project, and produces a report.md listing anything that couldn't be expressed in twinBASIC. It requires Visual Studio 2022 (or its Build Tools) with the C++ workload.
libgit2tB: Git as a Library
bclothier also posted the first package built with it:
There's a package available if you'd rather use git as a library than as a command line. Made with tbBlob.
According to the tbBlob README, its bindings were tested against all of libgit2 1.9.1 (960 functions). They compile for both 32-bit and 64-bit, the struct layouts match C's, and a git workflow and a clone with callbacks both ran through them.
Changelog
Here are the updates from the past week. You can also find this information by visiting the GitHub twinBASIC Releases page.

AI-Generated Changelog Summary
* Auto-generated via Claude Sonnet 5.5, sorted in order of its opinion of "most impactful changes."
- Revamped project settings dialog (1015): The project settings dialog has been redesigned. Text input widths were tweaked in 1016.
- Better form designer and control support:
- All controls now have a
DockOrderproperty for finer control of docking priorities (1006). ImportingAlignsettings from a VBP was corrected in 1006 and 1012. - The property sheet now supports Currency, Decimal and Variant types (1007).
- Individual properties can now be linked to their own PropertyPage (1008).
- AX host wrapper now stops events reaching user code after
FreezeEventsis issued (1006).
- All controls now have a
- New language and runtime features:
- New
vbPtrSizeconstant that adapts to the current architecture (1010). - New
BinandBin$functions to complementHexandOct(1010). - New
${Bitness}variable for project settings such as the build output path (1010).
- New
- New DetoursLib package (1006): A statically linked Detours library based on SlimDetours (MIT licence).
- Better IDE tooling and diagnostics:
- Compilation errors now point you to the Diagnostics panel when a definite error is already listed (1007).
- A missing PropertyPage is now reported as a proper compilation error, TB5259, instead of a debug console message (1008).
- New command line options for the IDE:
--no-update-recent-files,--no-save-ide-settingsand--reset-ide-settings(1007). - Intellisense and LLVM code generation were refined (1013).
- Compiler and VB6 compatibility fixes:
- Static linked libraries such as SQLite no longer crash on Win64 executables (1006).
- Enum members in generated type libraries now follow the declared order, and an explicit
EnumIdis included (1009). - Several compiler crashes were fixed, including ones involving the MS Script Control in 64-bit mode and invalid
RunBeforeStartupObjectuse (1009, 1010). ReDimwith an upper bound below the lower bound now raises error 9, as in VB6 (1017).- Issues with returning enhanced UDT types from functions were fixed (1016).
WARNING: The following issues are present in each of the releases below:
- IMPORTANT: This is a BETA release under active development. It is not recommended for production use.
BETA 1006
- fixed: invalid message in the DEBUG CONSOLE '[BUILD] failed due to licence error. Please try again.' [ yereverluvinunclebert, discord ]
- fixed: AX controls with non-default Align property were not importing properly from a VBP [ Saturnian, discord ]
- fixed: AX host wrapper now forcefully prevents events from propagating through to user code when FreezeEvents has been issued to an AX control
- added: DockOrder (Long) property to all controls, for finer control of docking priorities
- tweaked: MarkDown preview formatting for <pre> blocks and <a> links
- new: package DetoursLib (statically linked Detours library based on SlimDetours, MIT licence, see README.md in package)
- fixed: some static linked libraries (e.g. SQLITE) crash on Win64 when compiled to an executable
BETA 1007
- improved: 'COMPILATION (CODEGEN) ERROR AT LINE #' breakpoint now reads 'COMPILATION ERROR DETECTED. CHECK THE DIAGNOSTICS AT LINE #' when there is a definite compilation error already listed in the diagnostics panel [ Gary Miller, discord ]
- fixed: insufficient contrast between VariablesPanelHoverTooltipBackColor and the foreground color in the dark theme [ GrandPaM, discord ]
- added: support for Currency, Decimal and Variant types in the form designer property sheet for control properties [ fafalone, discord ]
- improved: Removed unnecessary metadata from data URIs embedded in our IDE CSS files [#2511]
- added: support for command line option '--no-update-recent-files' to the twinBASIC IDE [#2510]
- added: support for command line option '--no-save-ide-settings' to the twinBASIC IDE [#2510]
- added: support for command line option '--reset-ide-settings' to the twinBASIC IDE
BETA 1008
- improved: 'Failed to find named PropertyPage' error no longer prints in the DEBUG CONSOLE, and instead is reported as a proper compilation error TB5259
- added: IDE support for per-property PropertyPage associations, allowing individual properties to invoke their linked PropertyPage via the designer property sheet [ Arrow Loop, discord ]
BETA 1009
- fixed: ordering of Enum members in generated type libraries was reverse of the declared order [ Krool, discord ]
- improved: if an explicit EnumId attribute is set on an Enum, it now gets included in the type library generation [ Krool, discord ]
- fixed: invalid use of RunBeforeStartupObject attribute would cause a compiler crash during build [#2517]
- fixed: missing diagnostic 'class modules cannot expose public fixed-arrays' in some instances, and leads to potential compiler crash [#2521]
BETA 1010
- fixed: compiler crash when opening a project that references the MS Script Control when opening in 64-bit mode [#2523]
- added: constant vbPtrSize context-aware based on the current architecture [ Krool, discord ]
- added: ${Bitness} variable for use in project settings such as the build output path [ Krool, discord ]
- added: VBA.Conversion.Bin$(x) and Bin(x) functions to complement existing Hex/Oct [ fafalone, discord ]
BETA 1011
- fixed: (regression) root package symbols erroneously showing up in intellisense lists where they shouldn't
- fixed: some compiler crash restarts involving intellisense
BETA 1012
- fixed: corrections to Align -> DockOrder property when importing a VBP [ Saturnian, discord ]
BETA 1013
- improved: some LLVM refinements for missing/previously unsupported codegen
- improved: some intellisense tweaks
BETA 1014
- fixed:edge case logic bug involving Byte to Boolean comparisons [ axisdj, discord ]
BETA 1015
- improved: revamped the project settings dialog [ AI ]
BETA 1016
- improved: tweaked the new project settings dialog text input widths [ Krool, discord ]
- fixed: some issues around returning enhanced-UDT types from functions [ VanGoghGaming, discord ]
BETA 1017
- fixed: built-in IDE themes DiagnosticsGroupFontSize/DiagnosticsGroupFontWeight being ignored [#2529]
- fixed: recursive inheritance in IDE theme files would cause IDE issues [#2526]
- fixed: [RunAfterBuild] property edge cases [#2516]
- fixed: WebView2 IEnumVARIANT::Reset implementation to fix issue with Clone [#2531]
- fixed: ReDim with an upper bound below the lower bound raises E_FAIL where VB6 raises error 9 [#2524]

