// ───────────── About / Studio page ───────────── const TWEAK_DEFAULTS_ABOUT = /*EDITMODE-BEGIN*/{ "palette": "aurora", "grain": true }/*EDITMODE-END*/; function ManifestoBlock({ accent }) { return (
Manifesto

Built for the
second decade
of the internet.

Digitacurve started in 2017 as a two-person studio in a Surry Hills warehouse with a kettle, a borrowed router and an outsized opinion about craft.

Nine years and 142 clients later, we still pick projects one at a time. We still write the brand voice, draw the wireframes, and ship the code — usually in the same week.

We don’t do bench-warmers. We don’t do design-by-committee. We do useful, beautiful, on-time — and we measure the work against what it earned, not what it cost.

— Mira Rajan & Theo Kassidis
Founders

); } function NumbersStrip({ accent }) { const stats = [ { n: "142", l: "Brands shipped" }, { n: "9", l: "Years in studio" }, { n: "4", l: "Studios, 3 timezones" }, { n: "+183%", l: "Avg. growth, year one" }, { n: "4.96", l: "Studio rating" }, ]; return (
{stats.map((s, i) => (
{s.n}
{s.l}
))}
); } function Values({ accent }) { const values = [ { n: "01", t: "Craft over volume", d: "We’d rather ship one thing perfectly than ten things approximately. We turn down 9 in 10 enquiries." }, { n: "02", t: "Senior only", d: "Every project is run by a senior designer and senior engineer. No juniors hiding behind the deck." }, { n: "03", t: "Show, don’t pitch", d: "We don’t do credentials decks. We do working prototypes by week one, no exceptions." }, { n: "04", t: "Outcome-led", d: "We measure our work in revenue, engagement and joy — not impressions, deliverables or hours billed." }, ]; return (
Values

Four ideas we won’t compromise on.

{values.map((v, i) => (
{v.n}

))}

); } function Timeline({ accent }) { const items = [ { y: "2017", t: "Studio one", d: "Mira & Theo open Digitacurve out of a Surry Hills warehouse. First client: a Sydney indie bookstore." }, { y: "2019", t: "First award", d: "Awwwds Site of the Day for Halocene. The team grows to six." }, { y: "2021", t: "Bangalore opens", d: "Engineering pod set up in Bangalore to keep the studio running 22 hours a day." }, { y: "2023", t: "100th project", d: "We ship our 100th brand. We celebrate by closing the studio for a week." }, { y: "2024", t: "Growth team forms", d: "We start running paid + lifecycle in-house. Growth retainers become half our book." }, { y: "2025", t: "NYC + London", d: "Studios open in New York and London. Headcount: 38." }, { y: "2026", t: "AI workflows", d: "We add a small AI practice — for content ops, RAG search and personalisation." }, ]; return (
Timeline

Nine years, in seven moments.

{items.map((it, i) => (
{it.y}

{it.t}

))}
); } function Team({ accent }) { const people = [ { n: "Mira Rajan", r: "Founder, Creative", i: "MR", c1: "#7e5cff", c2: "#43e8ff" }, { n: "Theo Kassidis", r: "Founder, Engineering", i: "TK", c1: "#b5fd5b", c2: "#46e0a3" }, { n: "Jules Kim", r: "Head of Brand", i: "JK", c1: "#ff6b9d", c2: "#ffd66e" }, { n: "Asha Tan", r: "Head of Growth", i: "AT", c1: "#6ee7ff", c2: "#a78bfa" }, { n: "Sam Park", r: "Head of Engineering", i: "SP", c1: "#ff8a5c", c2: "#ff5cc8" }, { n: "Leila Dahir", r: "Head of Content", i: "LD", c1: "#46e0a3", c2: "#b5fd5b" }, { n: "Noah Wilkes", r: "Studio Director, NYC", i: "NW", c1: "#a78bfa", c2: "#ff6b9d" }, { n: "Priya Singh", r: "Studio Director, BLR", i: "PS", c1: "#ffd66e", c2: "#ff8a5c" }, { n: "Ben Holloway", r: "Studio Director, LON", i: "BH", c1: "#43e8ff", c2: "#7e5cff" }, { n: "Iris Romero", r: "Senior Designer", i: "IR", c1: "#d894ff", c2: "#6ee7ff" }, { n: "Kenji Watanabe", r: "Senior Engineer", i: "KW", c1: "#b5fd5b", c2: "#a7f3ff" }, { n: "Zara Idris", r: "Strategy Director", i: "ZI", c1: "#ffb14a", c2: "#f24e64" }, ]; return (
The studio

38 people. One craft team.

The faces below are the senior leads you’ll actually work with. No bait-and-switch, no agency layer.

{people.map((p, i) => (
{p.i}
{p.n}
{p.r}
))}
); } function StudioLife({ accent }) { const tiles = [ { c1: "#1a2a4a", c2: "#0f1525", t: "Surry Hills HQ", sub: "Sydney" }, { c1: "#3a2418", c2: "#1f1411", t: "All-hands Fridays", sub: "Studio one" }, { c1: "#0f2820", c2: "#0a1813", t: "Bangalore pod", sub: "WeWork Galaxy" }, { c1: "#2a1a3e", c2: "#160c22", t: "Annual offsite", sub: "Byron Bay, 2025" }, { c1: "#3a1f1f", c2: "#1f0f0f", t: "Library wall", sub: "Books we’ve worn out" }, { c1: "#1f3a2f", c2: "#0f1f17", t: "Studio dog", sub: "Wally, est. 2021" }, ]; return (
Studio life

Working here, in six frames.

{tiles.map((t, i) => { const span = i === 0 ? "col-span-2 row-span-2" : i === 3 ? "col-span-2" : ""; return (
{/* Procedural shapes */} {Array.from({ length: 24 }).map((_, k) => { const cx = (i * 30 + k * 17) % 400; const cy = (i * 50 + k * 23) % 300; return ; })}

); })}

); } function Awards({ accent }) { const items = [ "Webby — Best Agency Site, 2025", "Awwwds — SOTD ×17", "FWA — Cutting Edge, 2024", "Brand New — Best of 2024", "Communication Arts — Design Annual 65", "TYPE Directors Club — Cert. of Excellence", "Fast Company — Innovation by Design", "ADC — Gold Cube, 2023", ]; return (
Recognition

Some shiny things.

Awards aren’t the point — the work is. But every now and then a juror disagrees.

{items.map((it, i) => (
{it}
))}
); } function Careers({ accent }) { const roles = [ { t: "Senior Brand Designer", l: "Sydney", c: "Studio team" }, { t: "Senior Engineer (Next.js)", l: "Remote / Bangalore", c: "Product team" }, { t: "Growth Strategist", l: "New York", c: "Growth team" }, { t: "Motion Designer", l: "Sydney or remote", c: "Studio team" }, ]; return (
Careers

Want to join?

We hire slowly and rarely. If the role below feels like yours, send us three pieces of work you’re proud of and one you’re not.

{roles.map((r, i) => ( e.currentTarget.style.background="rgba(255,255,255,0.025)"} onMouseLeave={e=>e.currentTarget.style.background="transparent"}>
{r.t}
{r.l}
{r.c}
))}
Don’t see your role? Send us a note anyway. 4 open · 12 reviewed this month
); } function AboutApp() { const t = useSiteTweaks(TWEAK_DEFAULTS_ABOUT); const accent = PALETTES[t.palette] || PALETTES.aurora; return (
See selected work Start a project
); } const aboutRoot = ReactDOM.createRoot(document.getElementById("root")); aboutRoot.render();