@itsharmanjot: Your AI agent can build your BI dashboards now. Not query them. Build them. It’s called Rill. Every dashboard, metric, …
Summary
Rill is an open-source BI tool that lets AI agents build dashboards directly from natural language prompts, using YAML and SQL, with an MCP server for integration with agents like Claude and ChatGPT.
View Cached Full Text
Cached at: 07/09/26, 01:45 PM
Your AI agent can build your BI dashboards now. Not query them. Build them.
It’s called Rill. Every dashboard, metric, and data model defined in code, and Claude Code or Cursor can write the whole thing from a prompt.
No more “hey can someone in data build me a dashboard” and waiting two weeks. Your agent reads the semantic layer, writes the YAML, and ships the metric.
→ One binary install, curl https://rill.sh | sh, dashboard running locally in minutes, no cluster, no server setup
→ Dashboards defined in YAML and SQL, version-controlled in git like actual code, not locked in a drag-and-drop UI
→ Ships an MCP server out of the box, so Claude, ChatGPT, or any agent connects straight to your metrics layer
→ Powered by DuckDB for local dev, or ClickHouse when you need to query billions of rows, sub-second either way
→ Built for the exact moment BI stops being a team you file a ticket with and becomes something your agent just does
The BI tools built in 2018 assumed a human clicks the button. Rill assumed the human writing SQL might be an AI, and built the whole stack in code so that’s actually possible.
Apache 2.0 License. 2,600+ GitHub stars. 100% Opensource.
Source: https://rill.sh/ #!/usr/bin/env sh # Determine the platform using ‘OS’ and ‘ARCH’ initPlatform() { OS=\(uname \-s \| tr '\[:upper:\]' '\[:lower:\]'\) ARCH=(uname -m) if [ “OS" = "darwin" \] && \[ "ARCH” = “arm64” ]; then PLATFORM=“darwin_arm64” elif [ “OS" = "darwin" \] && \[ "ARCH” = “x86_64” ]; then PLATFORM=“darwin_amd64” elif [ “OS" = "linux" \] && \[ "ARCH” = “x86_64” ]; then PLATFORM=“linux_amd64” elif [ “OS" = "linux" \] && \{ \[ "ARCH” = “arm64” ] || [ “ARCH" = "aarch64" \]; \}; then PLATFORM="linux\_arm64" else printf "Platform not supported: os=%s arch=%s\\n" "OS” “ARCH" exit 1 fi \} \# Create a temporary directory and setup deletion on script exit using the 'EXIT' signal initTmpDir\(\) \{ TMP\_DIR=(mktemp -d) trap ‘rm -rf -- “\{TMP\_DIR\}"' EXIT cd "TMP_DIR” } # Ensure that dependency is installed and executable, exit and print help message if not checkDependency() { if ! [ -x “\(command \-v "1”)“ ]; then printf “’%s’ could not be found, this script depends on it, please install and try again.\n” “1" exit 1 fi \} \# Ensure that 'git' is installed and executable, exit and print help message if not checkGitDependency\(\) \{ if \! \[ \-x "(command -v git)” ]; then publishSyftEvent git_missing printf “Git could not be found, Rill depends on it, please install and try again.\n\n” printf “Helpful instructions: https://github.com/git-guides/install-git\n” exit 1 fi } # Ensure that either ‘shasum’ or ‘sha256sum’ is installed and executable, exit and print help message if not resolveShasumDependency() { if [ -x “\(command \-v shasum\)" \]; then sha256\_verify="shasum \-\-algorithm 256 \-\-ignore\-missing \-\-check" elif \[ \-x "(command -v sha256sum)” ]; then sha256_verify=“sha256sum --ignore-missing --check” else printf “neither ‘shasum’ or ‘sha256sum’ could be found, this script depends on one of them, please install one of them and try again.\n” exit 1 fi } # Download the binary and check the integrity using the SHA256 checksum downloadBinary() { CDN=“cdn.rilldata.com” LATEST_URL=“https://\{CDN\}/rill/latest\.txt" if \[ "{VERSION}” = “latest” ]; then VERSION=$(curl --silent --show-error \{LATEST\_URL\}\) fi BINARY\_URL="https://{CDN}/rill/\{VERSION\}/rill\_{PLATFORM}.zip“ CHECKSUM_URL=“https://\{CDN\}/rill/{VERSION}/checksums.txt” printf “Downloading binary: %s\n” “BINARY\_URL" curl \-\-location \-\-progress\-bar "{BINARY_URL}” --output rill_\{PLATFORM\}\.zip printf "\\nDownloading checksum: %s\\n" "CHECKSUM_URL“ curl --location --progress-bar “${CHECKSUM_URL}” --output checksums.txt printf “\nVerifying the SHA256 checksum of the downloaded binary:\n” \{sha256\_verify\} checksums\.txt printf "\\nUnpacking rill\_%s\.zip\\n" "PLATFORM“ unzip -q rill_\{PLATFORM\}\.zip \} \# Print install options printInstallOptions\(\) \{ printf "\\nWhere would you like to install rill? \(Default \[1\]\)\\n\\n" printf "\[1\] /usr/local/bin/rill \[recommended, but requires sudo privileges\]\\n" printf "\[2\] ~/\.rill/rill \[directory will be created & path configured\]\\n" printf "\[3\] \./rill \[download to the current directory\]\\n\\n" \} \# Ask for preferred install option promtInstallChoice\(\) \{ printf "Pick install option: \(1/2/3\)\\n" read \-r ans /dev/null 2\>&1; then printf "There is a conflicting version of Rill installed using Brew\.\\n\\n" printf "To upgrade using Brew, run 'brew upgrade rilldata/tap/rill'\.\\n\\n" printf "To use this script to install Rill, run 'brew remove rilldata/tap/rill' to remove the conflicting version and try again\.\\n" exit 1 elif \[ "INSTALLED_RILL“ != “\{INSTALL\_DIR\}/rill" \]; then printf "There is a conflicting version of Rill installed at '%s'\\n\\n" "INSTALLED_RILL” printf “To use this script to install Rill, remove the conflicting version and try again.\n” exit 1 fi fi } # Install the binary and ask for elevated permissions if needed installBinary() { if [ “INSTALL\_DIR" = "/usr/local/bin" \]; then printf "\\nElevated permissions required to install the Rill binary to: %s/rill\\n" "INSTALL_DIR” sudo install -d “INSTALL\_DIR" sudo install rill "INSTALL_DIR” else install -d “INSTALL\_DIR" install rill "INSTALL_DIR” fi cd - > /dev/null } # Run the installed binary and print the version testInstalledBinary() { RILL_VERSION=\("INSTALL_DIR“/rill version) “INSTALL\_DIR"/rill verify\-install 1\>/dev/null \|\| true printf "\\nInstallation of %s completed\!\\n" "RILL_VERSION” } # Print ‘rill start’ help intrcutions printStartHelp() { boldon=\(tput smso\) boldoff=(tput rmso) if [ “INSTALL\_DIR" = "/usr/local/bin" \]; then printf "\\nTo start a new project in Rill, execute the command:\\n\\n %srill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" elif \[ "INSTALL_DIR” = “HOME/\.rill" \]; then printf "\\nTo start a new project in Rill, open a %snew terminal%s and execute the command:\\n\\n %srill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" "boldon” “boldoff" elif \[ "INSTALL_DIR” = “\(pwd\)" \]; then printf "\\nTo start a new project in Rill, execute the command:\\n\\n %s\./rill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" fi \} \# Publish Syft install telemetry event, can be disabled by setting the 'RILL\_INSTALL\_DISABLE\_TELEMETRY' environment variable publishSyftEvent\(\) \{ SYFT\_URL=https://event\.syftdata\.com/log SYFT\_ID=clp76quhs0006l908bux79l4v if \[ \-z "RILL_INSTALL_DISABLE_TELEMETRY” ]; then curl --silent --show-error --header “Authorization: \{SYFT\_ID\}" \-\-header "Content\-Type: application/json" \-\-data "\{\\"event\_name\\":\\"1\”}“ SYFT\_URL \> /dev/null \|\| true \>&2 fi \} \# Add the Rill binary to the PATH via configuration of the shells we detect on the system addPathConfigEntries\(\) \{ PATH\_CONFIG\_LINE="export PATH=\\HOME/.rill:\PATH \# Added by Rill install" if \[ "INSTALL_DIR“ = “HOME/\.rill" \]; then for f in "HOME/.bashrc” “HOME/\.zshrc"; do if \[ \-f "f” ]; then if ! grep -Fxq “PATH\_CONFIG\_LINE" "f”; then printf “\nWould you like to add ‘rill’ to your PATH by adding an entry in ‘%s’? (Y/n)\n” “f" read \-r ans \> "f” ;; esac fi fi done fi } # Remove PATH configurations, we have to do handle this slightly different based on OS because of platform variations in ‘sed’ behaviour removePathConfigEntries() { for f in “HOME/\.bashrc" "HOME/.zshrc”; do if [ -f “f" \]; then if \[ "OS” = “darwin” ]; then sed -i “” -e ‘/# Added by Rill install/d’ “f" elif \[ "OS” = “linux” ]; then sed -i -e ‘/# Added by Rill install/d’ “f" fi fi done \} \# Install Rill on the system installRill\(\) \{ publishSyftEvent install checkDependency curl checkDependency unzip checkGitDependency resolveShasumDependency initPlatform detectPreviousInstallation if \[ \-z "{INSTALL_DIR}” ]; then printInstallOptions promtInstallChoice checkConflictingInstallation fi initTmpDir downloadBinary installBinary testInstalledBinary addPathConfigEntries printStartHelp publishSyftEvent installed } # Uninstall Rill from the system, this function is aware of both the privileged and unprivileged install methods uninstallRill() { checkDependency sed initPlatform if [ -f “/usr/local/bin/rill” ] then printf “\nElevated permissions required to uninstall the Rill binary from: ‘/usr/local/bin/rill’\n” sudo rm /usr/local/bin/rill fi rm -f “$HOME/.rill/rill” removePathConfigEntries printf “Uninstall of Rill completed\n” } set -e # Parse input flag case 1 in \-\-uninstall\) uninstallRill ;; \-\-nightly\) VERSION=nightly installRill ;; \-\-version\) VERSION={2:-latest} installRill ;; --non-interactive) INSTALL_DIR=\{2:\-"/usr/local/bin"\} VERSION={3:-latest} installRill ;; *) VERSION=latest installRill ;; esac
Similar Articles
We built a self-hostable agentic AI + BI platform — agents, multi-agent swarms, RAG, dashboards, notebooks, all on your own keys
A self-hostable AI and BI platform integrating agents, multi-agent swarms, RAG, dashboards, and notebooks, all using your own API keys.
Now everyone can put data to work
OpenAI introduces a new Data agent in ChatGPT Work that allows users to connect to company data, analyze it with natural language, and build interactive dashboards without writing queries.
@aigclink: Claude launched Dashboards and Motion (beta) today. My take: this is directly penetrating the BI and motion graphics tr…
Claude 推出 Dashboards 与 Motion(beta)测试版:前者可连接 Snowflake/BigQuery/Databricks 等数据源,用自然语言直接生成可自动刷新、可查看底层 SQL 的仪表盘,几乎吞并了 chat2db/text2SQL 赛道;后者通过写代码驱动文字、图表和图形生成动画并可导出 MP4,与 HyperFrames 等 code-as-video 方案高度重合。作者认为这将 BI 与动效设计的入口和初稿交给 Claude,专业工具退居精修环节,通用 AI 工具开发者仅剩数据、工作流和本地部署三重护城河。
Data agent in ChatGPT Work
OpenAI introduces a new Data agent in ChatGPT Work that allows users to turn company data into answers, interactive dashboards, and actions through natural language queries.
@LinusEkenstam: Just like that we have even more powerful tools. I’m off to the beach while my agents work for me
Anthropic announced the beta release of Claude Dashboards and Claude Motion, allowing users to generate live data dashboards and animated explainers via Claude, prompting excitement about AI agents handling work autonomously.