twinBASIC Update: October 13, 2026
Highlights include a tour de force of documentation improvements and a free 2D MMORPG Maker built with twinBASIC.
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
twinBASIC Help Add-in from okaso
Greatness attracts greatness, it would seem.
That's the only real explanation I have for the jaw-dropping work that okaso (a.k.a., Jan Jakub Ober, I believe) has done with the automated generation of help documentation for the twinBASIC project.
The CI/CD pipeline he's built includes automated testing to verify that the documentation matches actual twinBASIC behavior (it's the doc test concept on steroids) and produces multiple output formats:
- A statically generated HTML help site hosted at docs.twinbasic.com
- A 2,000-page PDF suitable for printing: twinBASIC_Book.pdf
- The twinBASIC Documentation Help add-in
I would provide you with the steps to install it, but honestly, I wouldn't do as good a job as Okaso's documentation itself.
At the risk of publishing stale information (I expect Wayne to incorporate the add-in into the stock IDE before too long), I'm reproducing an excerpt of the add-in installation instructions here so you can see the quality of this documentation firsthand.
Please note that I'm not showing the excerpt in a quote block so as to preserve as much formatting as possible from the original. The actual help page has the link to download the project file.
Getting the add-in
The add-in is a twinBASIC project, which the IDE builds into two DLLs, one for each bitness.
- Download the project file, tbDocsHelp.twinproj, about 28 MB. It is made from the add-in’s source code each time this documentation is published. It holds the index of the symbols these pages document and a copy of the whole documentation.
- Open
tbDocsHelp.twinprojin the twinBASIC IDE and build it. Then set the build target to win64 and build it again. The two DLLs,tbDocsHelp_win32.dllandtbDocsHelp_win64.dll, are written to aBuildfolder next to the project file. - Copy each DLL to the matching
win32orwin64add-ins folder, as Add Ins describes, and restart the IDE.
An add-in built this way serves the pages itself, from the copy of the documentation in its DLL, so the pane needs no internet connection. Open in browser still opens the page on the website, docs.twinbasic.com.
Scripted Screenshot Annotations
As okaso continues iterating and improving upon the documentation, he's adding ever-more-impressive automations into the pipeline.
The latest is his quest for auto-generated, annotated screenshots like this one:

From okaso:
On the docs front, I've tackled another long-time annoyance of mine: tB IDE screenshots. I'm automating them, so there's a single script that runs the IDE as many times as needed, adds SVG annotations where needed for the screenshot, and writes out the PNGs.
Keeping the screenshots up-to-date with IDE's progress should now be minimum effort. This work hasn't been merged yet, but it's well along now.
This is one of the auto-generated screenshots:

Since the screenshot generator reads the DOM of the IDE, the annotations should track changes in the layout, to an extent.
But even that wasn't enough for okaso, apparently.
Why create automated annotated rasterized PNG screenshots like some sort of Neanderthal, when you can create automated annotated vector-based SVG screenshots that allow you to zoom in infinitely with no loss of sharpness (NOTE: these are PNG screenshots of the original SVG):


More from okaso:
The SVG-first documentation preview is at https://kubao.github.io/twinBASIC-docs/. A good place to start is https://kubao.github.io/twinBASIC-docs/Features/Compiler-IDE/IDE-Features. I'm looking for potential rendering problems caused by those SVGs, as they are a bit special. Each one embeds its font subset(s) - similarly to how PDFs do it. They are self contained, and they are accurate vector screenshots of the IDE. I'll add a click-to-zoom feature to all of them, as they deserve.
Here's a screenshot of the IDE-Features page zoomed in at 500% in Firefox:

