Webflow CMS
Our core practice for marketing and content sites. Webflow gives clients a real CMS without locking out engineering — every platform restriction forces a sharper solution.
Webflow handles the structural lift. We layer hand-rolled custom code for what the platform won't do natively — GSAP, Lenis, Finsweet, custom embeds for the rest.
Next.js Framework
When the work is an application — auth, billing, dashboards, dynamic data — Next.js is our default. App Router, Server Components, edge where it earns its place.
We use Next.js for internal tools to public SaaS. RSC plus edge let us co-locate data fetching with UI without giving up static-render perf. TypeScript is non-negotiable.
Astro Static
For content-heavy sites without full app behavior, Astro is faster, lighter, and easier to ship than Next.js. We drop React components in only where they earn weight.
Island architecture is the unlock. Default zero-JS, hydrate only where interactivity is needed. Documentation sites, content-rich marketing, and portals like Hubsflow all run on Astro.
Shopify Commerce
For ecommerce, we build on Shopify with custom Liquid theming. No headless unless there's a real reason — native checkout and payments are too good to leave on the table.
French Girl Vintage runs on a custom Liquid theme with custom typography, editorial layouts, and CCPA-compliant policies. Storefront API only when we need product data on an external surface.
GSAP Animation
GSAP is how we choreograph what CSS can't reach — coordinated timelines, scroll-driven sequences, motion that has to feel intentional.
Every site we ship has GSAP timelines for the loader and hero. Motion has to mean something — if it can be removed without changing the read of the page, we remove it. ScrollTrigger is reserved for moments where scroll itself is the experience.
Lenis Scroll
Lenis gives us inertial scroll without the overhead of older libraries. Plays nicely with ScrollTrigger and stays out of the way on touch devices.
Default lerp of 0.1, momentum on, clean RAF loop — that's the whole config most of the time. We disable on routes that need native scroll snapping or when reduced-motion is set.
Radix UI Primitives
Headless, accessible component primitives. Radix handles keyboard nav, focus trapping, ARIA, edge cases — we provide the styling.
For app work, Radix is the foundation. Dialogs, popovers, tooltips, dropdowns — getting accessibility wrong locks real users out. Not worth doing by hand.
Tailwind Styling
Utility-first CSS with design tokens. Tailwind makes the design system enforceable in code — not a Notion doc nobody reads.
The token layer is where Tailwind earns its keep. Colors, spacing, type, radii, shadows — defined once in tailwind.config.ts, consumed everywhere. Brand color shifts mean one variable change.
For Webflow we don't use Tailwind directly — the class system handles the same job. Discipline transfers: tokens first, custom classes second, one-off styles never.



