Est. 2000 Beginner

SmallBASIC

SmallBASIC is a free, GPL-licensed BASIC interpreter written in C that Nicholas Christopoulos began in 2000 because his new Palm IIIx shipped without a decent calculator - a QBasic-flavoured language small enough for a handheld that, a quarter of a century later, is still being released for Windows, Linux, Android and a Teensy microcontroller

Created by Nicholas Christopoulos (who signed his commits and source headers 'ndc' / 'wired_gr'), with the project maintained since the mid-2000s by Chris Warren-Smith. The AUTHORS file also credits Gary A. Clark, Bob Riess, Earle F. Philhower III, Laurent Poujoulat, Mehul Sanghvi and Joerg Siebenmorgen

Paradigm Procedural and structured. Modern SmallBASIC supports IF/WHILE/REPEAT-UNTIL/SELECT CASE, nestable user-defined SUB and FUNC blocks, TRY/CATCH exception handling and separately compiled UNIT modules, while still accepting old-school line numbers, GOTO and GOSUB. Variables can hold references to SUB and FUNC blocks via the @ operator and be invoked with CALL
Typing Dynamic and implicit. There are no type declarations - a variable holds a number, a string, an array or a map as required, and conversion happens on use. The author's own 2001 description was blunt about the trade-off: 'there are no data-types, no binary output, no QB compatibility, no low-level access'
First Appeared 2000. Chris Warren-Smith's 'About SmallBASIC' article (written for PCOPY! #20 and republished on ASCII-World in 2007) opens 'The SmallBASIC project commenced in May 2000 by Nicholas Christopoulos and was initially designed for the Palm Pilot'; the SmallBASIC guide on Christopoulos's own site agrees, saying 'SmallBASIC was created by Nicholas Christopoulos in May of 2000, to be used as an advanced calculator for his Palm IIIx handheld device. In Jan of 2001, SB moved to the web as an GPL project'; the oldest entry in the project ChangeLog is '2000-05-??: 0.5.3 ndc - version 0.5.3 ready'; and source files such as src/common/kw.h carry the header 'Copyright(C) 2000 Nicholas Christopoulos'. Warren-Smith's Learn X in Y Minutes page gives 'late 1999' instead, but the author's own account dates the Palm IIIx purchase to March 2000
Latest Version 12.35 for Android, with 12.33 the current packaged Windows build (GitHub release dated 2 March 2026) and Flatpak. The in-tree ChangeLog dates 12.34 to 28 April 2026, configure.ac declares version 12.35, and commits to the master branch continue through August 2026 - the project is actively developed, not dormant

A calculator that got out of hand

SmallBASIC begins with a complaint. In March 2000 a Greek programmer named Nicholas Christopoulos bought a Palm IIIx and discovered that Palm OS, for all its elegance, shipped without what he considered a serious calculator. His solution was not to write a calculator. It was to write a BASIC.

“Couple of months ago (Mar 2K), I bought a Palm IIIx and I was really disappointed (I was expecting to include a serious calculator program). That is why I made (for PalmOS 3.3, I tested) BASIC with graphics, something between QBASIC and GWBASIC (For my opinion, Basic is a super-calculator).”

That message, posted to the project’s first homepage and preserved in the Internet Archive alongside a Greek translation, is the founding document of a language that has now outlived Palm OS, SourceForge’s Subversion service, the Franklin eBookMan, the Nokia 770 and several of its own GUI toolkits. The “Small” in the name refers to the hardware, not the ambition.

Version 0.5.3 was ready by May 2000; the SourceForge project was registered on 9 March 2001; source files still carry the header Copyright(C) 2000 Nicholas Christopoulos. Some secondary accounts - including the Learn X in Y Minutes page written by Warren-Smith - date the project to late 1999, but the author’s own words, the guide on his own site and the oldest surviving ChangeLog entry all point to 2000.

Design philosophy: a super-calculator, honestly labelled

What makes SmallBASIC unusual among hobby BASICs is how precisely its author scoped it. The 2001 homepage carried a description that most language authors would never write about their own work:

“SmallBASIC is a simple computer language, targeting on simplicity, mathematics and graphics. Its a tool for novices, for non-IT scientists, for simple and ‘silly’ algorithms. SmallBASIC IS NOT A DEVELOPER TOOL FOR PROFESSIONAL PROGRAMMERS (there are no data-types, no binary output, no QB compatibility, no low-level access, etc).”

Everything that follows in the project’s history is consistent with that statement. There is no compiler producing standalone binaries, no static typing, no attempt at QBasic bytecode compatibility. What there is instead is an unusually rich standard library for the things the target audience actually does: arithmetic, plotting, and pushing pixels around.

