diff --git a/.asf.yaml b/.asf.yaml index 1c342d43d..344bbcf6f 100644 --- a/.asf.yaml +++ b/.asf.yaml @@ -62,10 +62,13 @@ github: required_status_checks: # strict means "Require branches to be up to date before merging". strict: false - # contexts are the names of checks that must pass + # The Release Validation workflow ends in a single "summary" job that + # runs with if: always() and translates upstream SUCCESS or SKIPPED + # into a definite SUCCESS, FAILURE into FAILURE. That gives us one + # stable required check name regardless of whether the upstream jobs + # ran (real code PR) or were path-filtered out (docs/website PR). contexts: - - "Release Validation / build-artifacts" - - "Release Validation / install-and-smoke (3.12)" + - "Release Validation / summary" required_pull_request_reviews: dismiss_stale_reviews: false require_code_owner_reviews: false diff --git a/.github/workflows/release-validation.yml b/.github/workflows/release-validation.yml index 6271cd80c..a1872db35 100644 --- a/.github/workflows/release-validation.yml +++ b/.github/workflows/release-validation.yml @@ -193,3 +193,33 @@ jobs: path: /tmp/burr-smoke-* retention-days: 7 if-no-files-found: ignore + + # Single stable required-check name. Always runs (if: always()) so it produces + # a definite SUCCESS or FAILURE β€” never SKIPPED. Branch protection in + # .asf.yaml requires this context, not the underlying jobs, so path-filtered + # docs/website PRs (where the upstream jobs are skipped) still go green here. + summary: + name: "Release Validation / summary" + needs: [check-paths, build-artifacts, install-and-smoke] + if: always() + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Verdict + env: + CHECK_PATHS: ${{ needs.check-paths.result }} + BUILD_ARTIFACTS: ${{ needs.build-artifacts.result }} + INSTALL_AND_SMOKE: ${{ needs.install-and-smoke.result }} + run: | + echo "check-paths: $CHECK_PATHS" + echo "build-artifacts: $BUILD_ARTIFACTS" + echo "install-and-smoke: $INSTALL_AND_SMOKE" + # Pass if every needed job is success or skipped; fail if any + # failed or was cancelled. + for r in "$CHECK_PATHS" "$BUILD_ARTIFACTS" "$INSTALL_AND_SMOKE"; do + case "$r" in + success|skipped) ;; + *) echo "::error::Release Validation failed (one or more jobs not success/skipped)"; exit 1 ;; + esac + done + echo "Release Validation: all upstream jobs success or skipped." diff --git a/README.md b/README.md index ac155fc98..f7b177294 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Longer [video intro & walkthrough](https://www.youtube.com/watch?v=rEZ4oDN0GdU). Install from `pypi`: ```bash -pip install "burr[start]" +pip install "apache-burr[start]" ``` (see [the docs](https://burr.apache.org/getting_started/install/) if you're using poetry) diff --git a/burr/core/action.py b/burr/core/action.py index 5a228e0ad..58b5ecd17 100644 --- a/burr/core/action.py +++ b/burr/core/action.py @@ -1462,7 +1462,7 @@ def pydantic( from burr.integrations.pydantic import pydantic_action except ImportError: raise ImportError( - "Please install pydantic to use the pydantic decorator. pip install burr[pydantic]" + "Please install pydantic to use the pydantic decorator. pip install apache-burr[pydantic]" ) return pydantic_action( @@ -1525,7 +1525,7 @@ def pydantic( from burr.integrations.pydantic import pydantic_streaming_action except ImportError: raise ImportError( - "Please install pydantic to use the pydantic decorator. pip install 'burr[pydantic]'" + "Please install pydantic to use the pydantic decorator. pip install 'apache-burr[pydantic]'" ) return pydantic_streaming_action( diff --git a/burr/core/graph.py b/burr/core/graph.py index b31e1cab6..fcbc9c5cb 100644 --- a/burr/core/graph.py +++ b/burr/core/graph.py @@ -107,9 +107,7 @@ def _render_graphviz( graphviz_obj.render(path_without_suffix, format=fmt, view=view) else: # `.pipe()` doesn't append the format to the filename, so we do it explicitly - pathlib.Path(f"{path_without_suffix}.{fmt}").write_bytes( - graphviz_obj.pipe(format=fmt) - ) + pathlib.Path(f"{path_without_suffix}.{fmt}").write_bytes(graphviz_obj.pipe(format=fmt)) @dataclasses.dataclass @@ -208,7 +206,7 @@ def visualize( except ModuleNotFoundError: logger.exception( " graphviz is required for visualizing the application graph. Install it with:" - '\n\n pip install "burr[graphviz]" or pip install graphviz \n\n' + '\n\n pip install "apache-burr[graphviz]" or pip install graphviz \n\n' ) return digraph_attr = dict( diff --git a/burr/tracking/server/s3/README.md b/burr/tracking/server/s3/README.md index 62a6035b2..42c11a110 100644 --- a/burr/tracking/server/s3/README.md +++ b/burr/tracking/server/s3/README.md @@ -33,7 +33,7 @@ The server is executable by a simple python command (although in production you' To get everything you need, you can install as you would any python library: ```bash -pip install "burr[tracking-server-s3, cli]" +pip install "apache-burr[tracking-server-s3, cli]" ``` Note that this enables you to run through the CLI -- you won't need the CLI target to run in production, diff --git a/docs/concepts/tracking.rst b/docs/concepts/tracking.rst index 1e69b4525..96895d0b7 100644 --- a/docs/concepts/tracking.rst +++ b/docs/concepts/tracking.rst @@ -27,7 +27,7 @@ Tracking Burr Burr's telemetry system is built in and easy to integrate. It allows you to understand the flow of your application, and watch it make decisions in real time. You can run it - with sample projects by running ``burr`` in the terminal after ``pip install "burr[start]"``. + with sample projects by running ``burr`` in the terminal after ``pip install "apache-burr[start]"``. Burr comes with a telemetry system that allows tracking a variety of information for debugging, both in development and production. diff --git a/docs/examples/chatbots/rag-chatbot-hamilton.ipynb b/docs/examples/chatbots/rag-chatbot-hamilton.ipynb index a537d1caf..d8e4beb75 100644 --- a/docs/examples/chatbots/rag-chatbot-hamilton.ipynb +++ b/docs/examples/chatbots/rag-chatbot-hamilton.ipynb @@ -31,7 +31,7 @@ }, "outputs": [], "source": [ - "!pip install burr[start] sf-hamilton[visualization] openai " + "!pip install apache-burr[start] sf-hamilton[visualization] openai " ] }, { diff --git a/docs/getting_started/install.rst b/docs/getting_started/install.rst index 335401758..0696c0eda 100644 --- a/docs/getting_started/install.rst +++ b/docs/getting_started/install.rst @@ -28,7 +28,7 @@ along with a fully built server. .. code-block:: bash - pip install "burr[start]" + pip install "apache-burr[start]" This will give you tools to visualize, track, and interact with the UI. You can explore the UI (including some sample projects) simply by running the command ``burr``. Up next we'll write our own application and follow it in the UI. @@ -48,135 +48,135 @@ Description of different targets .. code-block:: bash - pip install burr + pip install apache-burr This only installs the framework. Zero other dependencies. All other installs below all install the framework + some other dependencies. Note you can combine installing multiple optional dependencies with commas, e.g. -``pip install "burr[cli,tracking]"`` installs both the CLI and tracking + UI dependencies. +``pip install "apache-burr[cli,tracking]"`` installs both the CLI and tracking + UI dependencies. .. code-block:: bash - pip install "burr[cli]" + pip install "apache-burr[cli]" This installs the dependencies to run the burr CLI, i.e. `burr --help`. .. code-block:: bash - pip install "burr[developer]" + pip install "apache-burr[developer]" This installs all the dependencies for developing locally. .. code-block:: bash - pip install "burr[documentation]" + pip install "apache-burr[documentation]" This installs the dependencies to build the documentation. .. code-block:: bash - pip install "burr[examples]" + pip install "apache-burr[examples]" This installs the dependencies for the examples. .. code-block:: bash - pip install "burr[graphviz]" + pip install "apache-burr[graphviz]" This installs the dependencies to visualize the graph. .. code-block:: bash - pip install "burr[hamilton]" + pip install "apache-burr[hamilton]" This installs the dependencies for Hamilton. .. code-block:: bash - pip install "burr[haystack]" + pip install "apache-burr[haystack]" This installs the dependencies for Haystack. .. code-block:: bash - pip install "burr[learn]" + pip install "apache-burr[learn]" This installs the dependencies for the UI, CLI, and running demos. It is equivalent to `start` below. .. code-block:: bash - pip install "burr[opentelemetry]" + pip install "apache-burr[opentelemetry]" This installs the dependencies for using OpenTelemetry with Burr. .. code-block:: bash - pip install "burr[postgresql]" + pip install "apache-burr[postgresql]" This installs the dependencies for PostgreSQL. .. code-block:: bash - pip install "burr[pydantic]" + pip install "apache-burr[pydantic]" This installs the dependencies for Pydantic. .. code-block:: bash - pip install "burr[redis]" + pip install "apache-burr[redis]" This installs the dependencies for Redis. .. code-block:: bash - pip install "burr[start]" + pip install "apache-burr[start]" This installs the dependencies for the UI, CLI, and running demos. It is equivalent to `learn` above. .. code-block:: bash - pip install "burr[streamlit]" + pip install "apache-burr[streamlit]" This installs the dependencies for Streamlit. .. code-block:: bash - pip install "burr[tests]" + pip install "apache-burr[tests]" This installs the dependencies for running unit tests. .. code-block:: bash - pip install "burr[tracking]" + pip install "apache-burr[tracking]" This installs the client and server dependencies for tracking and running the UI from tracking that is on a filesystem. .. code-block:: bash - pip install "burr[tracking-client]" + pip install "apache-burr[tracking-client]" This installs the client dependencies for tracking to a filesystem. .. code-block:: bash - pip install "burr[tracking-client-s3]" + pip install "apache-burr[tracking-client-s3]" This installs the client dependencies for tracking to S3. .. code-block:: bash - pip install "burr[tracking-server-s3]" + pip install "apache-burr[tracking-server-s3]" This installs the server dependencies to run the UI and load tracking that was sent to S3. .. code-block:: bash - pip install "burr[tracking-server]" + pip install "apache-burr[tracking-server]" This installs the server dependencies for running the UI off a filesystem. .. code-block:: bash - pip install "burr[bedrock]" + pip install "apache-burr[bedrock]" This installs ``boto3`` for the :ref:`Amazon Bedrock integration ` (``BedrockAction`` / ``BedrockStreamingAction``). diff --git a/docs/getting_started/up-next.rst b/docs/getting_started/up-next.rst index 7acb2d28c..bcf12af91 100644 --- a/docs/getting_started/up-next.rst +++ b/docs/getting_started/up-next.rst @@ -38,7 +38,7 @@ If you haven't already: .. code-block:: bash - pip install burr[start] + pip install apache-burr[start] Then: diff --git a/docs/reference/integrations/bedrock.rst b/docs/reference/integrations/bedrock.rst index 934b62694..0dc3a6f08 100644 --- a/docs/reference/integrations/bedrock.rst +++ b/docs/reference/integrations/bedrock.rst @@ -30,7 +30,7 @@ Install the optional extra (pulls ``boto3``): .. code-block:: bash - pip install "burr[bedrock]" + pip install "apache-burr[bedrock]" IAM permissions must allow ``bedrock:InvokeModel`` / streaming equivalents for your chosen models; see AWS documentation for your account and model IDs. diff --git a/docs/reference/integrations/streamlit.rst b/docs/reference/integrations/streamlit.rst index 05e1cbe39..73a1d587e 100644 --- a/docs/reference/integrations/streamlit.rst +++ b/docs/reference/integrations/streamlit.rst @@ -28,7 +28,7 @@ Install with pypi: .. code-block:: bash - pip install burr[streamlit] + pip install apache-burr[streamlit] .. autoclass:: burr.integrations.streamlit.AppState :members: diff --git a/examples/conversational-rag/simple_example/README.md b/examples/conversational-rag/simple_example/README.md index 221a4e4e1..8e3297351 100644 --- a/examples/conversational-rag/simple_example/README.md +++ b/examples/conversational-rag/simple_example/README.md @@ -34,7 +34,7 @@ of the conversation and asking for user inputs. To run this example, install Burr and the necessary dependencies: ```bash -pip install "burr[start]" -r requirements.txt +pip install "apache-burr[start]" -r requirements.txt ``` Then run the server in the background: diff --git a/examples/conversational-rag/simple_example/notebook.ipynb b/examples/conversational-rag/simple_example/notebook.ipynb index fa0d4d665..123bf0387 100644 --- a/examples/conversational-rag/simple_example/notebook.ipynb +++ b/examples/conversational-rag/simple_example/notebook.ipynb @@ -32,7 +32,7 @@ } }, "source": [ - "!pip install burr[start] sf-hamilton[visualization] openai " + "!pip install apache-burr[start] sf-hamilton[visualization] openai " ], "outputs": [] }, diff --git a/examples/custom-serde/notebook.ipynb b/examples/custom-serde/notebook.ipynb index 825a044ad..c1ffabbc2 100644 --- a/examples/custom-serde/notebook.ipynb +++ b/examples/custom-serde/notebook.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install burr[start] langchain_core langchain_community pydantic\n", + "!pip install apache-burr[start] langchain_core langchain_community pydantic\n", "# we only need these to show case the automatic serialization and deserialization that Burr has." ] }, diff --git a/examples/deep-researcher/notebook.ipynb b/examples/deep-researcher/notebook.ipynb index 6243b2ebe..3482f73db 100644 --- a/examples/deep-researcher/notebook.ipynb +++ b/examples/deep-researcher/notebook.ipynb @@ -143,7 +143,7 @@ ], "execution_count": 1, "source": [ - "!pip install burr[start]\n", + "!pip install apache-burr[start]\n", "!pip install openai\n", "!pip install tavily-python" ], diff --git a/examples/email-assistant/notebook.ipynb b/examples/email-assistant/notebook.ipynb index b8e423dbb..dac0d7fb2 100644 --- a/examples/email-assistant/notebook.ipynb +++ b/examples/email-assistant/notebook.ipynb @@ -18,7 +18,7 @@ "cell_type": "code", "outputs": [], "execution_count": null, - "source": "!pip install burr[start] openai", + "source": "!pip install apache-burr[start] openai", "id": "25717d145f989eec" }, { diff --git a/examples/hello-world-counter/notebook.ipynb b/examples/hello-world-counter/notebook.ipynb index 2a94846fe..674f229c4 100644 --- a/examples/hello-world-counter/notebook.ipynb +++ b/examples/hello-world-counter/notebook.ipynb @@ -18,7 +18,7 @@ "cell_type": "code", "outputs": [], "execution_count": null, - "source": "!pip install burr[start]", + "source": "!pip install apache-burr[start]", "id": "500d692cd72c67b3" }, { diff --git a/examples/image-telephone/notebook.ipynb b/examples/image-telephone/notebook.ipynb index edf305f5a..a641321ab 100644 --- a/examples/image-telephone/notebook.ipynb +++ b/examples/image-telephone/notebook.ipynb @@ -17,7 +17,7 @@ }, "outputs": [], "source": [ - "!pip install burr[start] openai requests" + "!pip install apache-burr[start] openai requests" ] }, { diff --git a/examples/llm-adventure-game/notebook.ipynb b/examples/llm-adventure-game/notebook.ipynb index 1a29a2235..7c2c8246c 100644 --- a/examples/llm-adventure-game/notebook.ipynb +++ b/examples/llm-adventure-game/notebook.ipynb @@ -20,7 +20,7 @@ }, "outputs": [], "source": [ - "!pip install burr[start]" + "!pip install apache-burr[start]" ] }, { diff --git a/examples/multi-agent-collaboration/README.md b/examples/multi-agent-collaboration/README.md index ecd6c18a5..97e63922b 100644 --- a/examples/multi-agent-collaboration/README.md +++ b/examples/multi-agent-collaboration/README.md @@ -50,7 +50,7 @@ More functionality is on the roadmap! Install the dependencies: ```bash -pip install "burr[start]" -r requirements.txt +pip install "apache-burr[start]" -r requirements.txt ``` Make sure you have the API Keys in your environment: diff --git a/examples/multi-agent-collaboration/hamilton/README.md b/examples/multi-agent-collaboration/hamilton/README.md index 097885c95..333be8772 100644 --- a/examples/multi-agent-collaboration/hamilton/README.md +++ b/examples/multi-agent-collaboration/hamilton/README.md @@ -41,7 +41,7 @@ More functionality is on the roadmap! Install the dependencies: ```bash -pip install "burr[start]" -r requirements.txt +pip install "apache-burr[start]" -r requirements.txt ``` Make sure you have the API Keys in your environment: diff --git a/examples/multi-agent-collaboration/lcel/README.md b/examples/multi-agent-collaboration/lcel/README.md index f53af8b99..8ea404412 100644 --- a/examples/multi-agent-collaboration/lcel/README.md +++ b/examples/multi-agent-collaboration/lcel/README.md @@ -33,7 +33,7 @@ More functionality is on the roadmap! Install the dependencies: ```bash -pip install "burr[start]" -r requirements.txt +pip install "apache-burr[start]" -r requirements.txt ``` Make sure you have the API Keys in your environment: diff --git a/examples/multi-modal-chatbot/notebook.ipynb b/examples/multi-modal-chatbot/notebook.ipynb index 87c0084a6..56bc8adbc 100644 --- a/examples/multi-modal-chatbot/notebook.ipynb +++ b/examples/multi-modal-chatbot/notebook.ipynb @@ -13,7 +13,7 @@ "cell_type": "code", "outputs": [], "execution_count": null, - "source": "!pip install burr[start]", + "source": "!pip install apache-burr[start]", "id": "a1e0bae74e5d0d91" }, { diff --git a/examples/other-examples/cowsay/notebook.ipynb b/examples/other-examples/cowsay/notebook.ipynb index d4062c1ff..4cce75980 100644 --- a/examples/other-examples/cowsay/notebook.ipynb +++ b/examples/other-examples/cowsay/notebook.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install burr[start]" + "!pip install apache-burr[start]" ] }, { diff --git a/examples/ray/notebook.ipynb b/examples/ray/notebook.ipynb index 616434d9b..df1af60af 100644 --- a/examples/ray/notebook.ipynb +++ b/examples/ray/notebook.ipynb @@ -98,7 +98,7 @@ ], "source": [ "# execute to load the Burr and Hamilton extensions\n", - "%pip install burr openai ray\n", + "%pip install apache-burr openai ray\n", "%load_ext burr.integrations.notebook" ] }, diff --git a/examples/simple-chatbot-intro/README.md b/examples/simple-chatbot-intro/README.md index 059dc1346..f541973ef 100644 --- a/examples/simple-chatbot-intro/README.md +++ b/examples/simple-chatbot-intro/README.md @@ -22,7 +22,7 @@ Example that goes with [introductory blog post](https://blog.dagworks.io/p/burr- ## πŸƒQuick start ```bash -pip install "burr[start]" jupyter +pip install "apache-burr[start]" jupyter ``` Run the notebook: diff --git a/examples/streaming-fastapi/notebook.ipynb b/examples/streaming-fastapi/notebook.ipynb index 41e31eb65..9d12018ef 100644 --- a/examples/streaming-fastapi/notebook.ipynb +++ b/examples/streaming-fastapi/notebook.ipynb @@ -13,7 +13,7 @@ "cell_type": "code", "outputs": [], "execution_count": null, - "source": "!pip install burr[start]", + "source": "!pip install apache-burr[start]", "id": "5e46f9824f7c180a" }, { diff --git a/examples/streaming-overview/notebook.ipynb b/examples/streaming-overview/notebook.ipynb index 0634b2b64..1dd9f037e 100644 --- a/examples/streaming-overview/notebook.ipynb +++ b/examples/streaming-overview/notebook.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install burr[start]" + "!pip install apache-burr[start]" ] }, { diff --git a/examples/talks/data_for_ai_oct_2024.ipynb b/examples/talks/data_for_ai_oct_2024.ipynb index d135741cd..6077fb270 100644 --- a/examples/talks/data_for_ai_oct_2024.ipynb +++ b/examples/talks/data_for_ai_oct_2024.ipynb @@ -41,7 +41,7 @@ "metadata": {}, "outputs": [], "source": [ - "#!pip install burr[start,opentelemetry] opentelemetry-instrumentation-openai" + "#!pip install apache-burr[start,opentelemetry] opentelemetry-instrumentation-openai" ] }, { diff --git a/examples/test-case-creation/notebook.ipynb b/examples/test-case-creation/notebook.ipynb index 61e1064a2..df1ba89ee 100644 --- a/examples/test-case-creation/notebook.ipynb +++ b/examples/test-case-creation/notebook.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install burr[start]" + "!pip install apache-burr[start]" ] }, { diff --git a/examples/tracing-and-spans/notebook.ipynb b/examples/tracing-and-spans/notebook.ipynb index f4bff96d8..7eab9cf07 100644 --- a/examples/tracing-and-spans/notebook.ipynb +++ b/examples/tracing-and-spans/notebook.ipynb @@ -15,7 +15,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install burr[start]" + "!pip install apache-burr[start]" ] }, { diff --git a/examples/typed-state/notebook.ipynb b/examples/typed-state/notebook.ipynb index 38cd8bbad..b4843e7e7 100644 --- a/examples/typed-state/notebook.ipynb +++ b/examples/typed-state/notebook.ipynb @@ -73,7 +73,7 @@ } ], "source": [ - "%pip install 'burr[pydantic]' instructor openai rich" + "%pip install 'apache-burr[pydantic]' instructor openai rich" ] }, { diff --git a/examples/web-server/README.md b/examples/web-server/README.md index 20253933a..26d9a07d5 100644 --- a/examples/web-server/README.md +++ b/examples/web-server/README.md @@ -38,7 +38,7 @@ it requires human assistance at multiple points to build a better product. If you want to get a sense for how this looks, open the burr UI: ```bash -pip install "burr[start]" +pip install "apache-burr[start]" burr ``` diff --git a/website/.gitignore b/website/.gitignore index a047376c6..ae5e03fe6 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -4,3 +4,7 @@ out/ *.tsbuildinfo next-env.d.ts public/docs/ + +# The repo-root .gitignore has `downloads/` (Python packaging convention), +# which would otherwise hide the Next.js /downloads app route. Re-include it. +!src/app/downloads/ diff --git a/website/src/app/downloads/page.tsx b/website/src/app/downloads/page.tsx new file mode 100644 index 000000000..3ab220db8 --- /dev/null +++ b/website/src/app/downloads/page.tsx @@ -0,0 +1,514 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type { Metadata } from "next"; +import Navbar from "@/components/Navbar"; +import Footer from "@/components/Footer"; +import { GITHUB_REPO, DOCS_URL } from "@/lib/constants"; + +export const metadata: Metadata = { + title: "Download β€” Apache Burr (Incubating)", + description: + "Install Apache Burr from PyPI, or download the official Apache source releases with signatures and checksums.", +}; + +const PYPI_URL = "https://pypi.org/project/apache-burr/"; +const EXAMPLES_URL = `${GITHUB_REPO}/tree/main/examples`; +const DISCORD_URL = "https://discord.gg/6Zy2DwP4f3"; + +const MIRROR_BASE = "https://www.apache.org/dyn/closer.lua/incubator/burr"; +const DIST_BASE = "https://downloads.apache.org/incubator/burr"; +const KEYS_URL = `${DIST_BASE}/KEYS`; +const ARCHIVE_URL = "https://archive.apache.org/dist/incubator/burr/"; +const VERIFY_DOC_URL = "https://www.apache.org/info/verification.html"; +const RELEASE_POLICY_URL = + "https://www.apache.org/legal/release-policy.html#publication"; + +// Adding a new release: append a single entry to RELEASES below. The +// artifact filenames, labels, and descriptions are derived from the +// version via ARTIFACT_TEMPLATES, so no per-release boilerplate is +// needed beyond the version + date. + +type Artifact = { + filename: string; + label: string; + description: string; +}; + +type Release = { + version: string; // e.g. "0.42.0" + date: string; // human-readable + note?: string; // optional caveat shown on the release card +}; + +type ArtifactTemplate = { + label: string; + filename: (version: string) => string; + description: (version: string) => string; +}; + +const ARTIFACT_TEMPLATES: ArtifactTemplate[] = [ + { + label: "Source release", + filename: (v) => `apache-burr-${v}-incubating-src.tar.gz`, + description: () => + "The official source release. This is the artifact voted on by the IPMC.", + }, + { + label: "Python sdist", + filename: (v) => `apache-burr-${v}-incubating-sdist.tar.gz`, + description: () => + "Python source distribution used by flit to build the wheel. Convenience artifact.", + }, + { + label: "Python wheel", + filename: (v) => `apache_burr-${v}-py3-none-any.whl`, + description: (v) => + `Pre-built Python wheel. Convenience binary, also published on PyPI as apache-burr ${v}.`, + }, +]; + +// To add a release, prepend an entry. The first entry is rendered as "Latest". +const RELEASES: Release[] = [ + { version: "0.42.0", date: "May 9, 2026" }, + { + version: "0.41.0", + date: "January 2026", + note: "The PyPI wheel for 0.41.0 had packaging issues. Build from the source release if you need this version, or just use 0.42.0.", + }, +]; + +function artifactsFor(version: string): Artifact[] { + return ARTIFACT_TEMPLATES.map((t) => ({ + filename: t.filename(version), + label: t.label, + description: t.description(version), + })); +} + +const LATEST = RELEASES[0]; + +function mirrorUrl(version: string, filename: string): string { + return `${MIRROR_BASE}/${version}/${filename}?action=download`; +} + +function directUrl(version: string, filename: string, ext: string): string { + return `${DIST_BASE}/${version}/${filename}.${ext}`; +} + +function ReleaseSection({ + release, + isLatest, +}: { + release: Release; + isLatest: boolean; +}) { + const headingId = `release-${release.version}`; + return ( +
+
+

