diff --git a/.github/workflows/build-site.yml b/.github/workflows/build-site.yml index af47db0e..85816a04 100644 --- a/.github/workflows/build-site.yml +++ b/.github/workflows/build-site.yml @@ -99,6 +99,42 @@ jobs: echo "Docs:" ls -la /tmp/site-output/docs/ | head -20 + # TODO: Remove this step once we confirm ASF infra honors .htaccess (AllowOverride). + # This was added as a fallback for PR #679 (landing page migration) because: + # The .htaccess was not being deployed (dotglob fix above solves this) and + # ASF infra may not honor .htaccess for the publish serving mode in .asf.yaml. + # Once confirmed, the .htaccess 301s are sufficient and these static HTML + # redirects can be removed to avoid bloating the asf-site branch. + - name: Generate HTML redirect fallbacks + run: | + # Scan Sphinx build output and generate static HTML redirects for every page. + # These act as fallback if the server does not process .htaccess. + BASE_URL="https://burr.apache.org" + OUTPUT="/tmp/site-output" + DOCS_BUILD="docs/_build/html" + COUNT=0 + + # Find every index.html in the Sphinx output (dirhtml builder creates dir/index.html per page) + while IFS= read -r file; do + # Get path relative to build root, e.g. "getting_started/install/index.html" + rel="${file#$DOCS_BUILD/}" + dir="$(dirname "$rel")" + + # Skip the docs root (landing page lives there) and paths already in site output + if [ "$dir" = "." ] || [ -e "$OUTPUT/$dir/index.html" ]; then + continue + fi + + target="$BASE_URL/docs/$dir/" + mkdir -p "$OUTPUT/$dir" + printf '\n\n\n\n\nRedirecting to %s...\n' \ + "$target" "$target" "$target" "$target" "$target" \ + > "$OUTPUT/$dir/index.html" + COUNT=$((COUNT + 1)) + done < <(find "$DOCS_BUILD" -name "index.html" -type f) + + echo "Generated $COUNT HTML redirect fallbacks." + - name: Deploy to asf-site / asf-staging if: github.event_name != 'pull_request' run: | @@ -126,6 +162,7 @@ jobs: rm -rf /tmp/gh-pages/content mkdir -p /tmp/gh-pages/content + shopt -s dotglob cp -r /tmp/site-output/* /tmp/gh-pages/content/ cd /tmp/gh-pages diff --git a/website/public/logos/taskhuman.svg b/website/public/logos/taskhuman.svg new file mode 100644 index 00000000..4831a2ed --- /dev/null +++ b/website/public/logos/taskhuman.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/components/Community.tsx b/website/src/components/Community.tsx index 90daf7bf..b2d0d716 100644 --- a/website/src/components/Community.tsx +++ b/website/src/components/Community.tsx @@ -1,7 +1,7 @@ "use client"; -import { GITHUB_REPO, DISCORD_URL, TWITTER_URL } from "@/lib/constants"; -import { Github, MessageCircle, Twitter } from "lucide-react"; +import { GITHUB_REPO, DISCORD_URL } from "@/lib/constants"; +import { Github, MessageCircle } from "lucide-react"; import { MagicCard } from "@/components/ui/magic-card"; import { BlurFade } from "@/components/ui/blur-fade"; @@ -22,14 +22,6 @@ const LINKS = [ gradientFrom: "#6e7681", gradientTo: "#30363d", }, - { - icon: Twitter, - label: "Twitter / X", - description: "Follow for updates and announcements", - href: TWITTER_URL, - gradientFrom: "#1DA1F2", - gradientTo: "#7B2FBE", - }, ]; export default function Community() { @@ -45,7 +37,7 @@ export default function Community() {