The mathematics library is the giveaway. SmallBASIC has matrix literals and matrix arithmetic as language-level constructs, and, as Warren-Smith’s ‘About SmallBASIC’ article lists them, built-in functions for matrices, unit conversion, trigonometry, logarithms, statistics (SUMSQ, STATSPREADS), equations (LINEQN, DIFFEQN) and 2D and 3D transformations. Solving a three-variable system is a two-line program:

1
2
3
4
A = [ 5, -2, 3; -2, 7, 5; 3, 5, 6]
B = [ -2; 7; 9]
C = LinEqn(A, B)
? "[x;y;z] = "; C

Charting is similarly built in rather than bolted on:

1
2
dat = [5, 6, 3, 7, 10]
chart LINECHART, dat, 3, 20, 17, xmax, ymax

This is a language designed by someone who wanted a better calculator and understood that a better calculator is a small programming language with graphics.

Portability as an architectural commitment

The single most consequential decision in SmallBASIC’s history was made early, at version 0.5.6 in the first months of 2001, when Christopoulos restructured the interpreter so that everything platform-specific lived behind a driver interface. The core - scanner, pseudo-compiler, bytecode runner, standard library - is portable C. Each target supplies its own device layer for display, input, sound and file access.

Within months of that change the project had back ends for Palm OS, Linux over SVGAlib, Linux over SDL, the Linux framebuffer, Win32 and DOS through DJGPP. Over the following two decades the list of drivers turned over almost completely - Helio/VT-OS, the Franklin eBookMan, the Nokia 770’s GTK, FLTK, SDL2, SDL3, Android’s NDK, Emscripten, Teensy bare metal - while the core changed comparatively little. The 2012 GitHub migration retired a decade of dead ports in one commit, and the architecture absorbed it without drama.

That same design is why the graphics engine could fall back to ASCII output on text-only devices, and why the interpreter has been able to reach targets as different as a Franklin eBookMan reader and a WebAssembly sandbox in a browser tab.

The language itself

SmallBASIC deliberately accepts both halves of BASIC’s history. Line numbers, GOTO and GOSUB work, so a listing typed out of a 1982 magazine has a fair chance of running. But the modern syntax is fully structured:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func fib(n)
  if n < 2 then
    fib = n
  else
    fib = fib(n - 1) + fib(n - 2)
  fi
end

for i = 0 to 10
  ? i; " -> "; fib(i)
next i

Statements are terminated by newlines, with : available to put several on one line. Beyond the QBasic baseline, the language has picked up features that are unusual in this family:

FeatureNotes
UNIT modulesSource can be partitioned into separately loadable units with exported names
Function pointersfp = @foo captures a SUB or FUNC; CALL fp invokes it, and pointers can be passed as arguments
TRY / CATCHStructured exception handling, present in the keyword table alongside SELECT and UNIT
CHAINTakes a file name, a line of code or an array of strings and executes it as a separate process, returning control once it completes; ENV shares variables with the parent - runtime code generation, in a BASIC
Maps and arraysDynamic, untyped containers with literal syntax
Loadable C modulesExternal plugins extend the interpreter without recompiling it

The CHAIN statement in particular gives the language a self-modifying quality that would be at home in a Lisp:

1
2
code = "for i = 0 to 10: ? i: next i"
CHAIN code

Two maintainers, twenty-six years

Christopoulos drove the project through its formative years and committed for the last time on 2 January 2006. Chris Warren-Smith, whose first commits appear in April 2004, has maintained it ever since - an unbroken stewardship of more than two decades that is rare for a hobbyist language and is the main reason SmallBASIC is still installable today.

His involvement predates his commit access: the ChangeLog credits “Chris’s port” - the Franklin eBookMan target - to February 2002. His own account of what he used SmallBASIC for, in the 2007 “About SmallBASIC” article, is worth recording, because it is the opposite of a marketing claim:

“It was never really intended that SmallBASIC would be used to deliver code to a paying customer. However the console version can be a useful tool for building relatively complex scripts as part of your development process. For example I have used SmallBASIC to generate complicated SQL statements from an input properties file. I have also used it to create a Java database access layer code generator.”

Under his maintenance the project shed its dead platforms, moved to Git and GitHub in May 2012, gained an Android build in 2013, formalised a plugin system in 2018, dropped the leading zero from its version numbers in 2020, and reached the browser via WebAssembly in 2022. Joerg Siebenmorgen has been contributing since November 2021 and maintains the Raspberry Pi GPIO module separately.

Not to be confused with Microsoft Small Basic

There are two unrelated languages with nearly this name. SmallBASIC - one word, capital BASIC - is this project: begun in 2000, written in C, GPL-licensed, and community-maintained. Microsoft Small Basic - two words - is a separate .NET-based educational language released by Microsoft in 2008. They share an ancestor in the BASIC tradition and nothing else: no code, no syntax lineage, no authors, no organisation.

Where it stands in 2026

