A working portfolio of 33 deployed applications.
Each card is a live deploy, stating its stack, its build time and its source. TypeScript, JavaScript and Python — models trained in Web Workers, simulation run on the GPU, and ten public-record rooms built from data a government already publishes.
33 apps 0 accounts 0 prices ~339 hours of work
Watch it learn
Learning in the browser: a GPT trained from scratch, retrieval over a pasted document, image classification and three trained controllers.
8-
LLM demo
A GPT written from scratch in TypeScript with no dependencies — tokeniser, self-attention, hand-derived backpropagation and AdamW all explicit — trained and sampled in a Web Worker, so the tab never blocks and no prompt leaves the browser.
-
RAG demo
Retrieval that shows its work: the document is chunked, embedded and searched, and every answer cites the passages it used beside the dates, places and people it pulled out. Inference on Cloudflare Workers AI, so the answer can be checked.
-
Moon lander
A search-based controller rather than a gradient-trained one: each attempt is scored, the search runs in a Web Worker, and the page plots what each generation achieved. The first 360 generations fail on the published score.
-
Vision ML demo
An image classifier trained in the browser on labels you supply: a Web Worker trains so the tab stays responsive, weights persist in IndexedDB, and loss and per-class accuracy are charted, with thirty practise shapes built in.
-
Circle ML
Points are scattered at random across a square and labelled only inside or outside the circle. A binary classifier given that one bit of feedback and no geometric prior draws the boundary itself in WebGL — the fit visible, not described.
-
Pong ML
Two agents trained against each other, rewarded by the difficulty each causes the other rather than by winning. The page solves for the ball speed past which no paddle can intercept in time — a limit computed, not guessed.
-
Asteroids ML
Hill climbing rather than backpropagation: a controller is scored on survival time in a Web Worker and keeps whichever change lives longer. Shooting emerged from that reward — nobody scripted it.
-
Lottery odds
Nineteen draw histories, three fitted models and a backtest against the draws themselves. No model beats chance, which is the finding; what the page can do is avoid crowd-picked numbers, and it shows the arithmetic per line.
Play & tinker
Real-time Canvas and WebGL games, a password generator, a word-cloud renderer and a card game — all client-side.
6-
Red Queen vs. Laser Sharks
Ten levels, three lives, and one rule that makes the fairness arithmetic: a shark cannot fire until it has turned to face you. The rules live in their own module behind three.js, with a Node server for the shared board.
-
Card sharks
Higher-or-lower in React on Ant Design components: each guess is scored against the probability of the next draw, and the best streak is kept as you play rather than reset with the page.
-
Sudoku ML
Six difficulties in React, with Apollo Client for data and Encrypt Storage writing games and mistakes to the device — so a half-finished board is still there next visit.
-
Stellar Forge
400,000 stars integrated on the GPU every frame — WebGPU compute with a WebGL 2 fallback picked at runtime — with pointer input bending the arms and a click sending a shockwave through the field.
-
Password please
Generated in the client with a length and character-set control, so no candidate is transmitted and there is no server that could log one. React on Ant Design; the whole tool is one page.
-
Word cloud
Frequency ranking done in the browser, then laid out with Ant Design Charts and exported as SVG or PNG — so the image is a real vector rather than a screenshot, and the text is never uploaded.
Places & stories
Maps, a globe and a cladogram over published geometry — live aircraft positions, hominin finds, a news wire, trailer builds.
6-
Airplane Watch
Live positions from the adsb.lol feed over OpenStreetMap tiles, with a PostgreSQL airport survey resolving a place name to an airport code; a watched airframe raises a notice when it departs, and the fence is drawn rather than described.
-
Hominin Atlas
A globe over world-atlas geometry with every hominin find placed where it was recovered, dated to the range the paper gives, and joined by the genetic evidence for flow between lineages — each figure carrying its source.
-
antitomato.com
Next.js and PostgreSQL: the original petition, the collected stories, and a wire that polls Google News for tomato coverage. Submissions pass Cloudflare Turnstile, so the petition is not a spam target.
-
gord100
Ten trailer builds written up as guides and served by Express from Pug templates — Helmet for headers, Gmail for contact, and nothing dynamic where nothing needed to be.
-
Bass Family
Eighty-three fishes that carry the name bass, plotted on the cladogram their genetics actually gives and drawn as SVG, because a shared shape is convergence, not kinship.
-
tiny-voice
Recorded in the parent's own voice with Web Audio and MediaRecorder, stored in IndexedDB on the device, played from a board a child can use — no upload, no account, no advertising.
Under the hood
The three that are more than a page: a Python radio server, a DNS-verified domain sale and an MQTT broker.
3-
Domain Name Sale
Next.js and PostgreSQL with ownership proved rather than claimed: the server resolves a DNS record before a listing goes live. Offers are private and submissions pass Cloudflare Turnstile.
-
FM radio
A Python standard-library HTTP server driving a USB FM radio. The scan only reports a station when the 19 kHz stereo pilot is present, so adjacent-channel noise never appears as an entry; the spectrum is drawn on Canvas.
-
MQTT broker
An MQTT broker on Aedes with LevelDB persistence and topic authorisation, shipped as a Docker image — the one piece of infrastructure here rather than a page, and the only thing on this list a server has to run.
Check a record
Public records indexed and searchable — inspections, recalls, wages, prices, populations, filings — each linked to source.
10-
Recall Radar
A static index over recalls the government already publishes: searchable by brand, category and issue month, with every entry linking to the notice it came from. Node 22 build, SVG charts, no client dependencies.
-
Kitchen File
Toronto food-premises inspections as the inspector wrote them: pass, conditional pass, closure, and the infractions. Built at build time into static pages with SVG charts, so it carries no runtime dependency and no query to log.
-
Before You Sign
A building's own file before a lease is signed: the city's evaluation and enforcement history on one page, each claim linked to its source. Static HTML from a Node 22 pipeline, so nothing is queried at runtime.
-
Safe to Eat
Provincial fish advice per waterbody, with the guide's own codebook linked rather than translated — a mistranslation here would be health advice — built as static pages from a Node 22 pipeline.
-
Company File
Every federal corporation, its status and its filing history, published as static pages, with search running in the browser against a sharded index rather than against a server.
-
Campus Record
Ontario career-college enforcement actions — notice, order, penalty — indexed per institution and per action, built as static pages so it can be read before tuition is paid.
-
Work File
Employment counts by occupation and region from Statistics Canada's table, with a suppressed cell drawn as a gap: a figure that was withheld is not a zero, and the page refuses to pretend otherwise.
-
What It Costs
Consumer Price Index series by city and year, read from the published table and charted without adjustment — the number on the page is the number in the release, and the source is named.
-
Pay File
Average hourly and weekly wages by industry and province from the published labour-force table, presented as the record it is — no ranking, no normalisation, no derived headline.
-
Pop File
Municipal population estimates for July 1 of each year, published as static pages and kept labelled as estimates: a census count and an annual estimate are different figures and the page does not conflate them.
Contact
Ask about anything here.
Name the app you mean and what you want it to do. The form goes straight to me.
Privacy policy
Last changed 19 September 2026.
This page covers one site: nodejavascript.com — the index, the portfolio of apps and the contact form. It is written from what the code actually does, because a policy the site does not keep to is worse than none.
The apps are their own sites. Each one has its own policy, linked from the app itself. This page is about the index you are reading, and nothing more.
What this site collects
Reading a page here sends nothing about you anywhere. There is no account, no sign-in, and there is no server-side record of a visit. The pages are files.
The one thing you can send is the contact form: the name, the email address and
the message you type are posted to /api/contact on this domain and emailed
to whoever runs this site, so that the message can be answered. Nothing else is done
with them, and they are not put in a database.
There is a hidden field in that form that no person can see or fill. It exists to catch automated submissions; if it is filled, the message is discarded. It is not about you.
Cookies
There is one optional cookie, and it is off unless you turn it on: Google Analytics, which records anonymous page views, which links people press and how far down a page they read.
Google's script is not in this page at all. It is appended only if you allow it,
so a visit that refuses makes no request to Google and receives no cookie — not "cookies
disabled", never loaded. Your answer is remembered in your own browser's storage under
the name analytics_consent rather than in a cookie, because setting a
cookie to record a cookie decision would be its own small joke.
You can change your answer at any time with Cookie settings in the footer.
What this site does not do
- No account, no profile, and no advertising or tracking network of any kind.
- No selling, renting or sharing of anything with anybody.
- No secret evaluation of your visit beyond the optional statistics above.
Contact
Questions about this page, or about anything the site holds, go through the contact form on the home page.
Changes
If what the site stores changes, this page changes on the same day and the date at the top of it moves.