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.
Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.
project: Betwixt
project: Lab
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."
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
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.
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
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.
Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.
project: Betwixt
project: Lab
project: Dawgnation
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.
Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.
project: Betwixt
project: Lab
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
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.
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
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.
Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.
project: Betwixt
project: Lab
project: Dawgnation
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."
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
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.
Aenean sagittis libero quis eros sollicitudin rhoncus. Nullam quis tristique odio. In hac habitasse platea dictumst.
project: Betwixt
project: Lab
project: Dawgnation