+ {release.version}{" "} + (incubating) +

+ {isLatest && ( + + Latest + + )} + + Released {release.date} + +
+ + {release.note && ( +
+ + Note: + {" "} + {release.note} +
+ )} + +
+ + + + + + + + + + + {artifactsFor(release.version).map((a) => ( + + + + + + + ))} + +
ArtifactDownloadSignatureChecksum
+
{a.label}
+
+ {a.description} +
+
+ + {a.filename} + + + + .asc + + + + .sha512 + +
+
+ +

+ Tarball links use the{" "} + + ASF mirror selection service + + . Signatures and checksums are served directly from{" "} + downloads.apache.org over HTTPS. +

+
+ ); +} + +function LinkCard({ + href, + title, + description, + external = true, +}: { + href: string; + title: string; + description: string; + external?: boolean; +}) { + return ( + +
{title}
+
{description}
+
+ ); +} + +export default function DownloadsPage() { + return ( + <> + +
+
+ {/* Header */} +
+

+ Get Apache Burr{" "} + (incubating) +

+

+ Install from PyPI, run the UI locally, or grab the official + Apache source release. +

+
+ + {/* Install */} +
+

Install

+
+

+ Burr is on PyPI. Install with pip: +

+
+                pip install apache-burr
+              
+ +

+ For the tracking UI, examples, and common LLM integrations, + install the [learn]{" "} + extras: +

+
+                {`pip install "apache-burr[learn]"`}
+              
+ +

+ To pin a specific version: +

+
+                {`pip install "apache-burr==${LATEST.version}"`}
+              
+ +

+ Requires Python 3.10+. Burr has no required runtime + dependencies β€” extras are opt-in. +

+
+
+ + {/* Run the UI */} +
+

Run the UI

+
+

+ Once installed with the [learn]{" "} + extras, launch the local tracking UI to inspect and debug + your applications: +

+
+                burr
+              
+

+ Opens at{" "} + http://localhost:7241 + . Apps that use{" "} + .with_tracker("local"){" "} + will show up automatically. +

+
+
+ + {/* Quick links */} +
+

Where to next

+
+ + + + + + +
+
+ + {/* Apache source releases */} +
+

Apache source releases

+

+ Burr is an Apache Software Foundation project. The source release + is the official artifact voted on by the IPMC; per the{" "} + + ASF release policy + + , the wheel and sdist below are the same bits published to PyPI. + If you're packaging Burr for redistribution, or you simply + prefer to build from source, start here. +

+ +
+

+ Latest +

+ +
+ + {RELEASES.length > 1 && ( +
+

+ Previous +

+
+ {RELEASES.slice(1).map((r) => ( + + ))} +
+

+ Older releases live in the{" "} + + ASF archive + + . +

+
+ )} +
+ + {/* Verifying releases */} +
+

Verifying a release

+

+ If you're downloading source releases above, you{" "} + should verify + them before use. The PGP signature ( + .asc) proves the + release was signed by an Apache Burr release manager; the SHA-512 + checksum (.sha512) + detects transmission corruption. +

+ +

1. Import the KEYS file

+

+ The KEYS file holds the public PGP keys of all Apache Burr + release managers, served from{" "} + downloads.apache.org: +

+
+              {`curl -O ${KEYS_URL}
+gpg --import KEYS`}
+            
+ +

2. Verify the signature

+
+              {`gpg --verify apache-burr-${LATEST.version}-incubating-src.tar.gz.asc \\
+            apache-burr-${LATEST.version}-incubating-src.tar.gz`}
+            
+

+ Look for "Good signature from ..." in the output. A + warning that the key is not certified by a trusted signature is + expected unless you've set up a web of trust β€” what matters + is that the fingerprint matches one in KEYS. +

+ +

3. Verify the checksum

+
+              {`sha512sum -c apache-burr-${LATEST.version}-incubating-src.tar.gz.sha512`}
+            
+

+ On macOS, use{" "} + shasum -a 512 -c{" "} + instead of sha512sum -c + . +

+ +

+ For more detail, see the{" "} + + official ASF verification guide + + . +

+
+ + {/* License & disclaimer */} +
+

License & disclaimer

+

+ Apache Burr is released under the{" "} + + Apache License, Version 2.0 + + . The full LICENSE and{" "} + NOTICE files are + included in every source release. +

+

+ Apache Burr (Incubating) is an effort undergoing incubation at + The Apache Software Foundation (ASF), sponsored by the Apache + Incubator. Incubation is required of all newly accepted projects + until a further review indicates that the infrastructure, + communications, and decision making process have stabilized in a + manner consistent with other successful ASF projects. While + incubation status is not necessarily a reflection of the + completeness or stability of the code, it does indicate that the + project has yet to be fully endorsed by the ASF. +

+
+
+
+