~/todd-fleeman/portfolio — session log

Todd Fleeman

Technical Product Manager · Front-End Developer · Product Engineer

I build the things I wish existed, then I ship them.

description of me

Ten years of shipping proof-of-concepts first and asking permission never. This is the log of the latest one.

01 — about

entry, ongoingggg

Most job descriptions ask for a PM or an engineer. I've never been able to split the two apart, and after ten years of trying, I've stopped pretending I should. The PM half decides what's worth building and why. The engineer half builds it well enough to actually learn something. Neither one works without the other — a roadmap I can't prototype is a guess, and code without a reason to exist is a hobby.

The pattern underneath all of it is: build the smallest real thing first, then argue from evidence instead of opinion. I've run that same loop at three separate jobs across eleven years, and I ran it again building this site's flagship project. It's not a philosophy I adopted for interviews — it's just how the work gets done.

what i'm looking for

A team that hires on the work itself — portfolios and pull requests over take-home puzzles and whiteboard trivia. Ideally somewhere a technical PM is expected to open a PR, not just file a ticket for one.

screenshot or diagram for this entry
entry — Graphics

SVGR

Curabitur lacinia ex id ex consectetur, sit amet scelerisque turpis bibendum. Vestibulum nunc risus, eleifend auctor laoreet fringilla, congue sit amet dui. Vestibulum at venenatis mauris. Nullam sed tellus id lorem porttitor semper at eget dolor. Aenean ullamcorper massa non aliquam feugiat. Suspendisse tincidunt faucibus mattis. In a dui quis eros sollicitudin vestibulum a ut erat. Phasellus sit amet lacinia tortor, id tempor urna. Phasellus feugiat, urna et consectetur tincidunt, leo dolor auctor velit, nec scelerisque massa lectus in massa. Mauris in lorem turpis.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Accessibility
Ongoing

The 508 audit: fixed, partial, and fixed-for-real

Example from the actual audit log: "character-modal.jsx:118 — focus trap: FIXED (5/2) → re-tested with VO 5/9, trap failed on tab-out, PARTIAL → root cause was a stale ref, fixed 5/10, re-verified 5/11."

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — Architecture
Resolved

CMS-driven page builder, and why Canvas over SVG

The PageBuilder stores each character page as an ordered list of typed blocks (hero, bio, gallery, stat-strip) resolved against a schema, so adding a new character never touches code. The harder call was the neighborhood visualizer — an interactive map of where every character lives. I built it on Canvas instead of D3/SVG. SVG gives you a DOM node per element, which is convenient until you have a hundred animated nodes competing for layout and paint on a phone. Canvas trades that convenience for one thing to draw and full control over the render loop — worth it once the visualizer needed hover states, zoom, and animation running together without janking on mobile.

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — HTML5
Ongoing

HTML5 Audio

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In gravida mollis diam vel imperdiet. Cras ipsum sapien, lobortis at massa et, ullamcorper mattis lectus. Nulla suscipit viverra arcu. Nulla facilisi. In posuere sodales sem, at laoreet felis laoreet ac. Maecenas sagittis nunc sagittis, bibendum nisi eu, commodo ante. Donec est eros, consequat vel ipsum eget, bibendum volutpat ipsum. Fusce tincidunt enim felis, et consectetur justo faucibus a. Praesent molestie ligula non arcu tempus, nec ornare augue ullamcorper. Integer hendrerit fringilla sapien, vel interdum augue pulvinar at. Vivamus lobortis feugiat commodo. Morbi auctor blandit metus, at aliquam dolor rutrum non. Pellentesque semper magna et gravida condimentum. Sed nec tincidunt justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — HTML5
Resolved

Hanging Card

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Graphics

SVGR

Curabitur lacinia ex id ex consectetur, sit amet scelerisque turpis bibendum. Vestibulum nunc risus, eleifend auctor laoreet fringilla, congue sit amet dui. Vestibulum at venenatis mauris. Nullam sed tellus id lorem porttitor semper at eget dolor. Aenean ullamcorper massa non aliquam feugiat. Suspendisse tincidunt faucibus mattis. In a dui quis eros sollicitudin vestibulum a ut erat. Phasellus sit amet lacinia tortor, id tempor urna. Phasellus feugiat, urna et consectetur tincidunt, leo dolor auctor velit, nec scelerisque massa lectus in massa. Mauris in lorem turpis.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Web Audio API
In Progress

A frequency-reactive visualizer that turns whatever's playing into moving shapes on screen.

Pulled out of mothballs while debugging the Jukebox's still-open active-character glow bug — needed a smaller surface to test animation-frame timing against, away from the rest of the Betwixt codebase.

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Architecture
Resolved

CMS-driven page builder, and why Canvas over SVG

The PageBuilder stores each character page as an ordered list of typed blocks (hero, bio, gallery, stat-strip) resolved against a schema, so adding a new character never touches code. The harder call was the neighborhood visualizer — an interactive map of where every character lives. I built it on Canvas instead of D3/SVG. SVG gives you a DOM node per element, which is convenient until you have a hundred animated nodes competing for layout and paint on a phone. Canvas trades that convenience for one thing to draw and full control over the render loop — worth it once the visualizer needed hover states, zoom, and animation running together without janking on mobile.

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — HTML5
Ongoing

