2013
Kohl's
Lead Web Developer
Rewrote the Kohls.com front end.
Senior Front-End Engineer · Tech Lead
A Little About Me
I’m the creator of Magic Spells, an open-source suite of web components, and Tarot, a carousel with real physics. I’ve been building for the web for over twenty years. I enjoy building and working with good design systems, in Figma and in code.
I’ve also hired and built front-end teams from the ground up. At Pura I hired and trained the team, then led the full rebuild of pura.com. The relaunch doubled the site’s conversion rate, and Shopify did a case study on it.
Shopify case study: rebuilding pura.com
2013–Today
From a Fortune 500 rewrite to a billion-dollar tequila brand to founding a web app framework and an open-source component library.
'13
Lead Web Developer
Rewrote the Kohls.com front end.
'16
Co-founder
Launches for Milwaukee Tool and Empire Level.
'18
Front-End Developer
Custom Shopify themes. Casamigos Tequila.
'22
Sr. Front-End Developer / Tech Lead
Rebuilt pura.com, hired and trained the team.
'24
Founder
Open-source web components, the Tarot carousel, and the Puzzle framework.
'25
Front-End Developer
Dashing Diva, and Grande Cosmetics.
'26
Sr. Front-End Developer / Tech Lead
Cherokee Uniforms.
Everyday Stack
Free & Open Source
A carousel with real physics.
A springy, scrubbable carousel that you can throw, catch, and scrub by hand. Every frame is driven by a real spring, not a CSS transition.
Free to use. Find it at magicspells.io
A complete web app framework that’s simpler and faster to use than React, Vue, and Svelte.
A front-end web app framework: single-file .pzl components, reactive data,
and a Go + esbuild compiler.
$ npm i @magic-spells/puzzle
Preview the music app<puzzle-view>
<button class="counter" @click={ increment }>
Clicked { count } times
</button>
</puzzle-view>
<script>
export default {
data: () => ({ count: 0 }),
increment() {
this.setData({ count: this.getData().count + 1 });
},
};
</script> A complete component library, built for Puzzle.
Primitives, overlays, data display, charts and editors — every one a native
.pzl component. The CLI copies the source into your app, so a piece is
yours to restyle rather than a dependency to fight.
$ puzzle add piece button select
Browse the libraryChoreography you can scrub.
Group animation scenes in a timeline. Drive the timeline with scroll position, scroll trigger, or scrub events. Loop scenes, randomize positions, and use physics based animations.
$ npm i @magic-spells/timeline-engine
Text that makes an entrance.
A web component that splits a line into words, characters, or measured lines and animates each unit on a CSS-driven stagger. Eight built-in effects, no dependencies, and no framework to adopt. Drop the tag around your copy and it reveals itself when it scrolls into view.
$ npm i @magic-spells/split-text
Effect
<split-text effect="rise" split="chars"> Interfaces that morph into each other.
A spring-driven shared-element morph. It measures what you clicked, flies its rect, radii, background, and shadow into the target’s, and reveals the real element in lockstep. Reverse it mid-flight and it simply turns around.
$ npm i @magic-spells/morph-engine
click to see me morph
Long-term memory for AI agents.
Plan your project as a connected graph of typed cards: pages, endpoints, tables, flows. Agents read and update the graph as they work, so plans and context survive from session to session instead of starting over every conversation.
$ npm i -g @magic-spells/constellation
Plus all of these
Magic Spells is named for that brain-freeze moment when something just works, feels beautiful, and you want to know how it was done. Frameworks, interface systems, motion engines, and developer tools built to chase that feeling. All free and open source.
Explore magicspells.io
Tell me what you’re building. If it sounds like a good fit, I’ll get back to you as soon as I can.
Thanks for reaching out! I’ll get back to you soon.
Oops! Something went wrong. Please try again.