Sharif T. Issah
← All work
Case study 03Published on npm · repo ahead of npm

NOVA

A language that reads like plain instructions and compiles to pages and live HTTP services, with zero dependencies.

Role
Language design, implementation, tooling
Verification
300+ unit tests and 57 examples run through the real CLI, per the repository handoff
Design record
19 architecture decision records
Dependencies
None
Stack
JavaScript (ESM) · Node.js · npm · VS Code extension · MIT licence

Problem

Most stacks need a different language for logic, data, pages and API. NOVA explores one readable language across those layers, small enough to specify and test completely.

What I built

  • Lexer, parser, AST, semantic analyzer and tree-walking interpreter for SHOW / SET / CHANGE / IF / FOR EACH / REPEAT / DO / RETURN.
  • Lists, records, typed procedures, DATA named types, TRY / CATCH, a standard library and ASK input.
  • Persistence with SAVE, GET and DELETE, durable across a real server restart.
  • A PAGE compiler covering static HTML, data-bound content and interactive pages, where BUTTON and WHEN CLICKED compile to JavaScript.
  • SERVICE / API: a live HTTP server with GET, POST with typed request bodies, DELETE and :id path parameters, serving compiled pages alongside the API.
  • FORM and INPUT for typed user input, plus an editor extension for VS Code.

Architecture

Compiler and runtime layout, from src/

src/
  lexer/  parser/  ast/
  analyzer/        semantic checks, diagnostics
  interpreter/     tree-walking evaluator
  stdlib/          standard library
  persistence/     SAVE / GET / DELETE, durable store
  pagecompiler/    NOVA -> HTML + JavaScript
  apiserver/       SERVICE / API -> live HTTP
  cli.js           nova run | build | serve

Example source from the repository: SET total = 0 FOR EACH product IN products SHOW "{product.name}: {product.price}" CHANGE total = total + product.price END

Engineering decisions

ADR before code

Every real design choice has a record with options and reasoning, and each record lists what is deferred, so a missing feature reads as a decision rather than an accident.

Smallest correct version per milestone

Features land one milestone at a time, from v0.1 to v0.18, and the repository handoff forbids bundling adjacent milestones.

Verify through the real CLI

Generated pages are executed rather than string-matched, durability is checked by killing a spawned server and reading back from a second process, and DELETE routes are checked with a real curl.

No dependencies

Installing it reports one package. Nothing transitive to audit, and the whole toolchain stays readable.

Current state and limits

  • The npm registry lists 0.15.1 as latest while the repository is at v0.18. Install from the repository for the newest features.
  • It is a tree-walking interpreter, not an optimising compiler. It is a language exploration, not a production runtime.
  • The language is young and has no third-party users that I can point to.