SmallBASIC is often catalogued as a dormant Palm-era curiosity. It is not. The SDL build reached Flathub in January 2026, 12.33 was released for Windows on 2 March 2026 and tagged for FreeBSD on 4 March; the ChangeLog records 12.34 on 28 April 2026; the tree bumped to 12.35 in August 2026 and commits have continued past that. The project’s own download page lists 12.35 on Google Play and 12.33 for Windows and Flatpak. The SDL back end moved to SDL 3.x in May 2025, the Android app is apparently the primary distribution channel, and the repository recorded more than a hundred commits in each of 2025 and 2026 to date.

The community is small - a Discourse forum, a Flathub package reporting roughly a couple of hundred installs a month, a handful of regular contributors - but it is continuous, which over twenty-six years is a rarer achievement than size.

Why it matters

SmallBASIC is a useful case study in what makes a small language survive. It had no institutional backing, no funding, no standardisation body and no killer application. What it had was a narrow, honestly stated purpose and an architecture that separated the language from the machine.

That separation is the whole story. Because the interpreter was portable C with swappable device drivers, SmallBASIC could follow the hardware wherever it went: from a Palm IIIx to a Nokia tablet to an Android phone to a browser to a Teensy board. Languages with far larger communities have died when their single target platform died. SmallBASIC has outlived at least six of its own.

It also preserves something genuinely useful. The BASIC that shipped with home computers - type a line, see a result, draw a circle without importing anything - largely disappeared from mainstream computing, and the modern replacements tend to demand a toolchain before they will print “Hello”. SmallBASIC still starts, still runs a one-line program, and still plots a chart with one statement, on hardware that did not exist when it was written.

Timeline

2000
Nicholas Christopoulos writes SmallBASIC for the Palm. His own account, preserved on the project's first homepage, is disarmingly direct: 'Couple of months ago (Mar 2K), I bought a Palm IIIx and I was really disappointed (I was expecting to include a serious calculator program). That is why I made (for PalmOS 3.3, I tested) BASIC with graphics, something between QBASIC and GWBASIC (For my opinion, Basic is a super-calculator).' The oldest surviving ChangeLog entry records version 0.5.3 as ready in May 2000 - the month both Warren-Smith's 'About SmallBASIC' article and the guide on Christopoulos's own site give as the project's start
2001
A year of rapid iteration and of the project outgrowing the Palm. The SourceForge project is registered on 9 March 2001, and versions 0.5.4a through 0.8.0 land between February and December: colour support, PEN (lightpen) handling in the QBasic manner, file I/O, DRAW and PLAY, Japanese SJIS and Big5 character sets contributed by users, matrix and chart routines. Version 0.5.6 is the structural turning point - the interpreter is split so that platform-specific code lives in interchangeable drivers, and by 0.7.0 there are back ends for PalmOS, Linux/SVGAlib, Linux/SDL, the Linux framebuffer, Win32 and DOS via DJGPP
2002
Releases 0.8.1 (its last ChangeLog entry dated 31 March) and 0.8.2 (14 April) consolidate the multi-platform design, and the year opens with two community ports recorded in the ChangeLog as 'Earle's port' and 'Chris's port' - Earle F. Philhower III's VT-OS/Helio target and Chris Warren-Smith's Franklin eBookMan target, both dated February 2002. April brings the low-level MALLOC / PEEK / POKE / BCOPY / VADR commands, an odd fit for a language whose own homepage advertised 'no low-level access'
2004
The generational handover begins. Chris Warren-Smith's first commits appear on 12 April 2004, tagged 'updates for 0.9.0g', and Laurent Poujoulat commits the PalmOS 5-compatible version a month later. Version 0.9.0 introduces human-language files for messages and keywords, so the interpreter's own diagnostics could be localised
2006
Christopoulos's last commit to the tree is dated 2 January 2006, and Warren-Smith takes over as maintainer - a role he still holds twenty years later. Under his stewardship the emphasis shifts from squeezing into 16-bit handhelds to a desktop-quality IDE built on FLTK, and to a GTK build for Nokia's Linux-based 770 internet tablet
2012
The project migrates from SourceForge Subversion to GitHub, carrying its imported CVS and SVN history (which reaches back to September 2003) with it. The first commit of the GitHub era, dated 7 May 2012, reads 'Cleanup obsolete modules; see SVN repo in sourceforge for originals', and further 'remove obsolete modules' commits follow through May and July - a decade of ports to Helio/VT-OS, the Franklin eBookMan and other vanished hardware is retired over a few months. The surviving desktop targets are consolidated into SDL and FLTK trees
2013
Work on the Android port starts in November 2013. Delivered through the NDK with the interpreter core unchanged, it becomes what is now apparently the project's most-used distribution channel, published on Google Play under the package name net.sourceforge.smallbasic - the SourceForge lineage still visible in the app ID
2016
Version 0.12.6 is tagged on 14 May 2016 - one of the first releases tagged in the GitHub repository, which had begun tagging with 0.11.17_Linux in May 2015. A dedicated console platform directory appears in the tree the same month, giving SmallBASIC a graphics-free build usable as an ordinary shell scripting tool
2018
The smallbasic.plugins repository is created in February 2018, formalising loadable modules written in C. This is what lets the language reach outward without bloating the core: bindings for the raylib game library, the Nuklear immediate-mode GUI, WebSockets, GLFW and the clipboard are all developed here rather than in the interpreter
2020
The version numbering drops its leading zero. The ChangeLog's last 0.12.18 entry and its first 12.19 entry share the date 13 February 2020 - an implicit declaration that the language had left beta some time earlier. The same year fills out the plugin catalogue that later ships with the packaged builds: the WebSocket module is added to the plugins repository in July 2020 and raylib in October, joining Nuklear from 2018; the first 12.20 ChangeLog entries are dated 21 October 2020
2022
An Emscripten build appears in the tree in March 2022, compiling the C interpreter to WebAssembly and putting a working SmallBASIC IDE in the browser at smallbasic.github.io/online/sbasic.html. Joerg Siebenmorgen, whose first commits to the interpreter land in November 2021, becomes a regular contributor over this period, and separately maintains a PiGPIO module - his SmallBasicPIGPIO repository was created in December 2021 - that exposes the Raspberry Pi's GPIO header to BASIC programs
2025
SmallBASIC goes back to a device smaller than the Palm that started it. An experimental runtime for the Teensy microcontroller board is committed in January 2025 and released in December, running the interpreter on bare metal; the Teensy firmware release is published on 6 December 2025. The same year brings a rewritten Android editor keypad (August), an editor find command, experimental USB serial (February) and Bluetooth (April) support on Android, and a commit in May upgrading the SDL back end to SDL 3.x
2026
The SDL build reaches Flathub in January - the ChangeLog records the Flatpak build created at 12.32 on 20 January and a Flatpak fix at 12.33 three days later - and 12.33 is then released for Windows on 2 March and tagged for FreeBSD on 4 March; the ChangeLog records 12.34 on 28 April with fixes to plugin variable lifecycles and Chromebook stability. By August the tree has bumped to 12.35 and commits continue - twenty-six years after a disappointing PDA calculator, SmallBASIC is still shipping

