> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bfl.ml/llms.txt
> Use this file to discover all available pages before exploring further.

# The frontier of visual intelligence

> FLUX models generate and edit images and video, render synchronized audio, and drive robotics. State-of-the-art quality and creative control, through one API.

export const PathGrid = ({items = [], cols = 3}) => {
  const [hovered, setHovered] = useState(-1);
  const ICONS = {
    code: <><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></>,
    download: <><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /><polyline points="7 10 12 15 17 10" /><line x1="12" y1="15" x2="12" y2="3" /></>,
    learn: <><path d="M22 10 12 5 2 10l10 5 10-5z" /><path d="M6 12v5c0 1 2.5 2.5 6 2.5s6-1.5 6-2.5v-5" /></>,
    plug: <><path d="M12 22v-5" /><path d="M9 8V2" /><path d="M15 8V2" /><path d="M18 8v3a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8z" /></>,
    tools: <><path d="m15 4 5 5" /><path d="M12.5 6.5 4 15v5h5l8.5-8.5" /><path d="m18 2 4 4-2 2-4-4z" /></>,
    book: <><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" /><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z" /></>,
    server: <><rect x="2" y="3" width="20" height="7" rx="2" /><rect x="2" y="14" width="20" height="7" rx="2" /><line x1="6" y1="6.5" x2="6.01" y2="6.5" /><line x1="6" y1="17.5" x2="6.01" y2="17.5" /></>,
    rocket: <><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" /><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" /><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" /></>
  };
  return <div className="not-prose" style={{
    display: "grid",
    gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 16rem), 1fr))`,
    gap: "1rem",
    margin: "1.5rem 0 2rem"
  }}>
      {items.map((item, idx) => {
    const Tag = item.href ? "a" : "div";
    const isHover = hovered === idx;
    return <Tag key={idx} {...item.href ? {
      href: item.href
    } : {}} {...item.external ? {
      target: "_blank",
      rel: "noreferrer"
    } : {}} onMouseEnter={() => setHovered(idx)} onMouseLeave={() => setHovered(-1)} style={{
      position: "relative",
      display: "flex",
      flexDirection: "column",
      gap: "0.7rem",
      padding: "1.4rem 1.4rem 1.5rem",
      borderRadius: "1.1rem",
      border: "1px solid rgba(72,106,88,0.18)",
      background: "var(--aspen-paper, #fffdf9)",
      textDecoration: "none",
      color: "inherit",
      cursor: item.href ? "pointer" : "default",
      transform: isHover && item.href ? "translateY(-3px)" : "translateY(0)",
      boxShadow: isHover && item.href ? "0 18px 40px -22px rgba(22,49,38,0.4)" : "0 2px 6px -4px rgba(22,49,38,0.18)",
      transition: "transform 220ms ease, box-shadow 220ms ease, border-color 220ms ease",
      borderColor: isHover && item.href ? "rgba(72,106,88,0.4)" : "rgba(72,106,88,0.18)"
    }}>
            {}
            {item.external && <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="rgba(22,49,38,0.4)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" style={{
      position: "absolute",
      top: "1.1rem",
      right: "1.1rem"
    }}>
                <path d="M7 17 17 7" /><path d="M7 7h10v10" />
              </svg>}

            <div style={{
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
      width: "2.4rem",
      height: "2.4rem",
      borderRadius: "0.7rem",
      background: "rgba(72,106,88,0.12)",
      color: "var(--aspen-evergreen, #486a58)",
      flexShrink: 0
    }}>
              <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
                {ICONS[item.icon] || ICONS.book}
              </svg>
            </div>

            <h3 style={{
      margin: 0,
      fontFamily: '"Instrument Sans", sans-serif',
      fontSize: "1.15rem",
      fontWeight: 600,
      letterSpacing: "-0.02em",
      lineHeight: 1.2,
      color: "var(--aspen-ink, #163126)"
    }}>
              {item.title}
            </h3>

            {item.desc && <p style={{
      margin: 0,
      fontSize: "0.9rem",
      lineHeight: 1.55,
      color: "rgba(22,49,38,0.62)"
    }}>
                {item.desc}
              </p>}

            {item.href && <span style={{
      marginTop: "auto",
      paddingTop: "0.45rem",
      display: "inline-flex",
      alignItems: "center",
      gap: "0.3rem",
      fontSize: "0.82rem",
      fontWeight: 600,
      color: "var(--aspen-evergreen, #486a58)"
    }}>
                {item.cta || "Explore"}
                <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" style={{
      transform: isHover ? "translateX(3px)" : "translateX(0)",
      transition: "transform 200ms ease"
    }}>
                  <line x1="5" y1="12" x2="19" y2="12" />
                  <polyline points="12 5 19 12 12 19" />
                </svg>
              </span>}
          </Tag>;
  })}
    </div>;
};

export const ModalityGrid = ({items = [], cols = 3}) => {
  const [hovered, setHovered] = useState(-1);
  const ICONS = {
    image: <>
        <rect x="3" y="3" width="18" height="18" rx="2" ry="2" />
        <circle cx="8.5" cy="8.5" r="1.5" />
        <polyline points="21 15 16 10 5 21" />
      </>,
    video: <>
        <polygon points="23 7 16 12 23 17 23 7" />
        <rect x="1" y="5" width="15" height="14" rx="2" ry="2" />
      </>,
    edit: <>
        <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
        <path d="M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" />
      </>,
    audio: <>
        <path d="M11 5 6 9H2v6h4l5 4V5z" />
        <path d="M15.54 8.46a5 5 0 0 1 0 7.07" />
        <path d="M19.07 4.93a10 10 0 0 1 0 14.14" />
      </>,
    robotics: <>
        <rect x="3" y="11" width="18" height="10" rx="2" />
        <circle cx="12" cy="5" r="2" />
        <path d="M12 7v4" />
        <line x1="8" y1="16" x2="8" y2="16" />
        <line x1="16" y1="16" x2="16" y2="16" />
      </>
  };
  const renderIO = io => {
    const parts = io.split(/→|->/);
    return <span style={{
      display: "inline-flex",
      alignItems: "center",
      gap: "0.4rem",
      flexWrap: "wrap"
    }}>
        {parts.map((p, i) => <span key={i} style={{
      display: "inline-flex",
      alignItems: "center",
      gap: "0.4rem"
    }}>
            <span>{p.trim()}</span>
            {i < parts.length - 1 && <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--aspen-evergreen, #486a58)" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" style={{
      flexShrink: 0
    }}>
                <line x1="5" y1="12" x2="19" y2="12" />
                <polyline points="12 5 19 12 12 19" />
              </svg>}
          </span>)}
      </span>;
  };
  return <div className="not-prose" style={{
    display: "grid",
    gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 15rem), 1fr))`,
    gap: "1rem",
    margin: "1.5rem 0 2rem"
  }}>
      {items.map((item, idx) => {
    const Tag = item.href ? "a" : "div";
    const isHover = hovered === idx;
    return <Tag key={idx} {...item.href ? {
      href: item.href
    } : {}} onMouseEnter={() => setHovered(idx)} onMouseLeave={() => setHovered(-1)} style={{
      position: "relative",
      display: "flex",
      flexDirection: "column",
      gap: "0.7rem",
      padding: "1.4rem 1.4rem 1.5rem",
      borderRadius: "1.1rem",
      border: "1px solid rgba(72,106,88,0.18)",
      background: "var(--aspen-paper, #fffdf9)",
      textDecoration: "none",
      color: "inherit",
      cursor: item.href ? "pointer" : "default",
      transform: isHover && item.href ? "translateY(-3px)" : "translateY(0)",
      boxShadow: isHover && item.href ? "0 18px 40px -22px rgba(22,49,38,0.4)" : "0 2px 6px -4px rgba(22,49,38,0.18)",
      transition: "transform 220ms ease, box-shadow 220ms ease, border-color 220ms ease",
      borderColor: isHover && item.href ? "rgba(72,106,88,0.4)" : "rgba(72,106,88,0.18)"
    }}>
            <div style={{
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
      width: "2.4rem",
      height: "2.4rem",
      borderRadius: "0.7rem",
      background: "rgba(72,106,88,0.12)",
      color: "var(--aspen-evergreen, #486a58)"
    }}>
              <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
                {ICONS[item.icon] || ICONS.image}
              </svg>
            </div>

            <h3 style={{
      margin: 0,
      fontFamily: '"Instrument Sans", sans-serif',
      fontSize: "1.15rem",
      fontWeight: 600,
      letterSpacing: "-0.02em",
      color: "var(--aspen-ink, #163126)"
    }}>
              {item.title}
            </h3>

            {item.io && <div style={{
      fontFamily: '"IBM Plex Mono", "SF Mono", monospace',
      fontSize: "0.78rem",
      fontWeight: 500,
      color: "rgba(22,49,38,0.7)"
    }}>
                {renderIO(item.io)}
              </div>}

            {item.desc && <p style={{
      margin: 0,
      fontSize: "0.9rem",
      lineHeight: 1.55,
      color: "rgba(22,49,38,0.62)"
    }}>
                {item.desc}
              </p>}

            {item.href && <span style={{
      marginTop: "auto",
      paddingTop: "0.35rem",
      display: "inline-flex",
      alignItems: "center",
      gap: "0.3rem",
      fontSize: "0.82rem",
      fontWeight: 600,
      color: "var(--aspen-evergreen, #486a58)"
    }}>
                Explore
                <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" style={{
      transform: isHover ? "translateX(3px)" : "translateX(0)",
      transition: "transform 200ms ease"
    }}>
                  <line x1="5" y1="12" x2="19" y2="12" />
                  <polyline points="12 5 19 12 12 19" />
                </svg>
              </span>}
          </Tag>;
  })}
    </div>;
};

<div className="frontier-intro-page flux3-page">
  <div className="not-prose frontier-intro-hero cinematic-hero-root">
    <img src="https://cdn.sanity.io/images/2gpum2i6/production/8932f074e88a36f94ab1707ef28a87bbd4868896-2232x1166.png" alt="Frontier Visual Intelligence artwork" className="frontier-intro-hero__image" />
  </div>

  ## Start with FLUX 3

  Our latest model family — one model, one API. Pick where you want to start.

  <ModalityGrid
    cols={3}
    items={[
{ title: "Text-to-Video", icon: "video", io: "Text → Video", desc: "Generate motion from a prompt, with synchronized audio included.", href: "/flux_3/flux3_video" },
{ title: "Image-to-Video", icon: "image", io: "Image → Video", desc: "Animate a still or pin keyframes into a clip.", href: "/flux_3/flux3_video" },
{ title: "Audio", icon: "audio", io: "Video with sound", desc: "Multilingual speech, effects, and ambience rendered with the frames.", href: "/flux_3/flux3_video#audio" },
]}
  />

  ## Choose your path

  <PathGrid
    cols={3}
    items={[
{ title: "Build with the API", icon: "code", desc: "Create an account, add credits, and make your first call in minutes.", href: "/quick_start/get_started", cta: "Get started" },
{ title: "Run open weights", icon: "download", desc: "Deploy FLUX.2 [klein] and [dev] models on your own infrastructure.", href: "https://huggingface.co/black-forest-labs", external: true, cta: "Hugging Face" },
{ title: "Learn prompting", icon: "learn", desc: "Get the best results from FLUX with our prompting and editing guides.", href: "/guides/prompting_summary", cta: "Read the guides" },
{ title: "Use FLUX via MCP", icon: "plug", desc: "Generate and edit inside Claude, Cursor, Codex, and more.", href: "/api_integration/mcp_integration", cta: "Set up MCP" },
{ title: "FLUX Tools", icon: "tools", desc: "Targeted editing: outpainting, erase, deblur, and virtual try-on.", href: "/flux_tools/flux_outpainting", cta: "Explore tools" },
{ title: "API Reference", icon: "book", desc: "Full endpoint reference for every FLUX model.", href: "/flux_3/flux3_overview", cta: "Browse the API" },
]}
  />

  <Note>
    Looking for **FLUX.2** or **FLUX.1 Kontext**? They're in the sidebar under their
    own sections. FLUX.2 remains fully supported for production image generation and editing.
  </Note>

  ## Host your own models

  <PathGrid
    cols={1}
    items={[
{ title: "Self-host FLUX", icon: "server", desc: "Deploy FLUX.2 [klein] (Apache 2.0 / FLUX Non-Commercial), FLUX.1 [dev], FLUX.1 Tools [dev], and FLUX.1 Kontext [dev] on your own infrastructure. Full control, no API limits.", href: "https://bfl.ai/licensing", external: true, cta: "View licensing" },
]}
  />

  Ready to start creating? [Try the playground](https://playground.bfl.ai) or [make your first API call](/quick_start/generating_images).
</div>
