twinBASIC Update: May 26, 2026
Highlights include the launch of a completely redesigned twinbasic.com website, further improvements to the tB documentation, and an intro to "Vectored Exception Handling."
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
New Website Launch for twinbasic.com
The official twinBASIC website got a massive overhaul this past week.

The new site includes a Dark Mode vs. Light Mode toggle, a simple button "above the fold" to directly download the latest build (plus an always visible "Download" button pinned to the main navigation ribbon at the top of the page), and a modern, responsive "web card"-based design.
The site also provides clear links to:
According to Wayne, the design and layout of the overhauled site was about 80% ChatGPT, while the content itself was almost entirely human-written, with a bit of AI used for refinement only.
Documentation Tour de Force
User okaso continued on his recent tear, churning out a dizzying complementary array of twinBASIC documentation artifacts, including:
- The main twinBASIC documentation website, https://docs.twinbasic.com
- A free, 1,658-page downloadable twinBASIC PDF reference book (book.pdf)
- A fully browsable offline version of the full docs.twinbasic.com HTML (twinbasic-docs-offline.zip): this would be an especially handy resource for agentic AI-assisted twinBASIC development (e.g., Claude Code, Cursor, etc.)
In addition, okaso hand-tuned the CI/CD stack he uses to generate these documentation artifacts to impressive effect. Here's a short list of some of the key performance improvements:
- Swapped htmlproofer → Lychee: link check 3+ min → 1 min
- Swapped Lychee → 300-line Python script: link check 1 min → 2 sec
- Optimized Just the Docs (quadratic algo fixes): 3-site build (online/offline/PDF) 2 min → 20 sec
- Optimized paged.js HTML-to-PDF render (quadratic algorithm fixes): ~10 min → 95s → 70s → 55s → 45s → 9s @ 6ms/page
- Optimized pdf-lib post-processing (disabled browser-mode tick batching in CLI context): 60s → <1s
- Optimized pdf-lib heap usage: 150MB → 35MB
Overall CI pipeline (online + offline + PDF build, deploy, release): 8+ min → ~1 min 50s
*This list was compacted from the original Discord comments using Claude Sonnet 4.6.
Discord Chat Summary
* Auto-generated via Claude Sonnet 4.6
Overview
This was an exceptionally productive week for the twinBASIC project on two highly visible fronts: the launch of a completely redesigned public website and the near-completion of a comprehensive documentation overhaul. Active technical discussions in the General channel covered VB6-to-64-bit migration, language feature behavior, exception handling research, and a notable visit from the developer of a related BASIC-family project. Community engagement was strong throughout the week, peaking around the website launch and documentation milestones.
New Website Launch
- waynephillipsea shared a preview of a redesigned twinBASIC website on May 20, noting the layout was approximately 80% ChatGPT-generated while content was human-authored with only light AI refinement; the full site went live at https://twinbasic.com on May 26.
- The site received the week's strongest community reaction, with members praising its professional, product-ready appearance; notable features include a light/dark theme toggle that also swaps the IDE preview video, with OS-linked automatic dark mode detection confirmed as a planned near-term addition.
- okas_o noted the new site's styling choices would be carried over to the documentation site for visual consistency.
Documentation Sprint
- okas_o completed documentation for all of twinBASIC's built-in packages in a single week, including the Operators reference, orientation pages for the VB, VBA, and VBRUN packages, WebView2 with tutorials, CEF with tutorials, Assert, CustomControls, WinEventLogLib, WinNamedPipesLib, WinServicesLib, tbIDE, and WinNativeCommonCtls.
- waynephillipsea responded: "I didn't dream that we'd have such thorough and vast documentation available at this stage," and confirmed that major community packages — WinDevLib, VBCCR, and WinRT — should also receive documentation entries; bclothier noted this serves a dual purpose as a community showcase, demonstrating the ecosystem extends well beyond a single developer.
- A technical correction to the Operators pages arose when bclothier noted that
And/Or/Notare strictly bitwise operations, yielding logical results only as a side effect when both operands happen to be Boolean; waynephillipsea confirmed this and the pages were updated, with bclothier adding that "dirty booleans" have historically claimed victims in the VBx world. - The existence of an empty
twinbasic/lang-specrepository was surfaced by mansellan; okas_o added producing a formal language specification to the documentation roadmap, noting that its absence is a credibility gap for a production-ready product.
Offline, PDF & IDE-Integrated Help
- Offline downloadable versions of the documentation are now published automatically to GitHub Releases on every CI deployment; both the online and offline site versions include a footer link pointing directly to the latest archive.
- A PDF build was integrated into the standard CI pipeline, confirmed functional at approximately 1,700 pages; the eventual book will include A4 and Letter variants, single and double-sided layouts, chapter TOCs, and bleed tabs, with those layout refinements still in progress.
- okas_o outlined a triple-render architecture in which a single build produces three distinct output sets: one for the online site, one for offline browsing from disk, and one optimized as input for the PDF renderer — each with its own stylesheet.
- For IDE-integrated help, okas_o proposed a Help ID scheme mapping each language element to a stable numeric identifier so the IDE can retrieve documentation via a simple URL pattern; a help plug-in built on the tbIDE package was identified as the practical integration path, potentially requiring no changes to the core product from waynephillipsea.
Documentation Build Performance
- okas_o undertook an extended performance investigation of the build toolchain, identifying and fixing quadratic-time algorithms in the justthedocs Jekyll theme, the paged.js PDF renderer, and the pdf-lib post-processing library; bug fix PRs were filed upstream for each affected project.
- The link checker was migrated from htmlproofer to Lychee, then replaced entirely with a 300-line Python prototype performing the same checks in 2.2 seconds versus Lychee's 57 seconds — a 26× speedup with no loss of coverage.
- By the end of the week, the complete CI pipeline ran in approximately 1 minute 50 seconds, down from over 8 minutes at the start of the effort; the PDF render specifically dropped from near 10 minutes to 9 seconds, and post-processing from ~60 seconds to under 1 second.
- okas_o began developing a Node.js replacement for the entire Jekyll-based build system, motivated by the ~5,000 lines of Ruby workarounds accumulated to compensate for upstream inefficiencies; by May 26 the Node.js builder was producing output byte-identical to Jekyll across all 836 pages, establishing a verified baseline before removing compatibility shims.
VB6 Migration & Compatibility
- A user porting a 32-bit assembler-viewer application to 64-bit found that VBCCR18's RichTextBox converts
vbLfline endings tovbCron load; fafalone provided a modified VBCCR18 package forcingRiched20.dll(RichEdit 2.0) instead of the more modernMsftedit.dll, bringing behavior closer to the original VB6 SP6 OCX. - fafalone confirmed via COM interface inspection that the VB6 RichTextBox OCX is RichEdit 2.0 at minimum, since
ITextDocument(a TOM interface not available before 2.0) can be successfully queried from it using WinDevLib; he noted that when twinBASIC produces its own native RichTextBox control, it will use the same underlying engine as the VB6 original for compatibility. - fafalone shared a screenshot of LynxGrid running under tB x64, noting the port took roughly 10 minutes using the "drop all built-in declares and let WinDevLib take over" method, plus a prior 10 minutes to replace self-subclassing thunks with
SetWindowSubclass.
Language Features Discussion
- A question about constructor chaining prompted clarification that calling one
Newconstructor from another (e.g.,Me.New) is not currently supported; bclothier identified this as a feature request, while fafalone recommended a shared private initialization method as the practical workaround. - Defining both a parameterless
Newconstructor andClass_Initializein the same class causes tB to emit disambiguation error TB5073; fafalone noted that in[PredeclaredId]classes the same conflict manifests as a codegen error, and bclothier suggested that only parameterizedNew(...)overloads should be permitted to eliminate the ambiguity entirely. - deletedewd highlighted that tB's parameterized constructor syntax supports inline nesting, demonstrating a
ListViewpopulated via a vector of vectors of strings constructed entirely in a singleSetstatement.
Exception Handling Research
- fafalone investigated Vectored Exception Handling (VEH) as a mechanism for catching access violations in tB, posting a working implementation using
AddVectoredExceptionHandler; while the handler correctly identifies the exception code and faulting address, attempts to resume execution by advancing the instruction pointer did not behave as expected — in contrast to an equivalent C port that works correctly. - fafalone noted that full Structured Exception Handling (SEH) must be implemented at the compiler level and is also required for kernel-mode driver certification, where handling bad pointers via a special binary section is mandatory.
- bclothier clarified to a new user that tB has integrated a subset of vbWatchdog's error-handling capabilities natively, and that purchasing the standalone vbWatchdog product provides no additional benefit within tB.
Ecosystem: The Valo Language Project
- fafalone shared Valo, a Rust-based standalone runtime for a VBA-inspired language, sparking a discussion about fragmentation among VB-successor projects; the Valo developer (uesleidev) joined the channel directly.
- uesleidev explained Valo's goal as closer to a "Node.js for VBA-style programming" — a cross-platform runtime and language ecosystem rather than a VB6 successor — and acknowledged twinBASIC as far more mature for Windows/COM/VB6 compatibility needs today.
- fafalone noted that tB already covers many of Valo's planned features, including custom constructors,
Interface...End Interfaceblocks, console app project types, CDecl support, and an online package ecosystem, adding that tB's no-runtime model produces truly standalone executables — a property that enables even kernel-mode driver development. - A broader sentiment was expressed that the VB-successor ecosystem remains fragmented because multiple talented developers are pursuing slightly different visions independently; uesleidev expressed openness to future alignment and noted he had nearly abandoned Valo upon discovering how far along twinBASIC already was.
Community Support & AI Tooling Cautions
- A new user attempting to build a WebView2 application using AI-generated code encountered consistent hallucinations; fafalone corrected the key issues — navigation requires
.Navigatenot.Source =, must be called from theReadyevent notForm_Load, and the event isNavigationCompletenotNavigationCompleted— and pointed the user to the official WebView2 documentation and sample projects. - fafalone reiterated a broader caution that AI tools struggle with niche ecosystem-specific code not well-represented in their training data, and that a user removing Bitdefender entirely to resolve a false positive on the tB download is unnecessary — whitelisting the extraction folder in any AV product is the appropriate approach.
- A separate discussion noted that Microsoft Defender's reputation-based flagging of tB binaries may be partly attributable to waynephillipsea's recent company reorganization requiring the digital signing reputation to be rebuilt from scratch.
Conclusion
The week of May 13–26 stands out as one of the most impactful weeks in twinBASIC's recent history, with two major public-facing milestones — the new website and a near-complete documentation site with offline and PDF delivery — landing in close succession. Behind the scenes, okas_o's sustained engineering effort transformed a fragile, slow build pipeline into a fast, well-architected system that will support the documentation project well into the v1 era and beyond. Technical discussions in the General channel reinforced the breadth of twinBASIC's capabilities and the vitality of its community, while the visit from the Valo developer underscored tB's standing as the most comprehensive and mature VB-family modernization effort currently available.
Around the Web
Intro to Vectored Exception Handling: Crash-proof CopyMemory
fafalone posted the following in the show-and-tell Discord channel:
It's been a long standing problem that access violations like a bad address for CopyMemory and other exceptions can't be handled by On Error. One solution to that is Vectored Exception Handling (VEH). You can register a procedure to handle true exceptions like access violations, then set it to skip the offending instruction.
This is a small module to introduce the concept that allows you to call CopyMemory safely, your app will not crash even if you supply an invalid address. If an invalid address is provided, the operation is skipped, allowing you to then just check if your destination has changed to determine how to proceed.
NOTE: In twinBASIC this currently only works in a compiled exe.
Changelog
Here are the updates from the past week. You can also find this information by visiting the GitHub twinBASIC Releases page.
- Nothing new the past two weeks.