twinBASIC Update: October 27, 2026
Highlights include a long-awaited Object Browser, the ability to build COM type library (.tlb) files, and a fresh look for the IDE, including the new Aurora theme.
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
An Object Browser (Four Years in the Making)
BETA 1023 added an Object Browser to the twinBASIC IDE. Press F2 to open it, just as in the VBA editor. From Wayne's announcement:
In BETA 1023 we now have a rough version of an Object browser. We've got filtering by name, or click the filter icon to refine by type. Go To Definition should be fully working. The Description area needs some work, in particular we need to support clicking through datatype links, but on the whole it should be quite functional.
BETA 1025 brought the first round of improvements:
- fixes for some performance issues
- a switch between BROWSE (dual list) and RESULTS (single list) views
- a case-sensitive search option
- sorting in alphabetical, type or declared order
- qualified searches using dots, including partial matches
Still to come are the clickable datatype links in the Description pane, so you can jump from a type in a member's definition to that type, the way you can in the VB6 and VBA Object Browsers.
This one has been a long time coming. Wayne first floated an Object Browser in October 2022: "I think we'll definitely be wanting an Object Browser."
Build Type Libraries in twinBASIC
BETA 1018 added an experimental new project type:
added: experimental support for project type "TypeLibrary TLB" [ fafalone, discord ]
A type library (.tlb) is a file that describes COM interfaces, classes, types and enums, and optionally API declarations, so that other code can use them. VBA reads type libraries constantly. Every entry under Tools > References, from DAO to the Office object libraries, is backed by one, and the Object Browser is essentially a type library viewer. Building your own lets VB6 and VBA use things they can't declare themselves, most notably Windows COM interfaces such as IShellFolder, for which VBA has no syntax. With this project type, you write those declarations in twinBASIC and get a .tlb you can add through Tools > References > Browse. Until now, getting a type library out of twinBASIC meant building an ActiveX DLL and extracting the type library from its resources.
For most Access developers, this is a niche feature. If your code is forms, queries and DAO, you're already consuming type libraries and will rarely need to build one. It matters if you call COM-based Windows APIs from VBA, especially in 64-bit Office.
The feature is still experimental:
- No compile-time checks yet. The compiler doesn't yet stop you from including code that can't go into a type library.
- Hard limits for VB6/VBA. The format can't hold overloaded procedures, and VB6 and VBA can't use
ByValUDT parameters, so declarations that rely on either have to be restructured. - Layout carries over. Struct packing set with
[PackingAlignment(X)]is honored, andCurrencyalignment matches VB6/VBA. - Follow-up fixes. BETA 1019 fixed a Sub Main binding error, and BETA 1024 made
[COMExport]implicit onDeclarestatements in this project type.
To try it, set the project's Build Type to "TypeLibrary TLB" in Project Settings. Code can test the build type with the TWINBASIC_BUILD_TYPE compiler constant, so one project can serve both builds. For example, the type library build can give a declaration a different name where it would otherwise be an overload:
#If TWINBASIC_BUILD_TYPE = "TypeLibrary TLB" Then
Public Declare PtrSafe Function SHGetDesktopFolder2 Lib "shell32" Alias "SHGetDesktopFolder" (ppshf As IShellFolder) As Long
#Else
Public Declare PtrSafe Function SHGetDesktopFolder Lib "shell32" (ppshf As IShellFolder) As Long
#End If
[PreserveSig(False)]
Public Declare PtrSafe Function SHGetDesktopFolder Lib "shell32" () As IShellFolder
The new project type isn't in the twinBASIC documentation yet.
The IDE Gets a Facelift
The IDE is getting a bit of love whilst the kids are off school ๐
That was Wayne on Tuesday, posting a screenshot of the new front page.

Over the week:
- BETA 1021: the IDE Options dialog "has now been revamped to match the Project Settings dialog"
- BETA 1022: a new Aurora theme, plus High-Contrast-Light and High-Contrast-Dark themes (both WIP)
- BETA 1030: in Aurora, "most modal dialogs are now dark-mode aware (WIP)"; "similar will be applied to the default Dark theme in due course"
- BETA 1031: a new IDE front page with New, Samples and Recents (WIP)

Discord Chat Summary
*Auto-generated via Claude Sonnet 5.5
Overview
The week's main story was BETA 1018's experimental TypeLibrary TLB project type, which fafalone tested against WinDevLib. The IDE also gained an Object Browser, the Aurora theme and a redesigned front page. Documentation, add-in extensibility and bug reports each had a smaller share of the discussion. Engagement was high in the General channel and light in the Addins, Docs and bug-thread channels.
Feature Development: Experimental TypeLibrary TLB Project Type
- waynephillipsea announced experimental "TypeLibrary TLB" support in BETA 1018. It outputs a raw TLB instead of embedding one in an ActiveX DLL, and it does not yet enforce code-free projects.
- Known limits:
- TLBs do not support overloads. fafalone suggested a future version could auto-number them, and waynephillipsea said "we should consider that"; bclothier preferred descriptive suffixes such as Str/Ptr.
- TLBs cannot hold two interfaces with the same GUID. This is fine in tB as long as they are not exposed in a final type library.
[PackingAlignment(X)]is honored in a TLB, and Currency alignment matches VBx/tB.
- fafalone is using the feature to find WinDevLib compile issues. A method using an alias type (
CreateLayer(ByRef SIZE As D2D1_SIZE_F)) brokeID2D1RenderTargetgeneration. waynephillipsea advised starting from an empty project and adding modules one at a time. fafalone also showed how to split definitions by build type:
#If TWINBASIC_BUILD_TYPE = "TypeLibrary TLB" Then
Public Declare PtrSafe Function SHGetDesktopFolder2 Lib "shell32" Alias "SHGetDesktopFolder" (ppshf As IShellFolder) As Long
#Else
Public Declare PtrSafe Function SHGetDesktopFolder Lib "shell32" (ppshf As IShellFolder) As Long
#End If
Language Comparison: 64-bit TLBs and VB6/VBA Interop
- Before the new project type, 64-bit TLBs came from an ActiveX DLL project, with the TLB extracted as a resource. VanGoghGaming's 64-bit WinRT TLB on vbForums was built this way. He asked that the new type also include unused aliases, types and enums.
- VB6/VBA consumers cannot use ByVal UDTs in a TLB. They must be unfolded into members, passed ByRef when larger than 8 bytes, or replaced with Currency. WinDevLib already offers
WDL_NO_BYVAL_UDT. - Alignment differences matter on 32-bit. A WinRT
CreateWebViewControlAsynccall needed a manual padding Long in VB6, but the tB package worked with aLongLonghandle. - API declarations are exported to a TLB through
[ComExport], according to VanGoghGaming.
IDE & Add-ins
- Object Browser (BETA 1023, rough version): waynephillipsea added filtering by name and type, and Go To Definition fully works. Clickable datatype links in the Description pane are still to come.
- Browser feedback:
- dr.bobby asked for clickable parameter types.
- yereverluvinunclebert raised performance and caching. waynephillipsea said performance could be improved but wasn't his focus yet, and BETA 1025 then addressed some of it.
- fafalone asked to keep the "view as tB syntax" option, and waynephillipsea agreed.
- Accelerator keys were suggested.
- A greyed-out View menu entry turned out to be a duplicate menu item, fixed in BETA 1027.
- Themes and front page: the new Aurora theme gained dark-aware modal dialogs in BETA 1030, with the default Dark theme to follow. waynephillipsea said an AI helped design the theme. fafalone found module-level variables and APIs too close in color and was invited to adjust the theme file. waynephillipsea also previewed a redesigned IDE front page, and alaskandruid praised the new project properties dialog.
- Add-in API gap: bclothier found that add-ins cannot supply a custom CodeLens provider. waynephillipsea confirmed it and invited a request, and bclothier filed GitHub issue #2551. The feature is proposed, not implemented.
Documentation & Tooling
- okas_o added error-code documentation for the Conversion, DateTime, Information and Math modules, following Strings. All codes come from testing, with early tooling to catch tB behavior changes.
- The docs will eventually get a tB/VBA/VB6 switch. So far only tB and VB6 are tested, and the tooling comes first.
- okas_o's Help add-in gained a
CHANGELOG.md. It also gained optional IDE improvements: Ctrl-F search (with F3/Shift-F3) in the panel layout and shortcut editors, and working shortcuts for other add-ins when Ctrl or Alt is used. - okas_o confirmed
tblaunchis MIT licensed. fafalone reported that theimpexpdocs showexportto a folder path with a trailing\, but the tool errors on it. - On Office automation errors such as Excel's generic 1004, bclothier prefers a way to surface the real error over listing every host's errors. okas_o called documenting Office automation a distant possibility and welcomed community contributions. He said a general section on automation-server errors is "on the horizon."
Bug Fixes & Stability
- Regression: twixydon reported that in BETA 1028
DrawTextignores.ForeColoron PictureBoxes and Forms. waynephillipsea acknowledged a recent change in this area and said he would check and fix it. - Crash dumps: several users found 2 GB to 20 GB in
AppData\Local\CrashDumps. waynephillipsea said the OS creates the dumps, likely from compiler crash-restarts. okas_o said background test probes also generate them. - Import crash: Saturnian hit an ACCESS_VIOLATION running an imported VB6 project in BETA 1015. The failure was in wqweto's
cWebView2class, though the compiled exe ran. VanGoghGaming notedCollectionAllKeysis VB6-only and tB has aKeysproperty. krool5045 asked for a bugs-channel post. - Known blocker: windowless UserControls still prevent projects like ucSegmentedControls from working, according to fafalone.
Community Highlights
- fafalone reported that VBDoom runs well in tB. Only sound effects are missing in LLVM builds, while music still plays.
- fafalone and VanGoghGaming shared a
WH_GETMESSAGEhook usingIsDialogMessageto handle Tab in VB6 controls and TaskDialog. They also noted that unpatched VB6 (pre-SP6) needs manifest sizes that are a multiple of 4. - Members joked about a November release candidate for v1 and the chance of Black Friday lifetime-license deals.
Conclusion
Beta builds 1018 through 1031 brought the experimental TLB project type, the Object Browser and a refreshed look for the IDE. fafalone's WinDevLib testing is shaping how the TLB feature will be refined. Next steps include the DrawText ForeColor regression, windowless UserControls, Object Browser polish, CodeLens provider support (issue #2551) and the docs' multi-platform switch. These all support the VB6/VBA migration story as v1 approaches.
Around the Web
cTaskDialog v1.8: Tab Navigation for Custom Controls
Posted in show-and-tell by fafalone:
โข Added Tab/Shift+Tab navigation support for all custom controls.
โข Added method AddModalWindow, to disable interaction with other hwnds besides the immediate parent (you must still specify .ParentHwnd to be modal to that window). It wasn't practical to add an automatic 'app modal' option that wasn't insane/unstable across VB6, tB, and VBA.
โข More generalized fix for button icon order issue, as it occurred in many other scenarios.
โข Demos: Updated included .res file to work with VB6 SP5; also architecture to * so if you import to tB 64bit will work without modifying it.
From the project's README, cTaskDialog is "a complete class wrapper for TaskDialogIndirect, with additional custom features, universally compatible with VB6/VBA7/twinBASIC x86/x64." To use it, add cTaskDialog.cls and mTDHelper.bas to your project: "these are the only two required files for your code."
The Tab support follows a discussion in General this week, where VanGoghGaming suggested a WH_GETMESSAGE hook that passes Tab to IsDialogMessage before VB6 can swallow it. We last covered cTaskDialog at v1.4 in January 2024.
Listing Current CPU Features for LLVM
Posted in show-and-tell by fafalone:
tB will soon has this built in i believe, but for now, the following is my CPU features code adapted to match the LLVM flags, so you know clearly what the current system can do:
The CpuFeatures module, attached to the thread as message.txt, reads the processor's CPUID and XGETBV registers using twinBASIC's Naked procedures and Emit(). It then prints whether each of 20 LLVM feature flags is available, followed by a "Supported:" list of the flags that are. Run ReportCpuFeatures and you get output like this:

The thread became a discussion of when these flags help. VanGoghGaming found that in his quicksort test only LLVM: Generate optimized code made a difference ("over 100% speed gain"); the AVX and SSE flags "didn't do anything."
General day to day code uses a lot of API code under the hood and so that gives LLVM very little opportunity to provide a speed benefit, though compile sizes are often quite a bit smaller than the native unoptimized compiler. Where LLVM comes into its own is for algorithmic work, like cryptography, image/audio processing, that sort of thing.
He also said they'll be "adding some clarity on that including a drop down for targeting specific CPU generations in the coming weeks."
VB6 Doom Runs in twinBASIC
Posted on r/visualbasic by u/createaforum:
Doom Ported to VB6! Uses FreeDoom assets. Started with a Wolfenstein 3D which have on github as well (issue was free licensed assets), Have Quake in the works as well. Just want to see how good VB can do with commercial games, made with Claude/LLM.
When another redditor asked, "How about porting it to twinBASIC?", the author replied:
Have tested as is in latest twinBASIC does compile and work! Just imported the project.
fafalone reported the same on the twinBASIC Discord: it "runs perfect in tB, with the minor exception there's no sound effects when built with LLVM (music is still fine)."
From the project's README, DoomVB is "a complete port of id Software's GPL DOOM source release (linuxdoom-1.10) to classic Visual Basic 6: about 29,000 lines of VB, with one module for every C file of the original." Freedoom: Phase 1 is included, "so it runs out of the box." The author has since posted a Quake port, VBQuake, too.
WinDevLib v9.5.748: First Bindings Generated with tbBlob
fafalone replied in the tbBlob thread in show-and-tell:
very very interesting, I think WDL might be growing a lot quicker now ๐
The next day, WinDevLib v9.5.748 shipped with this in its CHANGELOG:
Add: Experimental addition of webservices.h by way of tBBlob. This is purely for testing at this point and shouldn't be considered a final version.
webservices.h is the header for the Windows Web Services API. The rest of the release is mostly bug fixes:
- duplicate aliases removed
- clashing names resolved: Comctl's
COLORMAPis nowCOLORMAPcc, so it no longer conflicts with GDIPlus'sColorMap - incorrect or duplicate DispIds fixed in
ITaskSettingsandIPrincipal2
There is also one breaking change, to IDCompositionVisual. Duplicate aliases are among the errors fafalone said the new TypeLibrary TLB build type was turning up (see Highlights).
The previous release, v9.5.747 (October 19), fixed several signatures in the rich-text TOM interfaces. It also removed Get/Set from ITextDocument2Old's property names to match the other TOM interfaces, which is a breaking change.

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."
- New Object Browser (F2): It started as an early preview in Beta 1023. Beta 1025 added a switch between dual-list (Browse) and single-list (Results) views. It also added case-sensitive search and sorting by alphabetical, type, or declared order. Searches now accept dots for qualified names, including partial matches. Performance problems were also fixed.
- Experimental "TypeLibrary TLB" project type: Beta 1018 added this. Beta 1019 and 1024 refined it. Binding errors with Sub Main were fixed, and
[COMExport]is no longer needed on Declares because it is now implicit. - IDE and theme overhaul: New themes include Aurora, High-Contrast-Light (WIP), and High-Contrast-Dark (WIP). The IDE Options dialog now matches the Project Settings dialog. In the Aurora theme, most modal dialogs are now dark-mode aware (WIP). There is also a new front page with New, Samples, and Recents sections (WIP).
- Better VB6/VBA compatibility in built-in functions: Many functions now behave like VB6/VBA. These include
DateAdd,CDate,Val,String,Abs,Round,Cos,Sin,Tan,LSet/RSet, andErr.Raisewith a namedHelpContext.TextBox.Textset in code is now limited byMaxLength, as in VB6. - Compiler and LLVM fixes: Rounding to integers is now correct in LLVM-compiled code, and inline
ByValon direct member calls works. Leftover compiler addresses in EXEs were removed, and a compiler crash when deleting container controls in the form designer was fixed. - Form and control stability: Explicitly setting Width/Height on docked or anchored controls in
Form_Loadno longer causes layout problems. Closing a form from the taskbar thumbnail no longer leaves a hanging EXE process.RaiseEventinsideUserControl_InitializeorForm_Initializeno longer causes problems.
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 1018
- fixed: left over compiler addresses in EXE [#2509]
- fixed: TextBox.Text assigned in code is not limited by MaxLength, where VB6 truncates it [#2483]
- fixed: DateAdd bug [#2525]
- fixed: setting Width/Height of docked/anchored controls explicitly within Form_Load event causes havoc [ fafalone, discord ]
- added: experimental support for project type "TypeLibrary TLB" [ fafalone, discord ]
BETA 1019
- fixed: [TypeLibrary project type] error about binding to Sub Main in some projects [ fafalone, discord ]
- fixed: LLVM-compiled code rounds a Single or Double to an integer half away from zero incorrectly [#2469]
BETA 1020
- fixed: regression in LLVM adjustments from BETA 1019
BETA 1021
- fixed: IDE Options dialog has now been revamped to match the Project Settings dialog
BETA 1022
- fixed: Closing a form from the taskbar thumbnail can potentially leave a hanging EXE process [ fafalone, discord ]
- fixed: Form.Controls.Add edge cases [ vbuser, discord ]
- added: High-Contrast-Light.theme (WIP)
- added: High-Contrast-Dark.theme (WIP)
- added: Aurora.theme
BETA 1023
- added: OBJECT BROWSER F2 (early preview, no datatype hyperlinks)
BETA 1024
- fixed: (regression) ProjectName qualifier should NOT allow access to, and not conflict with, other class members [ vbuser, discord ]
- fixed: [COMExport] is no longer required on Declares in a "TypeLibrary TLB" project type (now implicit)
- fixed: some minor theme issues
BETA 1025
- improved: addressed some performance issues in using the OBJECT BROWSER [ yereverluvinunclebert, discord ]
- improved: OBJECT BROWSER now offers a switch between BROWSE (dual list) and RESULTS (single list) views
- improved: OBJECT BROWSER now offers a case-sensitive search option
- improved: OBJECT BROWSER now offers ordering options of alphabetical, type and declared order
- improved: OBJECT BROWSER search feature now accepts dots for qualified searches (inc partial matching)
BETA 1026
- fixed: RaiseEvent inside UserControl_Initialize or Form_Initialize could cause problems [ fafalone, discord ]
- fixed: String() edge case Null handling [#2543]
- fixed: Val() detection of overflows when datatype characters are specified [#2542]
BETA 1027
- fixed: deleting a container control in the form designer could cause a compiler crash-restart [ DTZ, discord ]
- fixed: duplicate IDE menu entry for "Object Browser" [ birnaofthenorth, discord ]
- fixed: (regression in BETA 1026) Val() incorrect when currency datatype suffix is used with large values
BETA 1028
- fixed: Abs() now uses an intrinsic for integral types due to differences in Variant behaviours [#2541]
- fixed: Round(Null, negative) now throws an error to match VBx [#2540]
- fixed: Cos()/Sin()/Tan() handling of extreme inputs to match VBx [#2539]
- fixed: inline ByVal on direct member calls was failing on LLVM compilations [ VanGoghGaming, discord ]
BETA 1029
- fixed: CDate() range validation [#2537]
- fixed: some LSet/RSet error behaviour differences [#2482]
- fixed: HelpContext as a named argument to Err.Raise not working [#2455]
- fixed: invalid Debug.Print encoding when using continuation lines [#2444]
BETA 1030
- improved: IDE Aurura theme; most modal dialogs are now dark-mode aware (WIP)
BETA 1031
- improved: new IDE frontpage New/Samples/Recents dialog (WIP)