Notable Uses & Legacy

Palm OS handhelds

The reason the language exists and the origin of the 'Small' in its name. SmallBASIC gave Palm devices a QBasic-like environment with graphics, sound, matrix and trigonometric functions, plus File Save / Save As / Open File operations on a device that had no native filesystem - the archived README.PALM in the source tree still explains how to work within Palm OS's split dynamic and storage heaps

Android (Google Play)

The most widely installed SmallBASIC today. The Android build wraps the same C interpreter in an NDK app with an on-device editor, a custom programming keypad, graphics, sound, location and - in recent versions - experimental USB serial and Bluetooth access, making the phone a self-contained BASIC machine in the spirit of the original Palm target

Nokia 770 and N800 internet tablets

A GTK/Hildon build targeted Nokia's Maemo Linux tablets in the mid-2000s, distributed from Warren-Smith's own 'Programs for the Nokia 770' page. Its July 2006 release notes describe the form support added for the platform - a BUTTON statement taking radio, checkbox, submit, label, calendar, file, font, colour and choice types, a TEXT statement and a modal or modeless DOFORM - along with listening sockets, so that two SmallBASIC instances could talk to each other over TCP. In his 2007 'About SmallBASIC' article Warren-Smith wrote that with those statements 'SmallBASIC could be used as kind of "ultra RAD" tool for building a forms based workflow applications'

Raspberry Pi GPIO

Joerg Siebenmorgen maintains SmallBasicPIGPIO, a loadable C module that binds the pigpio library so that BASIC programs can drive the Raspberry Pi's GPIO header directly - one of the clearest demonstrations of the plugin architecture, since the hardware access lives entirely outside the interpreter core

Teensy microcontrollers

An experimental platform added in 2025 runs the SmallBASIC interpreter on the Teensy MCU board, with a firmware release published in December 2025. It is the smallest target the project has ever had, and a direct continuation of the original design constraint: an interpreter written in portable C with all platform-specific code isolated in swappable drivers

Browser-based teaching and experimentation

The Emscripten build compiles the interpreter to WebAssembly and hosts a full editor and runtime at smallbasic.github.io/online/sbasic.html, which the download page offers in both a standard and a large-font variant. No installation, no toolchain - which for a language explicitly aimed at 'novices' and 'non-IT scientists' is arguably its most natural distribution form

Language Influence

Influenced By

BASIC GW-BASIC QBasic

Running Today

Run examples using the official Docker image:

docker pull
Last updated: