const { useState, useEffect } = React; /* ============================================================ THRYVX buyer-first product studio site Same lab aesthetic, plain-language content, honest + explainable visuals. ============================================================ */ /* ---------- Tiny atoms ---------- */ const Mono = ({ children, style }) => {children}; const Tag = ({ children, tone = "default" }) => { const tones = { default: { bg: "rgba(19,19,24,0.06)", color: "var(--ink-soft)", border: "1px solid rgba(19,19,24,0.08)" }, live: { bg: "rgba(201,81,42,0.12)", color: "var(--accent)", border: "1px solid rgba(201,81,42,0.25)" }, dev: { bg: "rgba(19,19,24,0.04)", color: "var(--ink-soft)", border: "1px dashed rgba(19,19,24,0.30)" } }; return ( {tone === "live" && } {children} ); }; const PrimaryBtn = ({ children, onClick, style }) => ; const GhostBtn = ({ children, onClick, style }) => ; function Logo() { return (
ThryvX
); } /* ---------- NAV ---------- */ function Nav({ onContact }) { return ( ); } /* ---------- HERO ---------- */ function Hero({ onContact }) { return (
An independent engineering studio Senior-led · enterprise pedigree

Put AI to work.
Build software that lasts.

ThryvX helps businesses use AI in ways that actually pay off, and build the apps and platforms their operations depend on, secure from day one, fully owned by you, and engineered to outlast the hype.

Start a conversation document.getElementById("how").scrollIntoView({ behavior: "smooth" })}> See how we work
What we help with
AI that earns its keep · Apps, portals & platforms · Security & trust · Systems that scale
); } /* ---------- Leverage visual (honest, explainable) ---------- */ function LeverageCard() { const W = 320, H = 200, P = 28; // Two illustrative paths. "Add people": value rises in proportion to cost (straight line). // "Build leverage": a small team + good systems keeps producing more over time (gentle curve). const linear = `M ${P} ${H - P} L ${W - P} ${P + 36}`; const pts = []; for (let i = 0; i <= 40; i++) { const t = i / 40; const x = P + t * (W - P * 2); // ease-out style curve that overtakes the straight line const y = (H - P) - Math.pow(t, 0.62) * (H - P * 2); pts.push([x, y]); } const lever = "M " + pts.map(p => `${p[0].toFixed(1)} ${p[1].toFixed(1)}`).join(" L "); return (
Two ways to grow
Leverage, not headcount
{/* axes */} {/* "add people" straight line */} {/* "build leverage" curve */} {/* axis labels */} WHAT YOU GET TIME →
A studio that builds leverage
A shop that adds people

What this shows: a typical agency grows your output by billing more hours. Cost and results rise together, forever. We build systems that do the heavy lifting, so a senior-led team keeps delivering more without you paying for an ever-growing crew.

Illustrative concept
); } /* ---------- CHASM BAND ---------- */ function ChasmBand() { return (

There's a chasm between wanting AI and actually running on it, between a promising prototype and a platform you can trust. Crossing it is the hard part. That's the part we do.

); } /* ---------- WHAT WE DO ---------- */ const FOCUS = [ { code: "01", sub: "AI Enablement", problem: "“Everyone says we need AI. Where does it actually help us?”", title: "Put AI to work", body: "We find the places in your business where AI genuinely saves time or money, build it into the tools your team already uses, and make sure it keeps earning its keep. No science projects, no buzzwords.", bullets: ["Find the use cases worth doing", "Build it into real workflows", "Prove it actually helps"], glyph: {[0, 60, 120, 180, 240, 300].map((a, i) => { const r = 26; const x = 40 + Math.cos(a * Math.PI / 180) * r; const y = 40 + Math.sin(a * Math.PI / 180) * r; return ; })} }, { code: "02", sub: "Apps, Portals & Platforms", problem: "“We need real software built, and we want to own it.”", title: "Build the platform you run on", body: "A customer portal, an internal tool, or the core platform your whole business runs on. We design and build software that fits how you actually work, replaces brittle manual processes, and is yours to keep.", bullets: ["Customer & internal platforms", "Replace manual, error-prone steps", "Built to grow with you"], glyph: }, { code: "03", sub: "Security & Reliability", problem: "“It has to be secure, and it has to keep working as we grow.”", title: "Make it secure and built to last", body: "Software that handles real data and real money has to be trustworthy. We build with security and reliability from the first line, and clean up the aging systems that slow you down, so what you ship today still stands in five years.", bullets: ["Security built in from day one", "Reliable as you scale up", "No lock-in, no decay"], glyph: } ]; function FocusSection() { return (
What we do

Three problems we're built to solve.

Most people come to us with one of these. We start from your problem, not our tech.

{FOCUS.map((f) =>
{f.code}
{f.glyph}
{f.sub}

{f.problem}

{f.title}

    {f.bullets.map((b) =>
  • + {b}
  • )}
)}
); } /* ---------- HOW WE'RE DIFFERENT ---------- */ const HOW = [ { num: "01", title: "Senior people, on your project", body: "The people you talk to are the people who build. No handing your work to a rotating cast of junior contractors after the pitch." }, { num: "02", title: "You own everything", body: "The code, the infrastructure, the decisions, all yours. We build so you're never trapped depending on us. If you want to take it in-house later, you can." }, { num: "03", title: "We're honest about fit", body: "If we're not the right team for your problem, we'll say so and point you to someone who is. We'd rather do one thing excellently than ten things halfway." } ]; function HowSection() { return (
How we work

We grow your capability, not our headcount.

Most software shops make money by putting more people on your project. That's not us. We're a senior-led team that builds the systems that do the heavy lifting, so a lot gets done without an army of contractors, and without you depending on us forever.

{HOW.map((h) =>
{h.num}

{h.title}

{h.body}

)}
); } /* ---------- LEADERSHIP ---------- */ const LEADERS = [ { role: "Founder & Chief Architect", name: "Elamukil Tamil", line: "Two decades building software that isn't allowed to fail.", body: "Tamil has spent nearly twenty years where mistakes are expensive. At Citi, he was part of the engineering team that rebuilt the bank's US mobile app in native code, and contributed to its Apple Watch app that shipped for the watch's launch day. The kind of work where millions of people notice if anything breaks. At SAP he led a global architecture team solving the same problem at a different scale. Along the way, “make it solid, make it secure, make it last” stopped being a standard and became an instinct, and it's the instinct behind everything ThryvX builds.", pedigree: ["Citi · AVP, Digital Banking", "SAP Labs · Principal Architect", "MBA, IIM Kozhikode", "MS, NIT Trichy"] }, { role: "Co-founder, Product & Delivery", name: "Arul Arasu Velusamy", line: "Lives in the gap between a good idea and a thing that actually works.", body: "Arul has spent his career turning tangled, high-stakes requirements into product that ships. In banking and fintech, where one overlooked detail becomes a fraud case or a compliance breach, he's led product and delivery across dozens of parallel engineering streams, from identity and fraud prevention to AI-powered platforms. Earlier, he spent six years rebuilding how a major lender ran its operations, shoulder-to-shoulder with risk and compliance. He's the one who makes sure the technology is solving the real problem, not an interesting version of it.", pedigree: ["Fintech & digital banking", "TVS Credit · 6 years", "EPGP, IIM Kozhikode"] } ]; function LeadershipSection() { return (
Leadership

Built and led by people who've done this at scale.

ThryvX began as a disagreement at IIM Kozhikode.

Tamil, twenty years into building software for banks, argued that most products fail because the business never really understood what was being built. Arul, who'd spent his career shipping regulated fintech, argued the opposite: that engineers build elegant things nobody asked for. They were both right.

The gap between those two failures is where most projects die, and neither of them could fill it alone. So they stopped arguing and built the thing that could. That's ThryvX: deep engineering and real product judgment, in the same room, on purpose. Now growing a senior team to do the same for you.

{LEADERS.map((p) =>
{p.role}

{p.name}

{p.line}

{p.body}

    {p.pedigree.map((b) =>
  • {b}
  • )}
)}
); } /* ---------- OUR WORK ---------- */ const VENTURES = [ { id: "verveli", name: "Verveli", code: "01", paradigm: "Networks you can trust", status: "production", statusLabel: "Live", short: "A trusted network for alumni communities.", long: "Turns static alumni directories into living, verified networks, so institutions and their members can actually find each other and trust who's who.", metrics: [ { k: "stage", v: "Live" }, { k: "area", v: "Alumni networks" }, { k: "built by", v: "ThryvX" } ], visual: "graph", caption: "A verified member network · drag the nodes" }, { id: "identity-link", name: "Identity-Link", code: "02", paradigm: "Documents you can verify", status: "dev", statusLabel: "In development", short: "Offer letters and onboarding documents you can verify are real.", long: "Closes the gap between hiring systems and onboarding with documents that can be independently checked as genuine, cutting fraud and the manual back-and-forth of verifying paperwork.", metrics: [ { k: "stage", v: "In development" }, { k: "area", v: "Hiring & HR" }, { k: "with", v: "Early partners" } ], visual: "doc", caption: "A document you can verify" }, { id: "proof-of-work", name: "Proof-of-Work", code: "03", paradigm: "Proof you can check", status: "dev", statusLabel: "Early", short: "Verifiable proof of real work for early-career talent.", long: "Helps students and early founders show real, checkable evidence of what they've actually built and done, instead of resumes nobody can verify.", metrics: [ { k: "stage", v: "Early" }, { k: "area", v: "Hiring & credentials" }, { k: "status", v: "Building" } ], visual: "blocks", caption: "A chain of checkable records" } ]; function VenturesSection() { const [active, setActive] = useState("verveli"); const v = VENTURES.find((x) => x.id === active); return (
Our work

Our own products are our R&D.

Building for ourselves is how we stay ahead of the tools and patterns most teams are still reading about. That edge goes straight into the work we do for you.

{VENTURES.findIndex((x) => x.id === active) + 1} / {VENTURES.length}
Product What it does Status
{VENTURES.map((x) => )}
{v.code} · {v.paradigm}

{v.name}

{v.short}

{v.long}

{v.metrics.map((m) =>
{m.k}
{m.v}
)}
{v.statusLabel}
{v.caption}
); } function VentureVisual({ kind }) { if (kind === "graph") return ; if (kind === "doc") return ; return ; } function GraphVisual() { const svgRef = React.useRef(null); const dragRef = React.useRef(null); const simRef = React.useRef(null); const [, setTick] = React.useState(0); if (!simRef.current) { const N = 13; const nodes = [{ x: 50, y: 50, vx: 0, vy: 0, hub: true, r: 6 }]; for (let i = 1; i < N; i++) { const a = (i / (N - 1)) * Math.PI * 2; nodes.push({ x: 50 + Math.cos(a) * 28, y: 50 + Math.sin(a) * 28, vx: 0, vy: 0, r: 2.6 + (i % 3) * 0.7 }); } const edges = []; for (let i = 1; i < N; i++) edges.push([0, i]); edges.push([1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [2, 5], [8, 11]); simRef.current = { nodes, edges }; } React.useEffect(() => { let raf; const step = () => { const { nodes, edges } = simRef.current; const n = nodes.length; // repulsion for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { let dx = nodes[i].x - nodes[j].x; let dy = nodes[i].y - nodes[j].y; let d2 = dx * dx + dy * dy; if (d2 < 0.01) { d2 = 0.01; dx = Math.random() - 0.5; dy = Math.random() - 0.5; } const d = Math.sqrt(d2); const f = 26 / d2; const fx = (dx / d) * f, fy = (dy / d) * f; nodes[i].vx += fx; nodes[i].vy += fy; nodes[j].vx -= fx; nodes[j].vy -= fy; } } // springs const L = 24; for (const [a, b] of edges) { let dx = nodes[b].x - nodes[a].x; let dy = nodes[b].y - nodes[a].y; const d = Math.sqrt(dx * dx + dy * dy) || 0.01; const f = (d - L) * 0.015; const fx = (dx / d) * f, fy = (dy / d) * f; nodes[a].vx += fx; nodes[a].vy += fy; nodes[b].vx -= fx; nodes[b].vy -= fy; } // centering + integrate for (let i = 0; i < n; i++) { const nd = nodes[i]; if (dragRef.current === i) { nd.vx = 0; nd.vy = 0; continue; } nd.vx += (50 - nd.x) * 0.004; nd.vy += (50 - nd.y) * 0.004; nd.vx *= 0.82; nd.vy *= 0.82; nd.vx = Math.max(-3, Math.min(3, nd.vx)); nd.vy = Math.max(-3, Math.min(3, nd.vy)); nd.x = Math.max(7, Math.min(93, nd.x + nd.vx)); nd.y = Math.max(7, Math.min(93, nd.y + nd.vy)); } setTick((t) => (t + 1) % 1000000); raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, []); const toSvg = (e) => { const rect = svgRef.current.getBoundingClientRect(); const pt = e.touches ? e.touches[0] : e; return { x: ((pt.clientX - rect.left) / rect.width) * 100, y: ((pt.clientY - rect.top) / rect.height) * 100 }; }; const onDown = (i) => (e) => { e.preventDefault(); dragRef.current = i; }; const onMove = (e) => { if (dragRef.current == null) return; const p = toSvg(e); const nd = simRef.current.nodes[dragRef.current]; nd.x = Math.max(7, Math.min(93, p.x)); nd.y = Math.max(7, Math.min(93, p.y)); nd.vx = 0; nd.vy = 0; }; const onUp = () => { dragRef.current = null; }; const { nodes, edges } = simRef.current; const hub = nodes[0]; return ( {edges.map(([a, b], i) => )} {nodes.map((nd, i) => {nd.hub && } )} VERIFIED ); } function DocVisual() { return ( ); } function BlocksVisual() { return ( {[0, 1, 2, 3].map((i) => { const x = 8 + i * 22; const isLast = i === 3; return ( {i < 3 && } ); })} ); } /* ---------- ENGAGE ---------- */ function EngageSection({ onContact }) { return (
Work with us

Tell us what you're trying to do.

No long sales process. Start with a short note about what you're working on and what you'd like to change. A senior engineer, not a salesperson, reads every one and replies within a few days.

We're a strong fit when
  • You want a real partner, not just extra pairs of hands
  • You care about owning what gets built
  • You'd rather do one thing excellently than ten halfway
Start a conversation
); } /* ---------- CONTACT MODAL ---------- */ function ContactModal({ open, onClose }) { const [step, setStep] = useState(1); const [company, setCompany] = useState(""); const [goals, setGoals] = useState([]); const [success, setSuccess] = useState(""); const [contact, setContact] = useState(""); const [submitted, setSubmitted] = useState(false); useEffect(() => { if (open) { setStep(1); setSubmitted(false); } }, [open]); const toggleGoal = (g) => { setGoals((gs) => gs.includes(g) ? gs.filter((x) => x !== g) : [...gs, g]); }; const goalOpts = [ { id: "ai", label: "Use AI somewhere in our business", code: "01" }, { id: "build", label: "Build a new app, portal, or platform", code: "02" }, { id: "modernize", label: "Fix or modernize something we have", code: "03" }, { id: "secure", label: "Make our systems more secure & reliable", code: "04" } ]; if (!open) return null; return (
e.stopPropagation()}>
Start a conversation

Let's talk

{!submitted ? <>

A few quick questions so we can come prepared. No commitment, and a real engineer reads every one.

{[1, 2, 3, 4].map((n) =>
{String(n).padStart(2, "0")}
)}
{step === 1 &&
} {step === 2 &&
02 · What are you trying to do?

Pick whatever fits. You can choose more than one.

{goalOpts.map((b) => { const on = goals.includes(b.id); return ( ); })}
} {step === 3 &&