-
+
{LINKS.map((link, i) => { const Icon = link.icon; return ( diff --git a/website/src/components/Footer.tsx b/website/src/components/Footer.tsx index 823258b4..a5ae4b6e 100644 --- a/website/src/components/Footer.tsx +++ b/website/src/components/Footer.tsx @@ -1,4 +1,4 @@ -import { GITHUB_REPO, DOCS_URL, DISCORD_URL, TWITTER_URL, BASE_PATH } from "@/lib/constants"; +import { GITHUB_REPO, DOCS_URL, DISCORD_URL, BASE_PATH } from "@/lib/constants"; const COLUMNS = [ { @@ -23,7 +23,6 @@ const COLUMNS = [ links: [ { label: "Discord", href: DISCORD_URL, external: true }, { label: "GitHub", href: GITHUB_REPO, external: true }, - { label: "Twitter / X", href: TWITTER_URL, external: true }, { label: "Contributing", href: `${GITHUB_REPO}/blob/main/CONTRIBUTING.rst`, external: true }, ], }, diff --git a/website/src/components/Testimonials.tsx b/website/src/components/Testimonials.tsx index 2ebdbe96..b98483ac 100644 --- a/website/src/components/Testimonials.tsx +++ b/website/src/components/Testimonials.tsx @@ -10,6 +10,7 @@ function TestimonialCard({ title, company, quote, + logo, }: (typeof TESTIMONIALS)[0]) { return (
@@ -33,13 +34,15 @@ function TestimonialCard({ } export default function Testimonials() { - const companies = [ - ...new Set( - TESTIMONIALS.filter((t) => t.company !== "Subreddit").map( - (t) => t.company - ) - ), - ]; + const companies = TESTIMONIALS.filter((t) => t.logo).reduce( + (acc, t) => { + if (!acc.find((c) => c.name === t.company)) { + acc.push({ name: t.company, logo: t.logo! }); + } + return acc; + }, + [] as { name: string; logo: string }[] + ); return (
@@ -60,13 +63,24 @@ export default function Testimonials() {
{companies.map((company) => (
-
- {company.charAt(0)} + {company.name} { + const target = e.currentTarget; + target.style.display = "none"; + const fallback = target.nextElementSibling as HTMLElement; + if (fallback) fallback.style.display = "flex"; + }} + /> +
+ {company.name.charAt(0)}
- {company} + {company.name}
))}
diff --git a/website/src/lib/constants.ts b/website/src/lib/constants.ts index 465dbc65..c89cac68 100644 --- a/website/src/lib/constants.ts +++ b/website/src/lib/constants.ts @@ -3,7 +3,6 @@ export const BASE_PATH = process.env.NEXT_PUBLIC_BASE_PATH || ""; export const GITHUB_REPO = "https://github.com/apache/burr"; export const DOCS_URL = "/docs"; export const DISCORD_URL = "https://discord.gg/6Zy2DwP4f3"; -export const TWITTER_URL = "https://x.com/buraborr"; export const NAV_LINKS = [ { label: "Features", href: "#features" }, @@ -66,46 +65,60 @@ export const INTEGRATIONS = [ export const TESTIMONIALS = [ { - name: "Alex Johnson", - title: "ML Engineer", - company: "Acme Corp", + name: "Ashish Ghosh", + title: "CTO", + company: "Peanut Robotics", + logo: "https://www.google.com/s2/favicons?domain=peanutrobotics.com&sz=64", quote: - "Burr completely changed how we build AI agents. The state management and observability are game-changers for production systems.", + "After evaluating several other obfuscating LLM frameworks, their elegant yet comprehensive state management solution proved to be the powerful answer to rolling out robots driven by AI decision making.", }, { - name: "Sarah Chen", - title: "Staff Engineer", - company: "TechFlow", + name: "Ishita", + title: "Founder", + company: "Watto.ai", + logo: "https://www.google.com/s2/favicons?domain=watto.ai&sz=64", quote: - "We moved from a tangled mess of LangChain callbacks to clean, testable Burr actions. Our team velocity doubled.", + "Using Burr is a no-brainer if you want to build a modular AI application. It is so easy to build with and I especially love their UI which makes debugging a piece of cake. And the always ready to help team is the cherry on top.", }, { - name: "Marcus Rivera", - title: "CTO", - company: "DataPilot", + name: "Matthew Rideout", + title: "Staff Software Engineer", + company: "Paxton AI", + logo: "https://www.google.com/s2/favicons?domain=paxton.ai&sz=64", + quote: + "I just came across Burr and I'm like WOW, this seems like you guys predicted this exact need when building this. No weird esoteric concepts just because it's AI.", + }, + { + name: "Rinat Gareev", + title: "Senior Solutions Architect", + company: "Provectus", + logo: "https://www.google.com/s2/favicons?domain=provectus.com&sz=64", quote: - "The Burr UI alone is worth it. Being able to replay and debug agent runs saved us countless hours of debugging.", + "Burr's state management part is really helpful for creating state snapshots and build debugging, replaying and even building evaluation cases around that.", }, { - name: "Priya Patel", - title: "AI Engineer", - company: "NeuralWorks", + name: "Hadi Nayebi", + title: "Co-founder", + company: "CognitiveGraphs", + logo: null, quote: - "Human-in-the-loop was trivial to add with Burr. We went from prototype to production approval workflow in a day.", + "I have been using Burr over the past few months, and compared to many agentic LLM platforms out there (e.g. LangChain, CrewAi, AutoGen, Agency Swarm, etc), Burr provides a more robust framework for designing complex behaviors.", }, { - name: "David Kim", - title: "Senior Developer", - company: "CloudScale", + name: "Aditya K.", + title: "DS Architect", + company: "TaskHuman", + logo: `${BASE_PATH}/logos/taskhuman.svg`, quote: - "Pure Python, no magic, no hidden abstractions. Burr lets us build exactly what we need without fighting the framework.", + "Moving from LangChain to Burr was a game-changer! It took me just a few hours to get started with Burr, compared to the days and weeks I spent trying to navigate LangChain. I pitched Burr to my teammates, and we pivoted our entire codebase to it.", }, { - name: "Emma Wilson", - title: "Tech Lead", - company: "Subreddit", + name: "Reddit User", + title: "Developer", + company: "r/LocalLlama", + logo: null, quote: - "Persistence and replay are incredible for debugging complex multi-step agents. Burr makes the hard parts easy.", + "Of course, you can use it [LangChain], but whether it's really production-ready and improves the time from code-to-prod, we've been doing LLM apps for two years, and the answer is no. Honestly, take a look at Burr. Thank me later.", }, ];