Ahad Engineer

Ahad

Engineer

I build spiking neural networks, simulators you can watch think, and apps that refuse to talk to the internet.

Each one gets its own typeface, its own thesis, and an honest list of what it cannot do.

This page has a throttle. Skim it in thirty seconds, or open it up.

Work

Spiking neural networks · Python, Numba · Research

NeuroFlux

A spiking neural network that strips powerline hum from ECG with no labels, no reference channel and no idea of the frequency.

Fig. 01A LIF population encoding a noisy ECG. Illustrative re-implementation in JavaScript, not the research code.

● Livewaiting for telemetry…

“No labeled data, no reference noise channel, no prior knowledge of the interference frequency required.”

Two mechanisms work together. The passive architecture — LIF membrane filtering, Poisson rate encoding, population decoding — keeps clinical R-peaks intact at every noise level. STDP learning adds amplitude-domain SNR at low input SNR and pays for it in landmark fidelity. Phase 3 ran the whole thing on the MIT-BIH Arrhythmia Database and pinned down exactly where it wins.

Python · Numba @njit · uv · MIT-BIH · SQLite sweeps

synthetic ECG configs significant at p < 0.01
192/192
on real MIT-BIH ECG, R-peak integrity 0.985
+2.26 dB
runs in the synthetic sweep, 576 configs × 10 seeds
5,760
test coverage on the core engine
97%

Hic sunt erratae. STDP buys 3–4 dB but costs R-peak fidelity, and on EEG and pure tones it loses (−3.4 dB, −2.0 dB). The Phase 4 baselines are not built yet.

Theory of computation · React, TypeScript, custom SVG

Automata Visualis

A DFA builder and step-by-step simulator drawn in the manner of a mid-century mathematics journal.

Fig. 02A DFA tracing δ* one symbol at a time. Real simulator, re-implemented for this page.

● Livewaiting for telemetry…

“A finite automaton is a small printed object.”

Load one of eight presets or draw your own machine, then watch a vermillion token trace δ* across the diagram one symbol at a time. Diagnostics flag nondeterminism and unreachable states as you edit, undo is throttled so a long drag is one entry, and every machine fits in a URL.

Vite · React · TypeScript · Zustand + zundo · elkjs

preset DFAs with hand-tuned layouts
8
closed-form edge router, no layout solving
3 cases
React Flow, D3 or Tailwind — pure SVG
0
machines share as base64 in the URL hash
0 servers

Hic sunt erratae. Only Mode II ships; regex → DFA and minimisation are roadmap. No automated tests yet, and no ε-transitions.

Android · Kotlin, Jetpack Compose, Room

Luna

A period tracker whose data never leaves the phone. No account, no cloud, no internet permission.

Fig. 03The cycle ring: solid behind today, hairline ahead. Recreated from the app’s home screen.

● Livewaiting for telemetry…

“The only data that cannot be leaked is data that was never collected in the first place.”

Phase boundaries come from your own history, not a 28-day default. The home ring draws every phase twice, split at today — solid behind you, a hairline ahead — so the drawing itself is the marker. Logged days are filled, predicted days are hollow: a guess never looks like a fact.

Kotlin 2.2 · Compose · Room · Hilt · kotlinx-datetime

permissions in AndroidManifest.xml
0
unit tests on the cycle maths
45
minified release APK
1.8 MB
luteal phase held; follicular absorbs the rest
14 days

Hic sunt erratae. No backup, no export, no sync — deliberately. Lose the phone and the data goes with it, and the README says so up front.

Algorithms · vanilla ES modules, Canvas 2D, rough.js

Labyrinthus Hexagonalis

BFS, A* and DFS race across identical copies of one seeded hex maze, each in its own ink.

Fig. 04Three expeditions, one seed. Real BFS, A* and DFS, re-implemented for this page.

● Livewaiting for telemetry…

“Algorithms have personalities, and those personalities can be drawn.”

A recursive backtracker carves the maze on a pointy-top axial grid. Every solver is a generator that yields step descriptors, so one loop drives three algorithms it never has to understand. Each ink also has its own fill pattern, so the race stays readable under colour-blindness.

ES modules · Canvas 2D · rough.js · Web Animations · mulberry32

solvers racing on identical mazes
3
Folio Seed reproduces maze and ink jitter
32-bit
wall bitmask per cell
6-bit
build steps — open index.html and it runs
0

Hic sunt dracones. Resize mid-solve and the expeditions misalign until reset. The field is only ever a rectangle of hexes.

Under the hood

This whole site is one variable.

Colour, weight, width, spacing, how much moves: everything you watched change is calculated from --rev, a single registered custom property between 0 and 1. The throttle sets it; CSS does the rest. While you drag, --rev runs ahead of its committed twin --grev, so letterforms stretch live and the layout waits for you to let go.

--rev0.000

— fps · — · — declarations read the throttle

Gear 1 and 2 run no animation loop, so there is nothing to measure. Shift up to watch the frame graph.

Frame time, last 120 frames · dashed line = 60 fps
Live telemetry from each miniature
MiniatureStatusTelemetry