HTML5 Audio

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In gravida mollis diam vel imperdiet. Cras ipsum sapien, lobortis at massa et, ullamcorper mattis lectus. Nulla suscipit viverra arcu. Nulla facilisi. In posuere sodales sem, at laoreet felis laoreet ac. Maecenas sagittis nunc sagittis, bibendum nisi eu, commodo ante. Donec est eros, consequat vel ipsum eget, bibendum volutpat ipsum. Fusce tincidunt enim felis, et consectetur justo faucibus a. Praesent molestie ligula non arcu tempus, nec ornare augue ullamcorper. Integer hendrerit fringilla sapien, vel interdum augue pulvinar at. Vivamus lobortis feugiat commodo. Morbi auctor blandit metus, at aliquam dolor rutrum non. Pellentesque semper magna et gravida condimentum. Sed nec tincidunt justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — Accessibility
Ongoing

The 508 audit: fixed, partial, and fixed-for-real

Example from the actual audit log: "character-modal.jsx:118 — focus trap: FIXED (5/2) → re-tested with VO 5/9, trap failed on tab-out, PARTIAL → root cause was a stale ref, fixed 5/10, re-verified 5/11."

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — HTML5
Ongoing

HTML5 Audio

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In gravida mollis diam vel imperdiet. Cras ipsum sapien, lobortis at massa et, ullamcorper mattis lectus. Nulla suscipit viverra arcu. Nulla facilisi. In posuere sodales sem, at laoreet felis laoreet ac. Maecenas sagittis nunc sagittis, bibendum nisi eu, commodo ante. Donec est eros, consequat vel ipsum eget, bibendum volutpat ipsum. Fusce tincidunt enim felis, et consectetur justo faucibus a. Praesent molestie ligula non arcu tempus, nec ornare augue ullamcorper. Integer hendrerit fringilla sapien, vel interdum augue pulvinar at. Vivamus lobortis feugiat commodo. Morbi auctor blandit metus, at aliquam dolor rutrum non. Pellentesque semper magna et gravida condimentum. Sed nec tincidunt justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — HTML5
Resolved

Hanging Card

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Graphics

SVGR

Curabitur lacinia ex id ex consectetur, sit amet scelerisque turpis bibendum. Vestibulum nunc risus, eleifend auctor laoreet fringilla, congue sit amet dui. Vestibulum at venenatis mauris. Nullam sed tellus id lorem porttitor semper at eget dolor. Aenean ullamcorper massa non aliquam feugiat. Suspendisse tincidunt faucibus mattis. In a dui quis eros sollicitudin vestibulum a ut erat. Phasellus sit amet lacinia tortor, id tempor urna. Phasellus feugiat, urna et consectetur tincidunt, leo dolor auctor velit, nec scelerisque massa lectus in massa. Mauris in lorem turpis.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Accessibility
Ongoing

The 508 audit: fixed, partial, and fixed-for-real

Example from the actual audit log: "character-modal.jsx:118 — focus trap: FIXED (5/2) → re-tested with VO 5/9, trap failed on tab-out, PARTIAL → root cause was a stale ref, fixed 5/10, re-verified 5/11."

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Dawgnation

Click ME!
screenshot or diagram for this entry
entry — Web Audio API
In Progress

A frequency-reactive visualizer that turns whatever's playing into moving shapes on screen.

Pulled out of mothballs while debugging the Jukebox's still-open active-character glow bug — needed a smaller surface to test animation-frame timing against, away from the rest of the Betwixt codebase.

project: Lab

Click ME!
screenshot or diagram for this entry
entry — Architecture
Resolved

CMS-driven page builder, and why Canvas over SVG

The PageBuilder stores each character page as an ordered list of typed blocks (hero, bio, gallery, stat-strip) resolved against a schema, so adding a new character never touches code. The harder call was the neighborhood visualizer — an interactive map of where every character lives. I built it on Canvas instead of D3/SVG. SVG gives you a DOM node per element, which is convenient until you have a hundred animated nodes competing for layout and paint on a phone. Canvas trades that convenience for one thing to draw and full control over the render loop — worth it once the visualizer needed hover states, zoom, and animation running together without janking on mobile.

note —

Rule of thumb I used: SVG when elements need to be individually inspectable (accessibility, click targets); Canvas when the element count outgrows what the DOM should reasonably hold.

project: Betwixt

project: Lab

Click ME!
screenshot or diagram for this entry
entry — HTML5
Ongoing

HTML5 Audio

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In gravida mollis diam vel imperdiet. Cras ipsum sapien, lobortis at massa et, ullamcorper mattis lectus. Nulla suscipit viverra arcu. Nulla facilisi. In posuere sodales sem, at laoreet felis laoreet ac. Maecenas sagittis nunc sagittis, bibendum nisi eu, commodo ante. Donec est eros, consequat vel ipsum eget, bibendum volutpat ipsum. Fusce tincidunt enim felis, et consectetur justo faucibus a. Praesent molestie ligula non arcu tempus, nec ornare augue ullamcorper. Integer hendrerit fringilla sapien, vel interdum augue pulvinar at. Vivamus lobortis feugiat commodo. Morbi auctor blandit metus, at aliquam dolor rutrum non. Pellentesque semper magna et gravida condimentum. Sed nec tincidunt justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

note —

Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.

project: Betwixt

project: Lab

project: Dawgnation

Click ME!