MZ — Interactive gallery
MZ // Interactive galleryWCAG AA · Reduced-motion aware · One anonymous vote, nothing else

01 — Animated slider

What's the average dev time for a 15‑minute eLearning?

0 hours · your guess
0 hrs40 hrs

Drag to guess · release for the real number

Industry typical

~32

hours, interactive 15-min course

Mine, with the workspace

4

hours to near-final with script + build

yes, four hours.
not four days.
no, i didn't
cut corners.

A 15-minute course runs roughly 18–46 production hours depending on interactivity. Using the development workspace I built, I got to near-final in about four: writing the script and building the course.

Benchmark: Chapman Alliance, “How Long Does It Take to Create Learning?” — ~72–184 production hours per finished hour, scaled to a 15-minute (0.25 hr) course.

Could this be built in Rise / Storyline? Heavy workarounds
NativeWorkaroundsCustom code only

Storyline could drive the number with a variable. The logomark ducking in and out of the line would be a painful stack of states and triggers, and it still wouldn't feel like this. Verdict? Barely.

02 — Tokenized branding

Same course, different skin.

Drag the divider. It's the same component drawn twice from two design-token sets. One side is my website brand, the other reskins to a company I've actually built learning assets for. Same tokens, real palettes.

Reskin to a brand I've built for →

Drag the divider · click a brand to reskin the right

Using design and code primitives, courses re-skin in minutes. No more eye-dropping colors or consulting an outdated palette doc. The brand lives in one machine-readable token set the whole course is bound to. Those three swatches are the real palettes of Verizon, Square, and Pinterest. Same component, one token swap.

Could this be built in Rise / Storyline?Custom code only
NativeWorkaroundsCustom code only

Fair's fair: you could fake the wipe with two exported screenshots and a slider. But those are pictures. This is a live component, drawn twice from one token set, which is why the swatches recolor it instantly. No authoring tool has tokens, so no authoring tool does that.

03 — Live polling

good design
is invisible.
you're going
to have to squint.

Where have you seen the most value from AI at work?

Sending your vote

Couldn't reach the poll. Your vote didn't send — this can happen when the sheet is offline. Try again in a moment.

What gets stored: the option you picked and a timestamp. That's it. No IP, no cookie, no identifier that ties back to you. This is the one interaction on the page that talks to a server. Every other piece runs entirely in your browser.

Could this be built in Rise / Storyline? Custom code only
NativeWorkaroundsCustom code only

Native polls in Storyline don't aggregate across learners. They just track a single user's answer for the LMS. Sending votes to a live datastore and pulling the tally back means writing this from scratch. No authoring tool ships that.

Case Study — AI-assisted eLearning pipeline
MZ // Case Study

I turned a raw script into a brand-compliant, review-ready course. Almost automatically.

An AI-assisted production pipeline that collapses multi-day eLearning builds into a near-automated workflow. Designed and built solo, from scratch.


Who's looking?

The 30-second scan

A one-person build that automated the slowest, most error-prone part of course production.

BeforeMulti-day manual builds to same-day output
BrandOne brand spec, minimal drift
ReviewNon-technical sign-off, no dev bottleneck

Tools & skills

Cursor AI-assisted dev HTML / CSS / JS SCORM Google Apps Script Design systems Instructional design

What it proves

I can scope, design, and ship production tooling independently. Not just author content, but build the system that produces it.


The full case study.

The problem

Manual eLearning production is slow and inconsistent. Every new course re-litigates the same interactions from scratch, brand drift creeps in the moment a designer looks away, and review happens across scattered threads with no clean way to hand notes back to whoever's building. It's a lot of skilled time spent on work that shouldn't need a human every time.

What "good" had to mean

  • On-brand output with no designer babysitting the result.
  • Interactions built once as reusable parts, never re-solved per course.
  • Non-technical reviewers can approve or reject without touching code.
  • Edits round-trip cleanly back into the build environment.

What I built

An AI-assisted production framework, built in Cursor. A script goes in; a brand-compliant, review-ready SCORM course comes out. Under it sits a library of interaction primitives (originally hand-coded in HTML to do what off-the-shelf tools can't), a machine-readable brand and UI spec the generator is bound to, and an Apps Script review portal that packages the course, routes it for approval, and feeds comments back to the developer backend.

Key decisions

Guardrail as code. Rather than trusting a style checklist, I made the brand system a spec the generator has to obey, so off-brand output isn't a mistake that can happen.

Primitives over one-offs. Solving each interaction once meant the system got faster and more consistent with every course.

Review without code. The approval loop was designed for the people who sign off, not the people who build, which took the dev team out of the bottleneck.

Impact

Multi-day manual builds collapsed toward same-day output, brand consistency became automatic instead of hand-policed, and course review stopped waiting on developer availability. More to the point: it moved the team's skilled time off assembly and onto the parts that actually need judgment.

Case Study — Persistent memory for a stateless AI platform
MZ // Case Study

The platform forgot me every session. So I built it a memory.

A layered instruction system that carries who I am, what I'm building, and how I work into an AI platform that forgets everything between sessions. Designed solo, refined with the model itself.


Who's looking?

The 30-second scan

I turned a memoryless AI platform into one that starts every session already knowing how I work.

ContextLoaded at session start, not re-typed every chat
MemoryDurable facts and volatile state, split and kept current
FeelA continuation, not a first meeting

Tools & skills

Prompt & instruction design Context-window management AI collaboration Systems thinking Self-modeling / calibration Workflow design

What it proves

I can spot a platform limitation and engineer around it, shaping how an AI collaborates with me instead of just prompting it. The result is a workflow that holds its own context so I don't have to keep rebuilding it.


The full case study.

The problem

The platform had no memory between conversations. Every new chat started cold: restate the goal, the role, the constraints, the context. Long code sessions made it worse, because the work itself would fill the context window and I'd end up re-explaining problems I had already walked through minutes earlier. Every session felt like onboarding a stranger who happened to be fast.

What "good" had to mean

  • Context available at the start of a session without manual re-typing.
  • A clean split between durable facts and fast-changing state.
  • The model flags when its picture of my work has gone stale.
  • A defined working relationship, not just a data dump about me.

What I built

A layered instruction system for a stateless AI platform. Three layers do the work: a durable brief covering how I work, my role, and my goals; a dated volatile layer holding current projects and standpoints; and a persona layer defining how the model should interact with me, what I value, and what success and failure mean. To make the brief accurate, I had the model run reasoning tests and used the deltas between runs to find and cover blind spots in my own self-description.

Key decisions

Durable vs volatile. Separating stable facts from weekly churn keeps the core steady while the current-state layer stays fresh.

Calibrate against blind spots. Test deltas surfaced gaps a self-written brief would have missed, so the instructions describe me more accurately than I could unaided.

Design the relationship. Giving the model a persona and clear success and failure definitions made results land right without constant re-steering.

Impact

The honest answer is that the impact resists a clean metric, and I would rather not invent one. What changed is qualitative but real: sessions start warm instead of cold, I stopped re-explaining the same context every chat, and long code sessions no longer collapse into re-litigating solved problems. Each conversation now picks up like a continuation rather than a first meeting. The durable-versus-volatile pattern also became my default way of working with any stateless model, not just this one.