Problem
I wanted to build a phone interface on a canvas and work directly with rendering, hit-testing, gestures, and state transitions.
A playful browser phone simulation drawn on one p5.js canvas, with generated notifications, gestures, quick settings, and a passcode flow.
Product screens
The page diagrams its own build - page shell, p5.js renderer, state modules, and notification generators.

A per-source engine fills the lock screen with varied, in-character alerts on every visit.

The status bar, notification cards, and phone frame are all drawn on a single p5.js canvas.

A per-source engine fills the lock screen with varied, in-character alerts on every visit.

The page diagrams its own build - page shell, p5.js renderer, state modules, and notification generators.

The status bar, notification cards, and phone frame are all drawn on a single p5.js canvas.

The work
I wanted to build a phone interface on a canvas and work directly with rendering, hit-testing, gestures, and state transitions.
DylanOS is a fake phone, built way too seriously. A React page loads p5.js in the browser to draw the status bar, notifications, quick settings, passcode pad, home screen, and camera on one canvas. Notification generators produce in-character alerts from dozens of fictional apps. One input handler supports mouse, touch, drag, swipe, and keyboard controls.
A self-contained phone simulation with an accompanying explanation of the rendering, input, state, and performance decisions.
Framing
This browser toy explores canvas rendering and interaction design. It brings drawing, input, generated content, and state together in a small, inspectable application. I separated drawing, input, state, notifications, settings, passcode, fake OS, and camera code into modules. They share one coordinate system for the phone. Notification generators vary the alerts by source category, and the render loop pauses when the phone is not visible.
Technologies
Key features in scope
Responsibility and context
Engineering
DylanOS is a fake phone, built way too seriously. A React page loads p5.js in the browser to draw the status bar, notifications, quick settings, passcode pad, home screen, and camera on one canvas. Notification generators produce in-character alerts from dozens of fictional apps. One input handler supports mouse, touch, drag, swipe, and keyboard controls.
Technologies
Architecture choices
Key decisions
Results
A self-contained phone simulation with an accompanying explanation of the rendering, input, state, and performance decisions.
Delivered behavior
Constraints
Lessons
Canvas rendering requires explicit work on hit-testing, focus, and accessibility
Notification generators can vary synthetic content without a fixed list
Visibility checks can avoid unnecessary drawing when an animated interface is off-screen
Retrospective
I would separate the state modules further before adding a public API. I would also improve screen-reader support and automate the browser checks that I currently run manually.

AI / Workflow Tooling
An Airtable review app that checks schema and sample records, then generates interface previews, redesign proposals, and migration plans.
Read case study

Digital Platform / AI
A book, blog, and podcast platform with an assistant that retrieves published passages and presents source citations.
Read case study

AI / RAG
A philosophy dialogue app with five conversation modes, retrieval from primary texts, and a source panel for checking passages.
Read case study

AI / Social Product
A social simulation where configurable AI personas write posts and respond to one another in a shared feed.
Read case study