// ───────────── Work / Archive page ───────────── const TWEAK_DEFAULTS_WORK = /*EDITMODE-BEGIN*/{ "palette": "aurora", "grain": true }/*EDITMODE-END*/; const PROJECTS = [ { id: "halocene", tag: "Brand", name: "Halocene", sub: "Audio hardware rebrand", year: "2026", industry: "Consumer hardware", color: "#FF7A4D", color2: "#C13B3B", shape: "wave", metrics: [{ k: "+247%", l: "DTC revenue" }, { k: "23 wks", l: "Strategy → launch" }, { k: "1.4M", l: "Launch reach" }], summary: "A complete identity refresh for a Sydney-based audio brand shipping into 14 markets. We rebuilt the strategy, designed a new visual language, shot a six-piece campaign and shipped a new commerce site.", what: ["Brand strategy", "Visual identity", "Packaging", "Launch film", "Commerce site"] }, { id: "meinhaus", tag: "Site", name: "MeinHaus", sub: "Service-provider directory", year: "2025", industry: "Marketplace", color: "#3E60FF", color2: "#7B57FF", shape: "stack", metrics: [{ k: "8.4x", l: "Marketing ROAS" }, { k: "142k", l: "Listings on launch" }, { k: "97", l: "Lighthouse" }], summary: "A two-sided marketplace for German home services. We took a 5-month-old prototype and rebuilt it as a multilingual platform with native search, lead routing and a payments layer.", what: ["Product design", "Search & matching", "Next.js build", "Stripe Connect"] }, { id: "wikistrings", tag: "Campaign", name: "Wikistrings", sub: "Guitar-string review platform", year: "2025", industry: "Editorial", color: "#1F1F1F", color2: "#3a3a3a", shape: "type", metrics: [{ k: "+412%", l: "Organic search" }, { k: "62k", l: "Reviews indexed" }, { k: "1.2s", l: "TTI" }], summary: "A specialist editorial platform for musicians. We designed a custom type system, built a fast headless CMS and shipped an SEO engine targeting 2,400 long-tail queries.", what: ["Editorial design", "Type system", "Headless CMS", "SEO engine"] }, { id: "amps", tag: "Product", name: "AMPS Institute", sub: "Entrepreneurship education", year: "2024", industry: "EdTech", color: "#B5FD5B", color2: "#46E0A3", shape: "grid", metrics: [{ k: "+183%", l: "Course completion" }, { k: "12.4k", l: "Active learners" }, { k: "4.9", l: "NPS" }], summary: "A learning platform for first-time founders. We redesigned the curriculum architecture, built a Sanity-backed CMS for instructors, and shipped a cohort-aware progress system.", what: ["Product design", "Curriculum architecture", "Sanity build", "Cohort tooling"] }, { id: "northvane", tag: "Brand", name: "Northvane", sub: "Boutique architecture firm", year: "2024", industry: "Architecture", color: "#0F1417", color2: "#243038", shape: "orb", metrics: [{ k: "+89%", l: "Qualified leads" }, { k: "11", l: "Award entries won" }, { k: "0.8s", l: "Avg. page load" }], summary: "A new identity and site for a Melbourne studio designing carbon-light homes. Restrained, monochrome system that lets the architecture do the talking.", what: ["Brand strategy", "Identity", "Photography direction", "Custom site"] }, { id: "verdant", tag: "Campaign", name: "Verdant Co.", sub: "DTC skincare launch", year: "2023", industry: "Beauty / CPG", color: "#E7DCC2", color2: "#A28D62", shape: "leaf", metrics: [{ k: "$2.4M", l: "Launch revenue, 90d" }, { k: "62%", l: "Repeat rate" }, { k: "8.2x", l: "Paid ROAS" }], summary: "A from-scratch DTC launch for a clean-skin brand. We owned strategy, brand, e-commerce build and the first 90 days of paid + lifecycle marketing.", what: ["Naming & strategy", "Identity", "Shopify build", "Paid + lifecycle"] }, { id: "tideflow", tag: "Site", name: "Tideflow", sub: "Coastal real estate", year: "2023", industry: "Real estate", color: "#0B7A8C", color2: "#1FB6C6", shape: "wave", metrics: [{ k: "+218%", l: "Enquiries" }, { k: "$48M", l: "Inventory live" }, { k: "94", l: "Lighthouse" }], summary: "A flagship property site for a Byron Bay agency. Hand-shot photography, a custom listing CMS and a discovery experience that doubled as a brand vehicle.", what: ["Brand", "Photography", "Custom CMS", "Webflow"] }, { id: "kasai", tag: "Product", name: "Kasai", sub: "Restaurant ops tool", year: "2023", industry: "Hospitality SaaS", color: "#2A1A1A", color2: "#5C2C2C", shape: "grid", metrics: [{ k: "−42%", l: "Onboarding time" }, { k: "8 wks", l: "MVP shipped" }, { k: "4.8", l: "App rating" }], summary: "An iOS / iPad app that lets a small chef-led team run prep, comms and pass in one screen. Designed and built in 8 weeks from a single founder conversation.", what: ["Product design", "React Native", "Real-time sync"] }, { id: "olivetti", tag: "Brand", name: "Olivetti & Sons", sub: "Family olive estate", year: "2022", industry: "Agriculture / DTC", color: "#3E4E2A", color2: "#7A8F4D", shape: "leaf", metrics: [{ k: "+341%", l: "DTC orders" }, { k: "14", l: "Retail stockists" }, { k: "8", l: "Awards" }], summary: "A second-generation rebrand for a 60-year-old olive grove. We took an inherited identity, distilled the family story into a typographic system, and launched a DTC commerce site.", what: ["Brand strategy", "Packaging", "Photography", "Shopify"] }, { id: "axon", tag: "Product", name: "Axon Bio", sub: "Lab inventory platform", year: "2022", industry: "Biotech", color: "#0a1a2a", color2: "#1a3a5a", shape: "stack", metrics: [{ k: "−68%", l: "Misplaced samples" }, { k: "11", l: "Pilot labs" }, { k: "99.97%", l: "Uptime" }], summary: "A biotech inventory tool built for fast-moving research labs. Real-time location tracking via passive RFID, a clean dashboard, and a Slack integration for alerts.", what: ["Product design", "Engineering", "RFID integration"] }, { id: "lumen", tag: "Site", name: "Lumen Press", sub: "Independent publishing", year: "2022", industry: "Publishing", color: "#1a1612", color2: "#3a3024", shape: "type", metrics: [{ k: "+178%", l: "Subscriber growth" }, { k: "84", l: "Books cataloged" }, { k: "92", l: "Lighthouse" }], summary: "A typographic showcase site for an indie press. Built around a hand-tuned font stack and a CMS that handles cross-references, footnotes and reading time.", what: ["Editorial design", "Custom type", "Sanity"] }, { id: "drift", tag: "Campaign", name: "Drift Travel", sub: "Slow travel platform", year: "2021", industry: "Travel", color: "#3a2a1a", color2: "#7a5a3a", shape: "orb", metrics: [{ k: "+92%", l: "Booking conv." }, { k: "23 wks", l: "Strategy → launch" }, { k: "$1.8M", l: "Year-one bookings" }], summary: "A small-batch travel platform for design-curious people. We launched the brand, built the site, and ran year-one paid + content. Their first guidebook is in its second print.", what: ["Brand", "Editorial", "Webflow", "Growth"] }, { id: "northsky", tag: "Brand", name: "Northsky Labs", sub: "Climate tech foundry", year: "2021", industry: "Climate tech", color: "#0e1a30", color2: "#1a3a6a", shape: "stack", metrics: [{ k: "$24M", l: "Series A raised" }, { k: "4", l: "Spinouts launched" }, { k: "62", l: "Researchers" }], summary: "Identity and pitch system for a climate-tech foundry. We made the science look like the story it is — legible, urgent, and quietly confident.", what: ["Brand strategy", "Identity", "Pitch system"] }, ]; function Filters({ filter, setFilter, accent }) { const opts = ["All", "Brand", "Site", "Product", "Campaign"]; return (
{opts.map(f => ( ))}
); } function ArchiveBigCard({ p, accent, expanded, onToggle }) { return (
{expanded && (
{p.tag} {p.year}

{p.summary}

What we did
{p.what.map(w => {w})}
{p.metrics.map(m => (
{m.k}
{m.l}
))}
Talk about a similar project
)}
); } function Archive({ accent }) { const [filter, setFilter] = useState("All"); const [open, setOpen] = useState(PROJECTS[0].id); const visible = filter === "All" ? PROJECTS : PROJECTS.filter(p => p.tag === filter); return (
Archive · {visible.length} projects
2017 → 2026
{visible.map((p) => ( setOpen(o => o === p.id ? null : p.id)}/> ))}
); } function FeaturedHero({ accent }) { // Featured case — Halocene const p = PROJECTS[0]; return (
Featured case
{p.tag} {p.year} {p.industry}

{p.name}

{p.summary}

{p.metrics.map(m => (
{m.k}
{m.l}
))}
See full archive
); } // ProjectArt is defined in sections.jsx and registered on window const ProjectArt = window.ProjectArt; function WorkApp() { const t = useSiteTweaks(TWEAK_DEFAULTS_WORK); const accent = PALETTES[t.palette] || PALETTES.aurora; return (
); } const workRoot = ReactDOM.createRoot(document.getElementById("root")); workRoot.render();