And, finally, this guy thought of everything:
And the screenshot process automatically falls back to a high-resolution PNG if the rendered SVG isn't essentially pixel-identical to the PNG. So if the SVG render magic comes short, we should not have broken SVGs because of that, since PNGs will be used instead.
twinBASIC Package Documentation
OK, you need to slow down, okaso. It's not supposed to take me this long to write a twinBASIC weekly update article.
At the same time, I can't not write about this latest documentation tour de force. The twinBASIC docs page now shows generated documentation for all the community packages currently available on the TWINSERV package manager (well, almost all–WinDevLib is not yet covered).
The documentation breaks down packages into four categories (descriptions and links below are from the above help page):
- Default Packages – VB, VBA, and VBRUN – included in every project by default
- Built-In Packages – 10 optional packages shipped with twinBASIC, always available offline
- Contributed Packages – community-authored packages published through TWINSERV, the twinBASIC package registry
- Experimental Packages – community-authored packages from TWINSERV that are not yet ready for use in a program
Discord Chat Summary
* Auto-generated via Claude Sonnet 5.5
Overview
The week began with a code-signing fix, and the project then moved past BETA 1000. Two threads dominated the discussion. In #general, newcomers with large VB6 codebases talked about migration blockers and static linking. In #docs, okas_o shipped an IDE Help add-in, an automated vector-screenshot pipeline and peloader, a PE loader that can compile tB projects on Linux. Engagement was high on weekdays and quieter on the weekend, and waynephillipsea took part in both channels.
Releases & Stability
- waynephillipsea confirmed that releases from BETA 998 onward are code signed again. The certificate had lapsed, and the project now uses an EV certificate in place of the previous OV one.
- twinBASIC crossed into four-digit build numbers, and BETA 1005 was in use by week's end.
- One user reported a "licence not found" prompt on first compile or load. It often followed an idle IDE or an upgrade or downgrade in the same folder, and restarting the compiler cleared it. waynephillipsea said he would ask TwinSight to investigate.
- Users suggested turning off the "keep LLVM cache alive" IDE option to avoid lingering IDE processes. One user also reported a thumbnail-drawing regression somewhere between BETA 997 and 1005, and a bug report is pending.
Docs Tooling & Help Add-In
- okas_o's Help add-in is pure tB with no dependencies. It has a detachable help pane and context-sensitive F1 help, and it is now available as a
.twinproj(seedocs.twinbasic.com/tB/IDE/AddIns/Help). waynephillipsea's feedback on a visual separator and detached-window theming was fixed within days. - A single command regenerates the IDE screenshots on a private desktop in about two minutes. About 160 of 201 captures were done at the last report.
node scripts/shoot_docs.mjs
- Annotations are positioned from the IDE's DOM, so they follow layout changes. Each screenshot is also converted to a self-contained SVG with embedded fonts, with an automatic fallback to PNG if the two don't match. waynephillipsea called the results "very sharp".
- The IDE chapters were redrafted: Writing Code, Running and Debugging, Customising the IDE, IDE reference and Add-Ins. The docs repo passed 200 merged pull requests. The PDF book has grown to about 3,700 pages, and a layout tightening is coming.
- Every docs code snippet is compiled, and many are run in both tB and VB6 for comparison. okas_o also proposed a docs "dialect" switch (tB, VB6, VBA, VBScript), possibly in November. This is a proposal.
peloader: Linux Builds & Sandboxing (Experimental)
- okas_o's
peloaderreimplements the WinAPIs the tB compiler DLL uses. It allows command-line builds of EXE and DLL projects on Linux, so the Help add-in can be built on CI without Windows runners or Wine. - It currently builds only COM-less projects, because the typelib writer isn't finished. It is 64-bit first and expected to stay under about 5,000 LOC. Console tB executables could later run on Linux too.
- A sandbox mode is in progress. It restricts file access, blocks new executable memory and IAT modification, and uses a static analyzer for raw
Emitassembly. ROP protection is not yet addressed. - waynephillipsea said a sandboxed compiler would let the TwinSight auditor safely compile and test its findings.
VB6 Compatibility & Migration
- Teams with large codebases, one of about 500,000 lines, have started testing tB. They were directed to the #bugs channel and the GitHub tracker.
- saturnian_91483 listed blockers that were stopping their team from testing tB:
- Docked controls lose their docking on import.
- Docking order isn't respected for third-party controls.
- Copy and paste of third-party controls loses their configuration and graphics.
- waynephillipsea could not reproduce the toolbar issue with the TXWords sample until it was clarified that the problem appears when docking controls in the form designer.
- fafalone said property pages should now be supported, so Krool's controls need a fresh re-import. He also listed his own long-standing irritants: derived-interface method overloads, alias-of-alias breakage, no mouse events on windowless UserControls, control-object passing to OCXs, and PictureBox flashing and lag.
- fafalone argued that LLVM was essential for v1 so that tB apps aren't slower than VB6. Other participants cautioned that tB is still beta and not yet recommended for production.
Language, Compiler & Static Linking
- fafalone proposed a dedicated
#syntax for compiler hints, such as#LLVM Unroll, instead of regular-looking code. This is a proposal. - Asked whether the compiler should reject
Dim variable As Byte = -1at compile time, waynephillipsea said tB will do more static analysis in future, giving better diagnostics. Today it raises an overflow at runtime. - Static linking (
Import Library) remains experimental. fafalone said static libs can't pull in other static libs, and system libs such as user32 and kernel32 aren't importable (use WinDevLib instead). One attempt to bundle SFML/CSFML produced hundreds of linker errors, and the user shelved it. LoadResDataisn't available in console or standard DLL projects by default. Adding the built-in "VB Compatibility Package (Forms)" reference fixes it for about 3 KB. fafalone noted an open issue to add the LoadRes functions to theAppobject.- VBG-style multi-project support is planned but not expected for v1.0. Two smaller findings: tB classes don't implement
IExternalConnection(VB6 classes do), and the tBCollectionaccepts UDTs but fails when retrieving them at runtime.
Controls, Packages & Community Projects
- fafalone got animated GIFs working in RichEdit. His upcoming ucRichEditD2D adds
UseLocalRichEdit, automatic math formulas, auto-resize, independent DirectWrite hints, pinch-to-zoom and autocomplete without an edit control. It is still in development. - For plain GIF display, fafalone says ucAniGifEx remains the better choice. He also said there is no x64 PhotoDemon port yet, because many third-party components need rebuilding and waynephillipsea expects it to need Tanner's help.
- okas_o documented 16 contributed and 10 experimental packages, including tbRegExp and TBMANLIB_Dialog. Seven remain, excluding WinDevLib, which will get a
coverage.mdpage and auto-generated Microsoft documentation links. An indexer bug that surfaced old package versions, caught by gcuser99, was fixed. - fafalone clarified that only packages marked
[BUILT-IN]ship with tB. Third-party packages are uncompiled projects, are not endorsed, and cannot run[RunAfterBuild]. - okas_o is also building a growing regression test suite in the docs project. bclothier stressed that regression testing is essential given tB's backward-compatibility goals.
Conclusion
This week combined a code-signing fix, the move past BETA 1000, and a major push on documentation tooling and compiler infrastructure. Designer docking and control copy/paste remain the biggest hurdles for VB6 migrators. Next steps include the GDI-to-SVG screenshot path, WinDevLib linking, peloader sandboxing and, longer term, more static analysis. Krool's remark that it still feels surreal that tB is real drew strong community appreciation.
Around the Web
XtremeWorlds: Free 2D MMORPG Maker
From the project's GitHub page:
XtremeWorlds is a free 2D MMORPG maker based on the classic PlayerWorlds development experience. It includes a Windows game client, a multiplayer server, and editors for building your own world.
The project includes twinBASIC projects alongside legacy Visual Basic 6 projects and exported source files. Some project metadata still uses the Playerworlds Lite name.
The programming language is Visual Basic 6 with TwinBasic IDE: https://twinbasic.com/
Screenshot posted to the show-and-tell Discord channel by Nickeltare:

