I build complete software systems alone, across unrelated domains — clinical, real-time, local-first. No team on any of them.
The method is the point. The limit on a solo builder is attention, not ambition: nobody holds three unrelated systems in their head at once, so the codebase has to hold itself. Every repository is written to be legible to an AI agent as readily as to a person — a generated map that CI keeps honest, module walls that are lint errors rather than conventions, a hard ceiling on file length, and a structural-debt number only permitted to move down. That is ordinary engineering discipline, mechanised; and mechanised discipline is exactly what someone working without a team does not otherwise get.
→ Measure your own vernier hyperacuity — the perceptual effect Qeben is built on, as a calibrated instrument in your browser. It measures your threshold in arcseconds, then shows you why your display is roughly 20× too coarse for the measurement to mean anything clinically. That gap is the reason the product carried a not for diagnostic use label rather than a claim.
Domain Regulated health software · higher-education systems
Interface languages Hebrew (RTL) · Arabic (RTL) · English
Contrast target WCAG AAA
Type floor 16pt body · 24pt critical
Touch targets ≥ 48px
Motion 120–320ms · disabled under prefers-reduced-motion
Colour Never the sole cue — always paired with an icon and text
Max file length 400 lines · lint-enforced
Module boundaries Cross-feature imports fail the build
Peak concurrency measured 1,000 players in a single room
Run cost at that scale $0
One clinical, one real-time, one local-first. One reached a university stage, one reached clinicians and stopped, one runs my own life. The scoreboard is stated as it is, project by project.
Home monitoring for age-related macular degeneration
A daily hyperacuity self-test that looks for macular change between clinic visits, and the triage workflow that puts the resulting alert in front of someone who can act on it. The users are 50+ and losing central vision, which sets the entire specification rather than decorating it.
Status Research prototype · never deployed
Built with Clinicians and academics
Intended users Adults 50+, losing central vision
Interface Hebrew-first RTL · AAA · 16pt floor · 48px targets · night mode as a first-class theme
Backend Multi-tenant · one bounded context per module
Regulatory posture Engineered to SaMD standards · not clinically validated · labelled not for diagnostic use
It did not reach clearance and was never deployed. It is here for the accessibility and architecture work, not as a product claim.
Live TV-format quiz game, built for a Tel Aviv University event
One hero against a mob of up to a thousand, joining with a PIN and a nickname. The interesting part is not the game — it is holding a thousand live sockets in one consistent room without a race condition and without a bill.
Peak concurrency 1,000 players, single room
Run cost $0 · roughly 50 full games per day
Concurrency model One Cloudflare Durable Object per room — serialised by construction, not by locking
Transport WebSocket Hibernation · idle sockets held open unbilled
Rules engine Pure, no I/O · 100% unit coverage
Verification Load-test harness simulating N players, so the number is measured
Local-first life-OS — study, training, habits, finance, planning
No server, no API routes, no server actions. One storage engine on both targets, so there is one set of behaviours to reason about instead of two that agree most of the time.
Shell Tauri 2 desktop · Next.js static export
Server None
Storage SQLite native on desktop · SQLite-WASM on OPFS in the browser
Source of truth The database — stores are in-memory caches over it
Migrations Hand-written SQL · Drizzle for queries and types
Diagnostics Schema version, migration ledger, row counts, query timings, N+1 flags — one button
Conventions are forgotten the week after they are agreed. These are checked by a machine, and the build fails without them — which is what makes an AI agent useful in a repository rather than a liability in one.
Boundaries are lint errors A cross-feature deep import fails the build. Module walls are enforced, not documented.
400-line ceiling Lint-enforced, so no file quietly becomes the one nobody will open.
Repo maps are generated and CI-verified Never stale. Code is located by reading one small map, not by grepping the tree.
Structural debt only ratchets down The build fails if it went up.
Accessibility is a gate AAA contrast, reduced motion, RTL and night mode ship on every screen, or the screen does not ship.
Errors carry their own diagnostics Debugging starts from evidence, not a guess.