Skip to content
2 changes: 1 addition & 1 deletion src/components/home/features/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const FEATURES = [
title: "Managed Postgres, colocated with your Lakehouse.",
description:
"Provision with the CLI, connect like any Postgres. Instant branching, scales to zero, and change data feed to Unity Catalog.",
href: "/product/data-lakehouse",
href: "/product/lakebase",
visual: "lakebase",
},
{
Expand Down
34 changes: 34 additions & 0 deletions src/components/products/testimonials-slider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,40 @@ const testimonialLogoAssets = [
src: "/img/products/testimonials/yipitdata.svg",
width: 197,
},
// TODO(design): the SVGs below do not exist yet. Add the real brand logos to
// /static/img/products/testimonials/ before publishing the Databricks Apps
// and Agent Bricks pages, or these logos will 404. Registering them here
// prevents the wrong yipitDATA fallback logo from rendering in the meantime.
{
match: "sae",
src: "/img/products/testimonials/sae-international.svg",
width: 158,
},
{
match: "e.on",
src: "/img/products/testimonials/eon.svg",
width: 160,
},
{
match: "addi",
src: "/img/products/testimonials/addi.svg",
width: 128,
},
{
match: "astrazeneca",
src: "/img/products/testimonials/astrazeneca.svg",
width: 193,
},
{
match: "flo health",
src: "/img/products/testimonials/flo-health.svg",
width: 104,
},
{
match: "lippert",
src: "/img/products/testimonials/lippert.svg",
width: 160,
},
] as const;

