/* global React */ const { useEffect, useRef, useState, useMemo } = React; /* ---------- magnetic custom cursor + sticker hover labels ---------- */ function Cursor() { const ref = useRef(null); const target = useRef({ x: -100, y: -100 }); const pos = useRef({ x: -100, y: -100 }); useEffect(() => { const el = ref.current; const onMove = (e) => { target.current.x = e.clientX; target.current.y = e.clientY; }; const handleEnter = (e) => { const t = e.target.closest("[data-cursor]"); if (!t) return; const mode = t.getAttribute("data-cursor"); const label = t.getAttribute("data-label") || ""; el.classList.remove("hot", "text"); if (mode === "hot") el.classList.add("hot"); if (mode === "text") el.classList.add("text"); el.setAttribute("data-label", label); }; const handleLeave = (e) => { const t = e.target.closest && e.target.closest("[data-cursor]"); if (!t) return; el.classList.remove("hot", "text"); el.setAttribute("data-label", ""); }; window.addEventListener("mousemove", onMove); document.addEventListener("mouseover", handleEnter); document.addEventListener("mouseout", handleLeave); let raf; const tick = () => { pos.current.x += (target.current.x - pos.current.x) * 0.22; pos.current.y += (target.current.y - pos.current.y) * 0.22; el.style.transform = `translate(${pos.current.x}px, ${pos.current.y}px) translate(-50%, -50%)`; raf = requestAnimationFrame(tick); }; tick(); return () => { window.removeEventListener("mousemove", onMove); document.removeEventListener("mouseover", handleEnter); document.removeEventListener("mouseout", handleLeave); cancelAnimationFrame(raf); }; }, []); return
; } /* ---------- NAV ---------- */ function Nav() { const [open, setOpen] = React.useState(false); React.useEffect(() => { document.body.style.overflow = open ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [open]); const links = [ { href: "#services", label: "Services" }, { href: "#work", label: "Work" }, { href: "#process", label: "Process" }, { href: "#team", label: "Team" }, { href: "#faq", label: "FAQ" }, ]; return ( <>
Menu · 05 sections
setOpen(false)}> Start a Project
EMAIL hello@viralinbound.in
PHONE +91 89684 30834
STUDIO Koramangala, BLR
made loud, EST. MMXX
); } /* ---------- HERO ---------- */ function Hero() { const layerRef = useRef(null); useEffect(() => { const layer = layerRef.current; if (!layer) return; const onMove = (e) => { const rect = layer.getBoundingClientRect(); const cx = rect.width / 2; const cy = rect.height / 2; const dx = (e.clientX - rect.left - cx) / cx; const dy = (e.clientY - rect.top - cy) / cy; layer.querySelectorAll("[data-depth]").forEach((node) => { const d = parseFloat(node.getAttribute("data-depth")); node.style.transform = `translate(${dx * d}px, ${dy * d}px) rotate(${node.dataset.r || 0}deg)`; }); }; window.addEventListener("mousemove", onMove); return () => window.removeEventListener("mousemove", onMove); }, []); // scramble effect on the headline word const [scrambled, setScrambled] = useState("LOUDER"); useEffect(() => { const target = "LOUDER"; const pool = "QWERTYUIOPASDFGHJKLZXCVBNM#@$%&!?"; let i = 0; const id = setInterval(() => { const out = target.split("").map((ch, idx) => { if (idx < i) return ch; return pool[Math.floor(Math.random() * pool.length)]; }).join(""); setScrambled(out); i += 0.5; if (i >= target.length + 4) i = 0; }, 80); return () => clearInterval(id); }, []); return (
No agency BS, est. 2020 Made in 🇮🇳 ★ ★ ★ ★ ★
A design studio for the chronically online EST. MMXX · BENGALURU

We make
brands{" "} {scrambled}.

We're a small studio building brands, products and websites that people actually screenshot. No templated decks. No design-by-committee. Just sharp work, made loud.

Book an intro call See the work
); } /* ---------- TICKER ---------- */ function Ticker({ items, variant = "" }) { const content = [...items, ...items, ...items]; return (
{content.map((it, i) => ( {it} ))}
); } /* ---------- SERVICES ---------- */ function Services() { const services = [ { cls: "svc--brand", num: "01", title: <>Brand identity., body: "Logos, wordmarks, motion ID and the entire visual religion around them. We don't do moodboards we don't believe in.", list: ["Naming", "Logo & wordmark", "Type & color system", "Brand guidelines", "Packaging & merch"], emoji: "✺", }, { cls: "svc--ux", num: "02", title: <>UI & UX that fits., body: "App flows, dashboards, design systems, prototypes. We treat your product like our own — because for 4 months, it is.", list: ["Research & flows", "Wireframes", "Hi-fi design", "Design systems", "Figma → reality"], emoji: "◐", }, { cls: "svc--web", num: "03", title: <>Websites that convert., body: "Design + development. Marketing sites, e-com, landing pages. Built in Framer, Webflow, Next.js — whatever fits the job.", list: ["Strategy & copy", "Design", "Development", "CMS & headless", "SEO foundations"], emoji: "✦", }, ]; return (
What we do · 03 services

Three things.
Done loudly.

We don't do everything. We do three things, and we do them like our names are on the door — because they are.

{services.map((s, i) => (
{s.num} / 03

{s.title}

{s.body}

{s.list.map((l, j) => {l})}
{s.emoji}
))}
); } /* ---------- WORK ---------- */ function Work() { const cases = [ { cls: "case--6", viz: "viz--mango", name: "Mango Mango", cat: "Brand identity · 2025", title: "Loud ice cream from Goa.", tag: "+312% DTC sales", visual: }, { cls: "case--6", viz: "viz--fold", name: "Fold", cat: "Product UX · 2024", title: "A neobank for freelancers.", tag: "1.2M onboarded", visual: }, { cls: "case--4", viz: "viz--halo", name: "Halo", cat: "Brand + app · 2024", title: "Meditation, minus the woo.", tag: "App Store editor's pick", visual: }, { cls: "case--4", viz: "viz--bolt", name: "Bolt Coffee", cat: "Web + identity · 2025", title: "Specialty coffee. With teeth.", tag: "Awwwards SOTD", visual: }, { cls: "case--4", viz: "viz--pilot", name: "Pilot Studios", cat: "Brand system · 2023", title: "Indie game studio rebrand.", tag: "Featured · It's Nice That", visual: }, ]; return (
Selected work · 2023 — 2026

We made these
a little famous.

A few projects we're proud of. Click any of them to ask us how we'd do yours.

{cases.map((c, i) => (
{c.visual}
{c.cat}
{c.name} — {c.title}
{c.tag}
))}
); } function BigStamp({ text, sub }) { return (
{text}
{sub}.
SCOOPED FRESH
); } function FoldViz() { return (
FOLD · BALANCENOV 24
₹4,29,810
{[34, 56, 22, 78, 44, 90, 60].map((h, i) => (
))}
+12.4% this month▲ UP
); } function HaloViz() { return (
halo. BREATHE IN
); } function BoltViz() { return (
BOLT
specialty coffee.
); } function PilotViz() { return (
{["P","I","L","O","T","S"].map((l, i) => (
{l}
))}
PILOT · INDIE GAME STUDIOS · BRAND SYSTEM
); } /* ---------- PROCESS ---------- */ function Process() { const steps = [ { n: "01", title: <>Interrogate., body: "We get nosy. Two weeks of questions, audits and uncomfortable truths. We arrive with opinions; we leave with a brief.", hand: "🔍", rot: "-2deg" }, { n: "02", title: <>Provoke., body: "We sketch the safe option and the unsafe one. We pitch the unsafe one harder. You decide.", hand: "✺", rot: "1.5deg" }, { n: "03", title: <>Ship., body: "We design, build and launch with teeth. Every handoff is dev-ready, every milestone has a date — and it sticks.", hand: "🚀", rot: "-1deg" }, { n: "04", title: <>Stay., body: "We don't ghost after launch. 60-day support, optimization sprints, and a Slack channel we actually answer in.", hand: "♥", rot: "2deg" }, ]; return (
How it works · 04 phases

A process that
refuses to be generic.

{steps.map((s, i) => (
PHASE {s.n} / 04

{s.title}

{s.body}

{s.hand}
))}
); } Object.assign(window, { Cursor, Nav, Hero, Ticker, Services, Work, Process, Furniture }); function Furniture({ num, label, ghost = "", position = "right", stars = true }) { // Editorial decoration for plain sections: ghost section number, spine label, // corner crop/registration marks, and a few scattered serif glyphs. return ( ); }