Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/build-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 '<!DOCTYPE html><html><head>\n<meta charset="utf-8">\n<meta http-equiv="refresh" content="0; url=%s">\n<link rel="canonical" href="%s">\n<script>window.location.replace("%s")</script>\n</head><body>Redirecting to <a href="%s">%s</a>...</body></html>\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: |
Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions website/public/logos/taskhuman.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 3 additions & 11 deletions website/src/components/Community.tsx
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -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() {
Expand All @@ -45,7 +37,7 @@ export default function Community() {
</p>
</BlurFade>

<div className="mt-12 grid grid-cols-1 sm:grid-cols-3 gap-5">
<div className="mt-12 grid grid-cols-1 sm:grid-cols-2 gap-5 max-w-2xl mx-auto">
{LINKS.map((link, i) => {
const Icon = link.icon;
return (
Expand Down
3 changes: 1 addition & 2 deletions website/src/components/Footer.tsx
Original file line number Diff line number Diff line change
@@ -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 = [
{
Expand All @@ -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 },
],
},
Expand Down
36 changes: 25 additions & 11 deletions website/src/components/Testimonials.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ function TestimonialCard({
title,
company,
quote,
logo,
}: (typeof TESTIMONIALS)[0]) {
return (
<div className="w-[380px] shrink-0 rounded-2xl border border-[var(--card-border)] bg-[var(--card-bg)] p-6 overflow-visible">
Expand All @@ -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 (
<section className="py-20 sm:py-28 overflow-hidden">
Expand All @@ -60,13 +63,24 @@ export default function Testimonials() {
<div className="flex flex-wrap items-center justify-center gap-x-10 gap-y-4 mb-14">
{companies.map((company) => (
<div
key={company}
key={company.name}
className="flex items-center gap-2.5 px-4 py-2 rounded-lg border border-[var(--card-border)] bg-[var(--card-bg)]"
>
<div className="flex h-7 w-7 items-center justify-center rounded-md bg-[#7B2FBE]/10 text-xs font-bold text-[#7B2FBE]">
{company.charAt(0)}
<img
src={company.logo}
alt={company.name}
className="h-7 w-7 rounded-md object-contain"
onError={(e) => {
const target = e.currentTarget;
target.style.display = "none";
const fallback = target.nextElementSibling as HTMLElement;
if (fallback) fallback.style.display = "flex";
}}
/>
<div className="hidden h-7 w-7 items-center justify-center rounded-md bg-[#7B2FBE]/10 text-xs font-bold text-[#7B2FBE]">
{company.name.charAt(0)}
</div>
<span className="text-sm font-semibold">{company}</span>
<span className="text-sm font-semibold">{company.name}</span>
</div>
))}
</div>
Expand Down
63 changes: 38 additions & 25 deletions website/src/lib/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down Expand Up @@ -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.",
},
];

Expand Down