twinBASIC Update: December 15, 2025
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. 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 Wiki (list of new features not in VBx)
- GitHub Issue Tracker (report bugs)
- twinBASIC/VBx LinkedIn Group
Highlights
Go To Definition Added to the Debug Console
Generated by Claude-Opus-4.5
BETA 925 introduced Go To Definition support using the F12 hotkey within the Debug Console, a feature that brings familiar code navigation capabilities to the debugging workflow. BETA 926 further refined this functionality to support additional code elements.
This enhancement allows developers to navigate directly from symbols in the Debug Console to their declarations in the source code. The feature currently supports global variables and class methods on predeclared objects (such as Form1.Something), though module procedures and private-scoped methods are not yet supported since they don't appear in the Debug Console's intellisense.
VBA developers will recognize this as analogous to the "Definition" command found in the VBA Editor's View menu, which can also be invoked using Shift+F2. While the shortcut key differs in twinBASIC (F12 versus Shift+F2), the functionality serves the same purpose: quickly jumping to where a symbol is defined. The key difference is that twinBASIC now offers this navigation capability directly within the Debug Console, whereas the VBA Immediate Window lacks this feature entirely.
For developers accustomed to rapid code navigation during development, having this same capability available while debugging represents a meaningful workflow improvement. Rather than manually searching for a definition while investigating runtime behavior, developers can now jump directly to the relevant code. This bridges a gap between the editing and debugging experiences, making the Debug Console feel more integrated with the rest of the IDE's navigation tools.
The feature was implemented in response to community feedback and delivered within a day of the initial request, demonstrating the rapid iteration cycle that characterizes twinBASIC's beta development.
Automatic (Opt-in) Error Reporting Added
Wayne posted the following in Discord:
When you open BETA 926 onwards you'll be asked:
You'll only be asked once. Please answer YES to help us out. Only minimal information is sent to our server - no personal information and no code - just the error reports themselves as you see them in the DEBUG CONSOLE from time to time.
To be clear, this is not a tool for gathering error reports from twinBASIC applications we write; it's a way for Wayne to get real-world data to find and fix bugs in the twinBASIC IDE itself.
fafalone followed up the announcement with the question that's often top of mind for these types of automated reporting tools:
whats included in the error reports... i trust its nothing nefarious but still want to know exactly what's sent
Wayne quickly responded–as he so often does–with full transparency:
Here's an example error report that comes through to us:
{
"product": "twinBASIC IDE BETA 926",
"lstatus": "COMMUNITY EDITION",
"ts": "12:36:43.834",
"msg": "0001 12:36:43.794 NATIVE EXCEPTION: ACCESS_VIOLATION /Form1.twin; Form1.Command2_Click LINE 000030 [$07F023DF]\r\n thread 000C: CompilerOrganizationParsingEnd\r\n thread 000B: ProjectPushCustomControlsToClientEnd\r\n thread 000A: CompilerPackageIntellisenseAwaiting\r\n thread 0009: CompilerPackageIntellisenseAwaiting\r\n >>> thread 0008: RuntimeExpressionEvaluationEnd\r\n thread 0007: CompilerPackageIntellisenseAwaiting\r\n thread 0006: CompilerPackageIntellisenseAwaiting\r\n thread 0005: ResolveStage1_DataTypesSpecialCasesEnd\r\n thread 0004: UpdateVersionNumbersEnd\r\n thread 0003: CompilerPackageIntellisenseAwaiting\r\n thread 0002: ProjectLoadCacheTypeLibDocsEnd\r\n",
"cinfo": "COMPILADOR [Win32] v0.15.926 LAA"
}And the good news/bad news for Wayne is that it's working:
Since adding the feature yesterday, we’ve had over 450 automatic error reports. Painful… but also proof that tB is getting real-world use
Wayne clarified that many of those 450 reports are duplicates. "About 10 unique 'IDE internal error' cases, all fixed now."
Discord Chat Summary
* Auto-generated via Claude-Sonnet-4.5
Overview
The week saw significant community engagement around Boolean handling best practices, the introduction of automated error reporting, and exciting progress on type aliasing support. Wayne announced twinBASIC's 1,100-member milestone while delivering rapid IDE improvements based on user feedback. The community demonstrated strong technical depth through discussions ranging from COM internals to XAML integration, with several new members joining from VBA backgrounds.
Language Features & Enhancements
- Type Aliasing Support: Wayne announced experimental
Aliassyntax (Public Alias Int32 As Long) is now available outside of class/module scope, with hints that the feature may arrive sooner than expected. This addresses a long-standing need for proper Windows SDK type definitions likeBOOLEAN(1-byte) versus VB'sBoolean(2-byte). - Boolean Handling Discussion: Extended technical discussion on VBA/VB6's "dirty Boolean" problem, where Boolean values can be non-zero/non-negative-one. bclothier demonstrated how circumventing proper Boolean assignment creates values that display as
Truebut fail equality tests. The community consensus favorsIf x ThenoverIf x = True Thenfor reliability. - COM Event Handling Bug: loquat identified a reference counting discrepancy in twinBASIC's lightweight COM object implementation compared to VBA/VB6, missing an
AddRefcall in the event sink lifecycle.
IDE Development & Error Reporting
- Automated Error Reporting: Wayne introduced opt-in anonymous error reporting in BETA 926, collecting only error messages, timestamps, and thread states—no personal information or code. Within 24 hours, 450+ reports were received, revealing ~10 unique IDE internal errors (all fixed) and numerous access violations under investigation.
- Debug Console Improvements: BETA 925-926 brought F12 "Go to Definition" support in the Debug Console for global variables and class methods (module procedures pending). The community praised the improved line coloring and scrolling behavior compared to VB6's Immediate window.
- UI Refinements: Fixed procedure dropdown pre-selection behavior to match Windows standards. Reverted an intellisense height fix in BETA 926 that caused performance issues, with paste operations becoming noticeably slower for some users.
Community Growth & Support
- New Member Onboarding: Discussion about creating comprehensive guides for beta software usage, emphasizing source control and backup strategies. Mike Wolfe's installation guide was referenced, though the community identified gaps around project safety practices.
- VBA Migration Success: Multiple new members (ud_74, jim_mack) reported successful transitions from VBA, praising features like
Err.ReturnHresultaccess and non-dispatch interface support. jimdrew reported a complete VB6 project import with zero errors—a first after a year of tracking progress. - WinDevLib Development: fafalone committed to adding ICU (International Components for Unicode) declarations to WinDevLib, noting it's a massive library requiring significant time. Discussion of extracting 64-bit typelibs from twinBASIC ActiveX DLLs as a workaround for VBA compatibility.
Technical Discussions
- XAML/WinRT Integration: deletedewd demonstrated ADODB.RecordSet binding to WinRT ListView controls with animated gradient text, showcasing
IBindableVectorimplementation and data virtualization. The community discussed WPF/WinRT templated control architecture and performance characteristics. - Validate Event Issues: jim_mack reported UserControl
ValidateandLostFocusevents not firing correctly when importing VB6 projects. wqweto clarifiedValidateevent's unusual behavior—only firing when entering aCausesValidation=Truecontrol, potentially from controls that lost focus several interactions ago.
Conclusion
This week marked a turning point in twinBASIC's maturity, with automated error reporting providing unprecedented insight into real-world usage patterns and Wayne rapidly addressing discovered issues. The experimental type aliasing feature represents a major step toward complete Windows SDK compatibility, while the growing influx of VBA developers successfully migrating projects validates the language's production readiness. The 1,100-member milestone and reports of flawless VB6 project imports demonstrate twinBASIC's evolution from experimental compiler to viable VB6 successor, even as the beta designation reminds users to maintain proper backup practices.
Around the Web
reddit: Does Learning VB6 Make VBA Easier?
In the reddit post below, several people mention twinBASIC in their comments. This general phenomenon has been growing steadily as twinBASIC matures, but it appears to be accelerating as the language rounds the corner for the final stretch run to its v1 release.
Does learning VB6 make VBA easier?
by u/McLolster in vba
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.5, sorted in order of its opinion of "most impactful changes."
-
Automatic Error Reporting Added: New option to automatically report IDE errors with anonymized data, helping developers improve stability and troubleshoot issues more effectively.
-
Enhanced Debug Console Navigation: Initial support for "Go To Definition" (F12) functionality within the DEBUG CONSOLE, making debugging workflows more efficient with refined support for navigating to various code elements.
-
Type Aliasing Support: Experimental feature allowing custom type aliases using
Alias MyTypeName As MyTypesyntax (e.g.,Public Alias Int32 As Long), bringing more modern programming flexibility to the language. -
Form Designer Integration: Integrated 'Format' menu items directly into the form designer right-click context menu for improved usability.
-
Control Array Runtime Improvements: Multiple fixes for runtime control array handling, including proper support for unloading ActiveX control-array elements and resolving ComboBox control-array issues with internal EDIT subclassing.
-
Performance Enhancements: Improved compiler-restart time for large projects and resolved IDE performance regressions, making the development experience smoother.
-
Stability Fixes: Numerous bug fixes addressing crashes, regressions, and edge cases including UDT circular reference detection, MDIForm predeclared variables, and form movement during Form_Load/Form_Resize events.
WARNING: The following issues are present in each of the releases below:
- IMPORTANT: This is an interim/experimental release. It includes significant changes, so some instability is to be expected.
- NOTE: CustomControls are currently broken in this release (e.g. Samples 6 and 8)
- NOTE: Some regressions are expected due to the significant architectural changes in this release
BETA 918
- fixed: passing UDT proc 'Me' to a ByVal param would crash in some circumstances [ VanGoghGaming, discord ]
- fixed: some issues around CTRL+SPACE intellisense handling when the caret is not at the end of a word [ wqweto, discord ]
BETA 919
- fixed: calling Form.Move during Form_Load/Form_Resize event was ignored [ birnaofthenorth, discord ]
- fixed: glitch with some CodeJock controls when moving control-array controls [ Kimpos, private ]
- fixed: linking-in of some needed global variables was not happening for UC packaged controls [ franic, discord ]
BETA 920
- fixed: (regression) changing CheckBox/CommandButton/OptionButton Style property at runtime was failing [#2277]
- fixed: control-array of ComboBox could cause issues due to the internal EDIT subclassing not being activated on runtime loaded elements [#2274]
BETA 921
- fixed: Unload of ActiveX control-array elements at runtime was not properly supported [ Kimpos, private ]
BETA 922
- fixed: (regression since BETA 909) saving of projects containing ANSI BAS/CLS files could cause an encoding issue if the compiler get restarted mid session, with non-dirty ANSI documents open [ birnaofthenorth + Don, discord ]
BETA 923
- added: experimental support for
Alias MyTypeName As MyTypesyntax, e.g.Public Alias Int32 As Long(outside of a class/module only)
BETA 924
- fixed: (regression since BETA 917) MDIForm predeclared global variable issue in compiled binaries [ axisdj, discord ]
- fixed: after compiler-restart, editing of documents could cause folding range data to be left stale, resulting in editor malfunctions such as Enter key not working as expected
- fixed: (regression) compiled builds that trigger an unhandled error in user code were not triggering the 'shutdown' dialog [ VanGoghGaming, discord ]
- fixed: Monaco sticky-scroll sometimes rendered with overlapping text [ FullValueRider, discord ]
- improved: compiler-restart time is improved for large projects
BETA 925
- added: initial support for Go To Definition (F12) inside the DEBUG CONSOLE [ Don, discord ]
- added: integrated 'Format' menu items into the form designer right-click context menu
BETA 926
- improved: F12/Go To Definition support in the DEBUG CONSOLE has been refined to support more elements [ Don, discord ]
- fixed: a couple of IDE internal errors [ birnaofthenorth, discord ]
- improved: ACCESS_VIOLATION errors now report some extra information for us to assist in pinpointing problems [ Gary Miller, discord ]
- added: Automatic Error Reporting option added - reports contain anonymised data only
BETA 927
- fixed: (regression) IDE performance issue [ Don, discord ]
BETA 928
- fixed: (regression in BETA 909) having the IDE Project Explorer panel in OBJECT view when loading a project can cause an immediate crash before the project is loaded [ Gary Miller, discord ]
- fixed: IDE code navigation combos were not preselecting the current value when dropped down [ Don, discord ]
- fixed: some IDE errors as reported via automatic error reports
BETA 929
- fixed: (regression) diagnostics panel often empty until a document gets edited in the session
- fixed: some IDE errors as reported via automatic error reports
BETA 930
- improved: minor IDE CSS tweaks
- fixed: some IDE errors as reported via automatic error reports
BETA 931
- fixed: compile errors on invalid Alias syntax are now attached to the correct Alias definition [ fafalone, discord ]
- fixed: (regression) startup-object predeclaredID not being destroyed with global variables during app terminate [ John, discord ]
- fixed: Delegates were unable to be used as an Alias datatype [ fafalone, discord ]
- fixed: when stepping through code, the last code line in the monaco viewport could become obscured by the horizontal scrollbar [ Don, discord ]
- fixed: opening a form could cause the form to be brought to the foreground above all other applicaton windows [ Don, discord ]
- fixed: (regression) imported VBPs using a form startup object might not open the startup form correctly in built executables [ fafalone, disocrd ]
- fixed: circular reference of UDT type in a dynamic array element would not trigger a circular reference error and instead crash the compiler [ forliny, discord ]
- fixed: some IDE errors as reported via automatic error reports