From 40e8576ca317ee5e34f50c04b00d7b343bd25ca1 Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Sat, 4 Jul 2026 01:13:58 +0530
Subject: [PATCH 1/2] feat(web): add partnerships section and polished
get-started terminal
- Add ConcentrateAI partnership with index, detail pages, and home section
- Add animated get-started terminal component with copy buttons
- Add --ease-out/--ease-in-out CSS custom properties
- Update navbar and footer with partnerships link
---
.../(pages)/partnerships/[company]/page.tsx | 171 +++++++++++++++++
apps/web/app/(pages)/partnerships/page.tsx | 87 +++++++++
apps/web/app/globals.css | 5 +
apps/web/app/page.tsx | 6 +
apps/web/components/homepage/footer.tsx | 3 +-
apps/web/components/homepage/get-started.tsx | 173 ++++++++++++++++++
apps/web/components/homepage/hero.tsx | 2 +-
apps/web/components/homepage/navbar.tsx | 1 +
.../homepage/partnerships-section.tsx | 80 ++++++++
apps/web/data/partnerships.ts | 43 +++++
.../public/concentrate-ai-black-symbol.svg | 68 +++++++
11 files changed, 637 insertions(+), 2 deletions(-)
create mode 100644 apps/web/app/(pages)/partnerships/[company]/page.tsx
create mode 100644 apps/web/app/(pages)/partnerships/page.tsx
create mode 100644 apps/web/components/homepage/get-started.tsx
create mode 100644 apps/web/components/homepage/partnerships-section.tsx
create mode 100644 apps/web/data/partnerships.ts
create mode 100644 apps/web/public/concentrate-ai-black-symbol.svg
diff --git a/apps/web/app/(pages)/partnerships/[company]/page.tsx b/apps/web/app/(pages)/partnerships/[company]/page.tsx
new file mode 100644
index 0000000..dd143e2
--- /dev/null
+++ b/apps/web/app/(pages)/partnerships/[company]/page.tsx
@@ -0,0 +1,171 @@
+import type { Metadata } from "next"
+import Link from "next/link"
+import { notFound } from "next/navigation"
+import { ArrowLeft, ArrowUpRight, Quote } from "lucide-react"
+import Navbar from "@/components/homepage/navbar"
+import Footer from "@/components/homepage/footer"
+import { partners } from "@/data/partnerships"
+
+interface Props {
+ params: Promise<{ company: string }>
+}
+
+export async function generateStaticParams() {
+ return partners.map((p) => ({ company: p.slug }))
+}
+
+export async function generateMetadata({ params }: Props): Promise {
+ const { company } = await params
+ const partner = partners.find((p) => p.slug === company)
+ if (!partner) return {}
+
+ return {
+ title: `Supercode × ${partner.name} — Case Study`,
+ description: partner.description,
+ metadataBase: new URL("https://supercli.vercel.app"),
+ openGraph: {
+ title: `Supercode × ${partner.name} — Case Study`,
+ description: partner.description,
+ url: `https://supercli.vercel.app/partnerships/${partner.slug}`,
+ siteName: "Supercode",
+ type: "article",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `Supercode × ${partner.name} — Case Study`,
+ description: partner.description,
+ },
+ }
+}
+
+export default async function PartnershipDetailPage({ params }: Props) {
+ const { company } = await params
+ const partner = partners.find((p) => p.slug === company)
+ if (!partner) notFound()
+
+ return (
+
+
+
+
+
+
+
+ {/* Back link */}
+
+
+ All partnerships
+
+
+ {/* Hero */}
+
+
+ {partner.logoSrc ? (
+

+ ) : (
+ partner.logo
+ )}
+
+
+
+ {partner.name}
+
+
+ {partner.tagline}
+
+
+
+ {/* Stat highlight */}
+
+
+ {partner.stat.value}
+
+
+ {partner.stat.label}
+
+
+
+ {/* Quote */}
+ {/*
+
+
+ “{partner.quote.text}”
+
+
+
+ {partner.quote.author}
+
+
{partner.quote.role}
+
+
*/}
+
+ {/* Challenge */}
+
+
+ $ The Challenge
+
+
+ {partner.challenge.map((p, i) => (
+
{p}
+ ))}
+
+
+
+ {/* Solution */}
+
+
+ $ The Solution
+
+
+ {partner.solution.map((p, i) => (
+
{p}
+ ))}
+
+
+
+ {/* Results */}
+
+
+ $ The Results
+
+
+ {partner.results.map((result, i) => (
+
+
+ {result.metric}
+
+
+ {result.text}
+
+
+ ))}
+
+
+
+ {/* CTA */}
+
+
+
+
+
+ )
+}
diff --git a/apps/web/app/(pages)/partnerships/page.tsx b/apps/web/app/(pages)/partnerships/page.tsx
new file mode 100644
index 0000000..5c52008
--- /dev/null
+++ b/apps/web/app/(pages)/partnerships/page.tsx
@@ -0,0 +1,87 @@
+import type { Metadata } from "next"
+import Link from "next/link"
+import Navbar from "@/components/homepage/navbar"
+import Footer from "@/components/homepage/footer"
+import { partners } from "@/data/partnerships"
+import { ArrowUpRight } from "lucide-react"
+
+export const metadata: Metadata = {
+ title: "Supercode — Partnerships & Case Studies",
+ description:
+ "Learn how teams use Supercode to ship faster, improve code quality, and automate their workflows.",
+ metadataBase: new URL("https://supercli.vercel.app"),
+ openGraph: {
+ title: "Supercode — Partnerships & Case Studies",
+ description:
+ "Learn how teams use Supercode to ship faster, improve code quality, and automate their workflows.",
+ url: "https://supercli.vercel.app/partnerships",
+ siteName: "Supercode",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "Supercode — Partnerships & Case Studies",
+ description:
+ "Learn how teams use Supercode to ship faster, improve code quality, and automate their workflows.",
+ },
+}
+
+export default function PartnershipsPage() {
+ return (
+
+
+
+
+
+
+
+
+ Partnerships
+
+
+ Real teams, real results. See how engineering organizations use
+ Supercode to ship faster and build better software.
+
+
+
+ {partners.map((partner) => (
+
+
+
+ {partner.logoSrc ? (
+

+ ) : (
+ partner.logo
+ )}
+
+
+
+
+
+ {partner.name}
+
+
+ {partner.description}
+
+
+
+
+ {partner.stat.value}
+
+
+ {partner.stat.label}
+
+
+
+ ))}
+
+
+
+
+
+ )
+}
diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css
index 621c37e..a6fa0cd 100644
--- a/apps/web/app/globals.css
+++ b/apps/web/app/globals.css
@@ -176,6 +176,11 @@ body {
letter-spacing: var(--tracking-normal);
}
+:root {
+ --ease-out: cubic-bezier(0.23, 1, 0.32, 1);
+ --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);
+}
+
@keyframes cursor-blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
index ee5f660..2cb60aa 100644
--- a/apps/web/app/page.tsx
+++ b/apps/web/app/page.tsx
@@ -1,5 +1,7 @@
import Navbar from "@/components/homepage/navbar";
import HeroSection from "@/components/homepage/hero";
+import GetStartedSection from "@/components/homepage/get-started";
+import PartnershipsSection from "@/components/homepage/partnerships-section";
import Footer from "@/components/homepage/footer";
export default async function Home() {
@@ -11,6 +13,10 @@ export default async function Home() {
+
+
+
+
);
diff --git a/apps/web/components/homepage/footer.tsx b/apps/web/components/homepage/footer.tsx
index b86594b..223d72c 100644
--- a/apps/web/components/homepage/footer.tsx
+++ b/apps/web/components/homepage/footer.tsx
@@ -257,6 +257,7 @@ const Footer = () => {
{ label: "CLI", href: "/", external: true },
{ label: "Pricing", href: "/#pricing" },
{ label: "Changelog", href: "/changelog" },
+ { label: "Partnerships", href: "/partnerships" },
{ label: "Launch", href: "/launch" },
]}
@@ -330,7 +331,7 @@ const Footer = () => {
- v0.1.27
+ v0.1.39-beta
diff --git a/apps/web/components/homepage/get-started.tsx b/apps/web/components/homepage/get-started.tsx
new file mode 100644
index 0000000..bca6f15
--- /dev/null
+++ b/apps/web/components/homepage/get-started.tsx
@@ -0,0 +1,173 @@
+"use client"
+
+import { useState, useEffect, useRef } from "react"
+import { Copy, Check } from "lucide-react"
+
+type CommandLine =
+ | { type: "comment"; text: string }
+ | { type: "command"; text: string; highlight?: string }
+ | { type: "info"; text: string }
+
+const commands: CommandLine[] = [
+ { type: "comment", text: "installation" },
+ { type: "command", text: "npm install -g supercode-cli@latest", highlight: "supercode-cli" },
+ { type: "comment", text: "authentication" },
+ { type: "command", text: "supercode login" },
+ { type: "info", text: "(login with GitHub and verify your acc)" },
+ { type: "comment", text: "scaffold your project" },
+ { type: "command", text: "supercode init" },
+ { type: "info", text: "start shipping with supercode" },
+]
+
+const reduceMotion =
+ typeof window !== "undefined"
+ ? window.matchMedia("(prefers-reduced-motion: reduce)").matches
+ : false
+
+const GetStartedSection = () => {
+ const [visible, setVisible] = useState(false)
+ const [copiedIndex, setCopiedIndex] = useState(null)
+ const sectionRef = useRef(null)
+
+ useEffect(() => {
+ const el = sectionRef.current
+ if (!el) return
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (entry.isIntersecting) {
+ setVisible(true)
+ observer.disconnect()
+ }
+ },
+ { threshold: 0.15 }
+ )
+ observer.observe(el)
+ return () => observer.disconnect()
+ }, [])
+
+ const handleCopy = (text: string, index: number) => {
+ navigator.clipboard.writeText(text)
+ setCopiedIndex(index)
+ setTimeout(() => setCopiedIndex(null), 2000)
+ }
+
+ const staggerStyle = (index: number) => {
+ if (reduceMotion || !visible) return {}
+ return {
+ opacity: 0,
+ transform: "translateY(6px)",
+ animation: `terminal-enter 350ms var(--ease-out) forwards`,
+ animationDelay: `${index * 60}ms`,
+ }
+ }
+
+ return (
+
+
+
+
+
+ $ Get started with Supercode
+
+
+
+
+
+
+ {commands.map((cmd, i) => (
+
+ {cmd.type === "comment" && (
+
0 ? "pt-2" : ""}`}>
+ # {cmd.text}
+
+ )}
+
+ {cmd.type === "command" && (
+
+
+ >{" "}
+ {cmd.highlight ? (
+ <>
+
+ {cmd.text.split(cmd.highlight)[0]}
+
+
+ {cmd.highlight}
+
+
+ {cmd.text.split(cmd.highlight)[1] ?? ""}
+
+ >
+ ) : (
+ {cmd.text}
+ )}
+
+
+
+ )}
+
+ {cmd.type === "info" && (
+
+ {cmd.text}
+
+ )}
+
+ ))}
+
+
+ >
+
+
+
+
+
+
+ )
+}
+
+export default GetStartedSection
diff --git a/apps/web/components/homepage/hero.tsx b/apps/web/components/homepage/hero.tsx
index ba01f56..52d7913 100644
--- a/apps/web/components/homepage/hero.tsx
+++ b/apps/web/components/homepage/hero.tsx
@@ -45,7 +45,7 @@ const HeroSection = () => {
{/* Version tag */}
- v0.1.30-beta
+ v0.1.39-beta
diff --git a/apps/web/components/homepage/navbar.tsx b/apps/web/components/homepage/navbar.tsx
index 792d056..33e08e1 100644
--- a/apps/web/components/homepage/navbar.tsx
+++ b/apps/web/components/homepage/navbar.tsx
@@ -161,6 +161,7 @@ const Navbar = () => {
const navItems: Array<{ label: string; href: string; external?: boolean; accent?: boolean }> = [
{ label: "GitHub", href: "https://github.com/yashdev9274/superCli", external: true },
+ // { label: "Partnerships", href: "/partnerships" },
{ label: "Compare", href: "/compare" },
{ label: "Docs", href: DOCS_URL, external: true },
{ label: "Changelog", href: "/changelog" },
diff --git a/apps/web/components/homepage/partnerships-section.tsx b/apps/web/components/homepage/partnerships-section.tsx
new file mode 100644
index 0000000..a68d3a4
--- /dev/null
+++ b/apps/web/components/homepage/partnerships-section.tsx
@@ -0,0 +1,80 @@
+"use client"
+
+import React from "react"
+import Link from "next/link"
+import { partners } from "@/data/partnerships"
+import { ArrowUpRight } from "lucide-react"
+
+const PartnershipsSection = () => {
+ const featured = partners.slice(0, 3)
+
+ return (
+
+
+
+
+
+ $ Partnerships
+
+
+ Real teams shipping with Supercode
+
+
+
+
View all
+
+
+
+
+
+ {featured.map((partner) => (
+
+
+ {partner.logoSrc ? (
+

+ ) : (
+ partner.logo
+ )}
+
+
+
+ {partner.name}
+
+
+ {partner.description}
+
+
+
+
+ {partner.stat.value}
+
+
+ {partner.stat.label}
+
+
+
+ ))}
+
+
+
+
+
View all partnerships
+
+
+
+
+
+ )
+}
+
+export default PartnershipsSection
diff --git a/apps/web/data/partnerships.ts b/apps/web/data/partnerships.ts
new file mode 100644
index 0000000..7935d1c
--- /dev/null
+++ b/apps/web/data/partnerships.ts
@@ -0,0 +1,43 @@
+export interface Partner {
+ slug: string
+ name: string
+ logo: string
+ logoSrc?: string
+ tagline: string
+ stat: { value: string; label: string }
+ quote: { text: string; author: string; role: string }
+ challenge: string[]
+ solution: string[]
+ results: { text: string; metric: string }[]
+ description: string
+}
+
+export const partners: Partner[] = [
+ {
+ slug: "concentrateai",
+ name: "ConcentrateAI",
+ logo: "CA",
+ logoSrc: "/concentrate-ai-black-symbol.svg",
+ description: "A strategic partnership bringing together Supercode's AI code generation with ConcentrateAI's LLM API gateway infrastructure.",
+ tagline: "Powering the next generation of AI-assisted development",
+ stat: { value: "99.9%", label: "LLM API uptime via ConcentrateAI gateway" },
+ quote: {
+ text: "Supercode and ConcentrateAI are building the future of AI-assisted development together. Their code generation platform paired with our gateway infrastructure means developers get the best of both worlds — intelligent automation with enterprise-grade reliability.",
+ author: "Alex Rivera",
+ role: "CTO, ConcentrateAI",
+ },
+ challenge: [
+ "Supercode's AI-powered code generation relies on large language models — but managing LLM API traffic at scale is a complex infrastructure problem. Rate limits, cost optimization, failover across providers, and consistent latency for users all needed to be solved before Supercode could deliver a reliable experience to its growing user base.",
+ "Building this infrastructure in-house would have diverted engineering resources from Supercode's core product. What was needed was a dedicated API gateway purpose-built for LLM traffic — and a partner who understood both the infrastructure and developer experience sides of the problem.",
+ ],
+ solution: [
+ "Supercode partnered with ConcentrateAI to integrate their enterprise-grade LLM API gateway as the backbone of Supercode's AI infrastructure. ConcentrateAI's gateway handles request routing across multiple LLM providers (OpenAI, Anthropic, Groq), automatic failover, token usage optimization, and real-time cost tracking — all abstracted behind a single, unified API.",
+ "In return, ConcentrateAI adopted Supercode across their own engineering team to accelerate development of their gateway platform. Their engineers use Supercode to rapidly prototype new routing logic, generate integration tests for provider APIs, and maintain consistent code quality across their growing codebase. It's a true partnership — each company empowers the other's core product.",
+ ],
+ results: [
+ { text: "Supercode achieved enterprise-grade LLM infrastructure without building it in-house, powered by ConcentrateAI's gateway", metric: "Zero-infra AI" },
+ { text: "ConcentrateAI's engineering team ships gateway features 3x faster using Supercode for development", metric: "3x faster shipping" },
+ { text: "Users get reliable, low-latency code generation with automatic failover across multiple LLM providers", metric: "99.9% uptime" },
+ ],
+ },
+]
diff --git a/apps/web/public/concentrate-ai-black-symbol.svg b/apps/web/public/concentrate-ai-black-symbol.svg
new file mode 100644
index 0000000..3107394
--- /dev/null
+++ b/apps/web/public/concentrate-ai-black-symbol.svg
@@ -0,0 +1,68 @@
+
+
From 1bf3292552ff8383807cc72d5e50eb6aac4fe166 Mon Sep 17 00:00:00 2001
From: Yash Dewasthale
Date: Sat, 4 Jul 2026 01:26:35 +0530
Subject: [PATCH 2/2] fix: elevnlabs api key issue
---
apps/supercode-cli/server/package.json | 2 +-
apps/supercode-cli/server/src/index.ts | 35 ++++++++++++++
apps/supercode-cli/server/src/voice/speech.ts | 48 +++++++++++++++----
3 files changed, 76 insertions(+), 9 deletions(-)
diff --git a/apps/supercode-cli/server/package.json b/apps/supercode-cli/server/package.json
index e634b71..3c48c5d 100644
--- a/apps/supercode-cli/server/package.json
+++ b/apps/supercode-cli/server/package.json
@@ -1,6 +1,6 @@
{
"name": "supercode-cli",
- "version": "0.1.39",
+ "version": "0.1.40",
"description": "AI-powered coding agent CLI",
"main": "dist/main.js",
"bin": {
diff --git a/apps/supercode-cli/server/src/index.ts b/apps/supercode-cli/server/src/index.ts
index 63a37b8..6f9d010 100644
--- a/apps/supercode-cli/server/src/index.ts
+++ b/apps/supercode-cli/server/src/index.ts
@@ -7,6 +7,11 @@ import { loadEnvOnce } from "./lib/load-env"
import { recordUsage } from "./lib/track-usage"
import { computeCost } from "./lib/pricing"
import { registerAnalyticsRoutes } from "./routes/analytics"
+import { transcribeAudio } from "./voice/speech"
+import { tmpdir } from "os"
+import { join } from "path"
+import { writeFileSync, unlinkSync } from "fs"
+import { randomUUID } from "crypto"
loadEnvOnce()
@@ -829,6 +834,36 @@ app.post("/api/tools/web-search", async (req, res) => {
}
})
+app.post("/api/voice/transcribe", async (req, res) => {
+ try {
+ const user = await getUserFromBearer(req)
+ if (!user) {
+ res.status(401).json({ error: "Unauthorized" })
+ return
+ }
+
+ const { base64, provider } = req.body
+ if (!base64) {
+ res.status(400).json({ error: "base64 audio data is required" })
+ return
+ }
+
+ if (provider) process.env.STT_PROVIDER = provider
+
+ const tmpFile = join(tmpdir(), `voice-transcribe-${randomUUID()}.wav`)
+ writeFileSync(tmpFile, Buffer.from(base64, "base64"))
+
+ try {
+ const text = await transcribeAudio(tmpFile)
+ res.json({ text })
+ } finally {
+ try { unlinkSync(tmpFile) } catch {}
+ }
+ } catch (error) {
+ res.status(500).json({ error: String(error) })
+ }
+})
+
app.listen(port, () => {
console.log(`Server is running on port ${port}`)
})
diff --git a/apps/supercode-cli/server/src/voice/speech.ts b/apps/supercode-cli/server/src/voice/speech.ts
index 83b5c12..e7d67ed 100644
--- a/apps/supercode-cli/server/src/voice/speech.ts
+++ b/apps/supercode-cli/server/src/voice/speech.ts
@@ -3,6 +3,7 @@ import { tmpdir } from "os"
import { join } from "path"
import { unlinkSync, readFileSync } from "fs"
import { randomUUID } from "crypto"
+import { getStoredToken } from "src/lib/token"
function getFfmpegPath(): string {
return process.env.FFMPEG_PATH || "/opt/homebrew/bin/ffmpeg"
@@ -52,10 +53,11 @@ export function canVoiceCapture(): {
const provider = getSttProvider()
if (provider === "groq") {
- /* groq provider */
- if (!process.env.GROQ_API_KEY) return { ok: false, reason: "GROQ_API_KEY not set" }
+ if (!process.env.GROQ_API_KEY && !process.env.SUPERCODE_SERVER_URL)
+ return { ok: false, reason: "GROQ_API_KEY not set and no server proxy configured" }
} else {
- if (!process.env.ELEVENLABS_API_KEY) return { ok: false, reason: "ELEVENLABS_API_KEY not set" }
+ if (!process.env.ELEVENLABS_API_KEY && !process.env.SUPERCODE_SERVER_URL)
+ return { ok: false, reason: "ELEVENLABS_API_KEY not set and no server proxy configured" }
}
return { ok: true }
@@ -126,7 +128,7 @@ function captureAudio(
})
}
-async function transcribeElevenLabs(filePath: string): Promise {
+export async function transcribeElevenLabs(filePath: string): Promise {
const apiKey = process.env.ELEVENLABS_API_KEY
if (!apiKey) throw new Error("ELEVENLABS_API_KEY not configured")
@@ -163,7 +165,7 @@ async function transcribeElevenLabs(filePath: string): Promise {
}
/* groq provider */
-async function transcribeGroq(filePath: string): Promise {
+export async function transcribeGroq(filePath: string): Promise {
const apiKey = process.env.GROQ_API_KEY
if (!apiKey) throw new Error("GROQ_API_KEY not configured")
@@ -195,15 +197,45 @@ async function transcribeGroq(filePath: string): Promise {
return data.text ?? ""
}
+async function transcribeViaServer(filePath: string): Promise {
+ const serverUrl = process.env.SUPERCODE_SERVER_URL || "https://supercode-8w7e.onrender.com"
+ const token = await getStoredToken()
+ if (!token?.access_token) {
+ throw new Error("Not authenticated. Please login first.")
+ }
+
+ const audioData = readFileSync(filePath)
+ const base64 = audioData.toString("base64")
+
+ const res = await fetch(`${serverUrl}/api/voice/transcribe`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token.access_token}`,
+ },
+ body: JSON.stringify({ base64, provider: getSttProvider() }),
+ signal: AbortSignal.timeout(30_000),
+ })
+
+ if (!res.ok) {
+ const text = await res.text().catch(() => "")
+ throw new Error(`Server transcription failed (${res.status}): ${text}`)
+ }
+
+ const { text } = (await res.json()) as { text?: string }
+ return text ?? ""
+}
+
export async function transcribeAudio(filePath: string): Promise {
const provider = getSttProvider()
if (provider === "groq") {
- /* groq provider */
- return transcribeGroq(filePath)
+ if (process.env.GROQ_API_KEY) return transcribeGroq(filePath)
+ return transcribeViaServer(filePath)
}
- return transcribeElevenLabs(filePath)
+ if (process.env.ELEVENLABS_API_KEY) return transcribeElevenLabs(filePath)
+ return transcribeViaServer(filePath)
}
const SOUND_DESCRIPTION_RE = /\([^)]*?(?:noise|clicking|static|background|sound|audio|speaking|unintelligible|laughs?|coughs?|clears?\s+(?:throat|voice)|throat|pause|music|beep|tone|silence|indistinct|foreign|applause|sniffling|sighs?|breathing|rustling|mumbling|chatter|echo)[^)]*?\)/gi