function getTestimonialLogoAsset(company: string) {
Expand Down
65 changes: 49 additions & 16 deletions src/components/theme/mobile-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { useLocation } from "@docusaurus/router";
import { DocsSidebarSearch } from "@/components/docs/sidebar-search";

import {
getActiveProductHref,
isHeaderNavItemActive,
PRODUCT_LINKS,
type HeaderNavItem,
} from "@/lib/header-navigation";
import { cn } from "@/lib/utils";
Expand Down Expand Up @@ -126,7 +128,10 @@ function MobileTreeText({
export function MobileNav({ items, open, onOpenChange }: MobileNavProps) {
const menuId = useId();
const { pathname } = useLocation();
const activeProductHref = getActiveProductHref(pathname);
const isHomeActive = pathname === "/";
const productItem = items.find(({ label }) => label === "Product");
const sectionItems = items.filter(({ label }) => label !== "Product");

useEffect(() => {
onOpenChange(false);
Expand Down Expand Up @@ -218,7 +223,7 @@ export function MobileNav({ items, open, onOpenChange }: MobileNavProps) {
};
}, [onOpenChange, open]);

if (items.length === 0) {
if (!productItem || items.length === 0) {
return null;
}

Expand All @@ -245,17 +250,15 @@ export function MobileNav({ items, open, onOpenChange }: MobileNavProps) {
className="relative w-full h-full flex justify-between font-mono text-[20px] leading-none font-normal tracking-[-0.4px]"
aria-label="Main navigation"
>
{/*
Product nav section temporarily removed while product pages are
unpublished. This menu was reflowed (tree-line positions retuned)
for the shorter HOME + Solutions/Templates/Docs list. To restore
Product, revert this file to its pre-PR-114 version and uncomment
the Product entry in header-navigation.ts.
*/}
<MobileTreeLine className="top-[38px] left-[23px] h-[102px] w-px" />
<MobileTreeLine className="top-[72px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[106px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[140px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[38px] left-[23px] h-[226px] w-px" />
<MobileTreeLine className="top-[58px] left-6 h-px w-[37px]" />
<MobileTreeLine className="top-[90px] left-[63px] h-px w-[37px]" />
<MobileTreeLine className="top-[124px] left-[63px] h-px w-[37px]" />
<MobileTreeLine className="top-[158px] left-[63px] h-px w-[37px]" />
<MobileTreeLine className="top-[194px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[228px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[264px] left-6 h-px w-[37px] md:w-[39px]" />
<MobileTreeLine className="top-[72px] left-[63px] h-[86px] w-px md:top-[73px] md:h-[85px]" />

<MobileTreeText
active={isHomeActive}
Expand All @@ -268,7 +271,37 @@ export function MobileNav({ items, open, onOpenChange }: MobileNavProps) {
~/HOME
</MobileTreeText>

{items.map((item, index) => {
<span
className="absolute top-[46px] left-[61px] flex h-6 items-center text-grey-80 opacity-60"
data-mobile-menu-product-label="true"
>
{productItem.label.toLowerCase()}
</span>

{PRODUCT_LINKS.map((product, index) => {
const isActive = product.href === activeProductHref;

return (
<MobileTreeText
active={isActive}
activeFill="full"
aria-current={isActive ? "page" : undefined}
className={cn(
"left-[100px] right-5",
index === 0 && "top-[76px]",
index === 1 && "top-[110px]",
index === 2 && "top-36",
)}
data-mobile-menu-product-link="true"
key={product.href}
to={product.href}
>
{product.label.toLowerCase()}
</MobileTreeText>
);
})}

{sectionItems.map((item, index) => {
const isActive = isHeaderNavItemActive(item, pathname);

return (
Expand All @@ -278,9 +311,9 @@ export function MobileNav({ items, open, onOpenChange }: MobileNavProps) {
aria-current={isActive ? "page" : undefined}
className={cn(
"left-[61px] right-5 md:left-[63px] md:right-[22px]",
index === 0 && "top-[58px]",
index === 1 && "top-[92px]",
index === 2 && "top-[126px]",
index === 0 && "top-[180px]",
index === 1 && "top-[214px]",
index === 2 && "top-[248px]",
)}
data-mobile-menu-section-link="true"
key={item.href}
Expand Down
5 changes: 1 addition & 4 deletions src/components/theme/nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -268,10 +268,7 @@ function Nav({ className, items }: HeaderNavProps) {
{items.map((item) => {
const { href, label } = item;

// The "Product" entry is temporarily commented out of HEADER_LINKS,
// so this branch never renders. Kept (with a widened comparison) so
// re-enabling Product is a one-line revert in header-navigation.ts.
if ((label as string) === "Product") {
if (label === "Product") {
const isActive = Boolean(activeProductHref);

return (
Expand Down
5 changes: 2 additions & 3 deletions src/lib/header-navigation.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
export const HEADER_LINKS = [
// Temporarily hidden while product pages are unpublished.
// { label: "Product", href: "/product/data-lakehouse" },
{ label: "Product", href: "/product/lakebase" },
{ label: "Solutions", href: "/solutions" },
{ label: "Templates", href: "/templates" },
{ label: "Docs", href: "/docs/start-here", activePath: "/docs" },
Expand All @@ -9,7 +8,7 @@ export const HEADER_LINKS = [
export type HeaderNavItem = (typeof HEADER_LINKS)[number];

export const PRODUCT_LINKS = [
{ label: "Lakebase", href: "/product/data-lakehouse" },
{ label: "Lakebase", href: "/product/lakebase" },
{ label: "Agent Bricks", href: "/product/agent-bricks" },
{ label: "Databricks Apps", href: "/product/databricks-apps" },
] as const;
Expand Down
28 changes: 14 additions & 14 deletions src/lib/products/agent-bricks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ export const agentBricksProduct: ProductPageContent = {
title: "Use the right model for every task.",
description:
"Switch between leading models like GPT, Claude, Llama, and more.",
body: "Send requests through a single API and route each task to the best-fitting model — without building your own orchestration layer.",
body: "Send requests through a single API and route across models by cost, performance, or availability — without building your own orchestration layer.",
details: [
"Access models from multiple providers in one place",
"Route requests by task, cost, or performance",
"Route requests by cost, performance, or availability",
"Built-in fallback and usage controls",
],
visual: "multi-model",
Expand Down Expand Up @@ -160,25 +160,25 @@ export const agentBricksProduct: ProductPageContent = {
},
testimonials: [
{
company: "tibber",
company: "AstraZeneca",
quote:
"At Tibber, empowering customers to take control of their energy consumption requires a flexible data infrastructure. Lakebase's integration with Databricks makes it easy to serve analytical and transactional data, helping us deliver real-time insights to our customers.",
attributionName: "Niklas Nordansjo",
attributionTitle: "Data Platform Lead",
"With Agent Bricks, our teams were able to parse through more than 400,000 clinical trial documents and extract structured data points — without writing a single line of code. In just under 60 minutes, we had a working agent that can transform complex unstructured data usable for Analytics.",
attributionName: "Joseph Roemer",
attributionTitle: "Head of Data & AI, Commercial IT",
},
{
company: "Ensemble Health Partners",
company: "Flo Health",
quote:
"Lakebase lets an agentic team quickly self-serve the data they need for their models, whether it's historical claims or real-time transactions, and that's really powerful.",
attributionName: "Dragon Sky",
attributionTitle: "Chief Architect",
"Agent Bricks enabled us to double our medical accuracy over standard commercial LLMs, while meeting Flo Health's high internal standards for clinical accuracy, safety, privacy, and security.",
attributionName: "Roman Bugaev",
attributionTitle: "CTO",
},
{
company: "yipitDATA",
company: "Lippert",
quote:
"Lakebase gives us a durable, low-latency store for application state, so our data apps load quickly, refresh seamlessly and even support shared page links between users.",
attributionName: "Bobby Muldoon",
attributionTitle: "VP of Engineering",
"With Agent Bricks, we can quickly productionize domain-specific AI agents for tasks like extracting insights from customer support calls — something that used to take weeks of manual review.",
attributionName: "Chris Nishnick",
attributionTitle: "Director of AI",
},
],
};
35 changes: 17 additions & 18 deletions src/lib/products/databricks-apps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@ export const databricksAppsProduct: ProductPageContent = {
index: "01",
title: "Run your app inside Databricks.",
description:
"Serverless hosting for full-stack apps, with compute, routing, and deployment handled.",
"Serverless hosting for full-stack apps, with compute, TLS, and deployment handled.",
body: "Apps run inside your workspace — no infrastructure to manage and no separate hosting to maintain.",
details: [
"Containerized runtime with managed compute",
"Built-in routing, TLS, and app URLs",
"Built-in routing, TLS, and app URLs",
"Built-in TLS and automatic HTTPS app URLs",
"Automatic builds and deploys from source",
],
visual: "serverless",
},
Expand Down Expand Up @@ -155,31 +155,30 @@ export const databricksAppsProduct: ProductPageContent = {
],
testimonialsIntro: {
eyebrow: "Testimonials",
titleLead: "Lakebase powers applications.",
titleMuted:
"See how teams use it to bring data directly into user experiences.",
titleLead: "Databricks Apps powers real applications.",
titleMuted: "See how teams ship data and AI apps on the platform.",
},
testimonials: [
{
company: "tibber",
company: "SAE International",
quote:
"At Tibber, empowering customers to take control of their energy consumption requires a flexible data infrastructure. Lakebase's integration with Databricks makes it easy to serve analytical and transactional data, helping us deliver real-time insights to our customers.",
attributionName: "Niklas Nordansjo",
attributionTitle: "Data Platform Lead",
"Databricks Apps helped me turn my RAG proof of concept into a polished and branded application. We built a RAG system to answer user questions by utilizing our company's extensive knowledge base.",
attributionName: "Heather Gomer",
attributionTitle: "Senior Data Scientist",
},
{
company: "Ensemble Health Partners",
company: "E.ON Digital Technology",
quote:
"Lakebase lets an agentic team quickly self-serve the data they need for their models, whether it's historical claims or real-time transactions, and that's really powerful.",
attributionName: "Dragon Sky",
attributionTitle: "Chief Architect",
"The seamless integration of Databricks Apps into our DevOps processes enables us to quickly demonstrate and test new features with users while also providing a secure, production-ready front end for the internal application — all without needing additional infrastructure.",
attributionName: "Lukas Heidegger",
attributionTitle: "Data and MLOps Engineer",
},
{
company: "yipitDATA",
company: "Addi",
quote:
"Lakebase gives us a durable, low-latency store for application state, so our data apps load quickly, refresh seamlessly and even support shared page links between users.",
attributionName: "Bobby Muldoon",
attributionTitle: "VP of Engineering",
"By using Databricks Apps, we saved many rounds with the security and infrastructure team and were able to instantly share our app with stakeholders in production.",
attributionName: "Cesar Augusto Charalla Olazo",
attributionTitle: "Senior Machine Learning Engineer",
},
],
};
5 changes: 3 additions & 2 deletions src/lib/products/lakebase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export const lakebaseProduct: ProductPageContent = {
title: "Right-size your compute automatically.",
description:
"Demand-driven, scaled to zero on idle, milliseconds to wake.",
body: "Lakebase tracks load in real time and adjusts capacity within the range you set, billing per active second.",
body: "Lakebase tracks load in real time and adjusts capacity within the range you set, with no compute cost while idle.",
details: [
"Non-disruptive scaling within range",
"Independent autoscaling per replica",
Expand All @@ -94,7 +94,8 @@ export const lakebaseProduct: ProductPageContent = {
eyebrow: "Lakehouse sync",
index: "03",
title: "Connect your app to your Lakehouse.",
description: "Two-way, fully managed, governed by Unity Catalog.",
description:
"Inbound and outbound, fully managed, governed by Unity Catalog.",
body: "Both directions are managed by Databricks, no external pipelines, no jobs you have to operate, no glue code to maintain.",
details: [
"Snapshot, triggered, or continuous sync",
Expand Down
2 changes: 1 addition & 1 deletion src/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export default function Home(): ReactNode {
<main>
<Hero />
<Templates />
{/* <Features /> */}
<Features />
<div className="bg-linear-to-b from-[#1A2E2F] from-65% to-[#2A4647]">
<LovedByDevelopers />
<CTA
Expand Down
File renamed without changes.
19 changes: 19 additions & 0 deletions src/pages/product/data-lakehouse.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import Head from "@docusaurus/Head";
import { Redirect } from "@docusaurus/router";
import useBaseUrl from "@docusaurus/useBaseUrl";
import type { ReactNode } from "react";

export default function LakebaseLegacyProductPage(): ReactNode {
const target = useBaseUrl("/product/lakebase");

return (
<>
<Head>
<meta name="robots" content="noindex, nofollow" />
<meta httpEquiv="refresh" content={`0; url=${target}`} />
<link rel="canonical" href={target} />
</Head>
<Redirect to={target} />
</>
);
}
File renamed without changes.
14 changes: 14 additions & 0 deletions static/img/products/testimonials/addi.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading