Qbjc
QBasic to JavaScript compiler
Install / Use
/learn @jichu4n/QbjcREADME
qbjc
qbjc is a QBasic to JavaScript compiler. It can compile a QBasic / QuickBASIC program to:
- A standalone executable Node.js script, with zero external dependencies; or
- An ES6 module that can be imported and executed in both Node.js and browser environments.
Try it out in the browser: 👉 qbjc.dev 👈
But why?
QBasic was my first introduction to programming as a kid back in the 90s. Despite its many limitations, it really inspired my passion for building things with technology that continues to this day. The balance of simplicity and power made programming feel both approachable and incredibly fun [1].
I wanted to see if I could recreate a little bit of that magic for the modern age, something easy to get started with in today's web-centric world. So this project was born - a QBasic compiler + runtime + basic web IDE that compiles your QBasic code to JavaScript!
[1] See also: 30 years later, QBasic is still the best
Usage
qbjc playground
The qbjc playground (👉 qbjc.dev 👈) allows you to edit and run QBasic / QuickBASIC programs directly in the browser, no installation required.

Command line usage
# Install qbjc from NPM
npm install -g qbjc
# Compile hello.bas and write output to hello.bas.js
qbjc hello.bas
# Run the compiled program
./hello.bas.js
# ...or run hello.bas directly:
qbjc --run hello.bas
# See all command line options
qbjc --help

API usage
Compiling a QBasic program:
import {compile} from 'qbjc';
...
const {
// Compiled JavaScript code.
code,
// Sourcemap for the compiled JavaScript code.
map,
// Abstract syntax tree representing the compiled code.
astModule,
} = await compile({
// QBasic source code.
source: 'PRINT "HELLO WORLD"',
// Optional - Source file name (for debugging information).
sourceFileName: 'hello.bas',
// Optional - Whether to bundle with Node.js runtime code in order
// to produce a standalone script.
enableBundling: false,
// Optional - Whether to minify the output.
enableMinify: false,
});
Executing the compiled code:
-
In browsers (using xterm.js):
import {Terminal} from 'xterm'; import {BrowserExecutor} from 'qbjc/browser'; // Set up xterm.js Terminal instance const terminal = new Terminal(...); await new BrowserExecutor(terminal).executeModule(code); -
In Node.js:
import {NodeExecutor} from 'qbjc/node'; await new NodeExecutor().executeModule(code); -
In Node.js with bundling enabled (i.e. compiled with
enableBundling: true):import {run} from './hello.bas.js'; await run();
Compatibility
What works:
-
Core language features
- Control flow structures - loops, conditionals,
GOTO,GOSUBetc. - Data types - primitive types, arrays and user-defined types (a.k.a. records)
- Expressions - arithmetic, string, comparison, boolean
SUBs andFUNCTIONsDATAconstants- Many built-in commands and functions like
VAL,STR$,INSTR,MID$
- Control flow structures - loops, conditionals,
-
Text mode
- Basic text mode I/O -
PRINT,INPUT,INKEY$,INPUT$etc. - Text mode screen manipulation -
COLOR,LOCATEetc. - Note that the current implementation depends on a VT100-compatible terminal emulator.
- On Windows, this means using WSL or something like PuTTY.
- In the browser, the implementation uses xterm.js.
- Basic text mode I/O -
-
It's just enough to run the original
NIBBLES.BASgame that shipped with QBasic:
What doesn't work (yet):
- Graphics and audio
- Events -
ON ERROR,ON TIMERetc. - OS APIs like file I/O,
CALL INTERRUPTetc. - Direct memory access -
PEEK,POKEetc. - Less common syntax, inputs or options
- ...and more - contributions are welcome!
For detailed compatibility information on individual commands and functions, see 👉 Implementation Status.
About
qbjc is distributed under the Apache License v2.
Related Skills
node-connect
339.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.9kCommit, push, and open a PR