The initial commit to the repo was posted just a few weeks ago, on September 25, 2026, by project lead Seth Jones (aka, Nickeltare).
Sunderland Ober Consulting: Documentation Gurus
From what I can tell, the aforementioned Okaso's company is "Sunderland Ober Consulting." Sometime within the past week or so, the company's website published a twinBASIC documentation landing page, with insights into the technology behind the fantastic tB help ecosystem.
The testimonial from Wayne Phillips says it all:
Jan's work on the twinBASIC documentation has been hugely important, and I really can't thank him enough. Without his help, our documentation would still be rudimentary and, frankly, nowhere near good enough. He's delivered a full-scale online manual, a downloadable PDF, and all the build infrastructure around it so that he and our community can maintain it and keep improving it. It's an enormous contribution to the project, and one that I appreciate a great deal.
He is incredibly thorough and professional, and never seems to be content with what he's already achieved. He's always looking at what could be better, always pushing for perfection, and that shows in the quality of his work. He's also a thoroughly nice person, which makes working with him a real pleasure. We're very lucky to have him involved in our project.
- Wayne Phillips, creator of twinBASIC
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 4.6, sorted in order of its opinion of "most impactful changes."
-
Better debugging tools: Watch expressions now support UDTs (user-defined types). Invalid Watch expressions no longer print linker errors to the debug console. The IDE hover box is also less likely to close by accident. Breakpoint fixes cover breakpoints at the top of a procedure, "Clear All Breakpoints" not persisting after a restart, and stepping missing the final
Endstatement. -
More VB6 compatibility and LLVM support: The array
Not NotVB6 hack now compiles with LLVM enabled. LLVM builds also supportAs Newon type-library CoClass types and now catch more FPU overflow errors. A regression withAs Newon fixed-size arrays is fixed too. -
Stronger compiler error checking: The compiler now reports a clear error instead of crashing on invalid global
Constdefinitions. It reports errors forNew <Interface>, for public constants in classes, and for globalConstarrays passed to aParamArray. Specifying multiple calling conventions now raises error TB5258. -
More reliable COM and runtime behavior:
PropertyBagnow works through late-boundIDispatch.IConnectionPointis more robust, withAdviseguarded against null pointers andUnadvisereturning the right error for an invalid cookie. Error code mapping is corrected, and the WebView2 header'sIEnumVARIANT::Cloneimplementation is repaired. Running code in the IDE no longer corrupts the x87 FPU state, which could cause false runtime errors. -
Fixes for regressions and stability:
Len()expressions failing in recent builds are fixed, as is a compiler crash when loading some files. Importing from a VBP no longer causes an IDE error. Memory leaks in very large source files (over 32,767 lines) and build failures when several IDE sessions build at once are also fixed. -
Release and build polish: All release executables are now signed. Built executables' unhandled-error message boxes use
App.Titleas their caption. The command-line import command now reports errors when the Settings file or Sources folder is missing. Scrolling in the Debug Console is smoother.
WARNING: The following issues are present in each of the releases below:
- This is a BETA release under active development. It is not recommended for production use.
BETA 998
- fixed: memory leak when editing a source document >32767 lines in length
- fixed: (regression) As-New bug with fixed-arrays in some circumstances [ kimpos, discord ]
- fixed: (regression) setting a breakpoint at the very top of a procedure would not trigger a breakpoint
- fixed: scrollbar bug in the DEBUG CONSOLE where scrolling was not smooth and sometimes got stuck
- fixed: all release executables are now signed
BETA 999
- fixed: the array Not-Not VB6 hack was not compiling when LLVM is enabled [ kimpos, discord ]
BETA 999a
- fixed: (regression in PETA 998) potential compiler crash in loading some files [ p5, discord ]
BETA 1000
- fixed: missing LLVM support for As-New on type-library CoClass types [ kimpos, discord ]
- fixed: broken tbIEnumVARIANT::Clone implementation for WebView2 headers [#2496]
- fixed: tweaked scope resolution rules to allow for procedures named the same as their containing module [#2494]
- fixed: command line import command does not report error info when Settings file or Sources folder are missing [#2493]
- fixed: OOB call to IDisptach::GetTypeInfo() implementation returns E_UNEXPECTED rather than DISP_E_BADINDEX [#2489]
- fixed: hardened IConnectionPoint::Advise against nullptrs being passed [#2488]
- fixed: IConnectionPoint::Unadvise now returns CONNECT_E_NOCONNECTION if the passed in cookie is invalid [#2487]
BETA 1001
- fixed: REVERTED DUE TO REGRESSIONS IN BETA 1000: tweaked scope resolution rules to allow for procedures named the same as their containing module [#2494]
BETA 1002
- fixed: tweaked scope resolution rules to allow for procedures named the same as their containing module [#2494]
- fixed: (regression) importing from a VBP (not migration) can sometimes cause an IDE error [ fafalone, discord ]
- fixed: (regression) some
Len()expressions failing in recent builds of tB [#2507] - improved: added a border tolerance area to the IDE monaco hover box to prevent it being hidden accidentally
- fixed: IDE monaco hover box will close if mouse goes over a dock resizer bar [#2506]
BETA 1003
- fixed: potential build failure when multiple IDE sessions are building at the same time [#2505]
- fixed: built executables unhandled error MsgBox now uses App.Title for its caption [#2501]
- fixed: PropertyBag class did not support accessing its methods via latebound IDispatch
- fixed: some potential codegen issues in EXE/DLL entry points
- fixed: "Clear All Breakpoints" not persistent when restarting the compiler [#2502]
- fixed: mapping of DISP_E_UNKNOWNNAME to error 438 [#2490]
- fixed: missing compile error for
New <Interface>[#2486] - fixed: invalid Watch expressions will no longer print linker errors to the debug console [#2485]
- improved: watch expressions now support UDTs [#2485]
- fixed: (regression) stepping through code would miss the final End proc statement
BETA 1004
- fixed: running code in the IDE can cause x87 FPU state to be incorrect leading to potential invalid runtime errors [#2497]
- fixed: setting invalid color values (all controls) now handled appropriately [#2484]
- improved: specifying multiple calling conventions now raises error TB5258 [#2480]
- fixed: potential buffer overrun in handling
#ERROR <val>in file read operations (Variant) - fixed: some FPU overflow errors not being detected in LLVM builds [#2477]
BETA 1005
- fixed: compiler crash instead of compiler error on an invalid global Const definition in some circumstances [#2475]
- improved: global Const array compiler error hardening [#2474]
- fixed: compile error 'Constants in a class cannot be Public' was missing on global Const arrays [#2471]
- fixed: passing a global Const array to a ParamArray was not triggering a compiler error until codegen [#2470]

