@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
Launch HN: BitBoard (YC P25) – Analytics Workspace for Agents
BitBoard is an analytics workspace that lets users build dashboards and reports using AI tools like Claude, ChatGPT, and Cursor, with traceable queries and team sharing.
Empowering teams to unlock insights faster at OpenAI
OpenAI has developed an internal research assistant that combines dashboards with a conversational GPT-5 interface to help teams analyze millions of support tickets and generate insights in minutes instead of weeks. The tool democratizes data analysis across teams, allowing non-technical users to ask questions in plain language and get actionable reports on product feedback, customer sentiment, and trends.
Introducing local SQL & BI Agent to AgentSwarms sandbox. Upload a CSV and chat with your data (Text-to-SQL + Auto-Charts).
AgentSwarms launches a new SQL & BI Agent workspace that allows users to upload CSVs and ask natural language questions, automatically converting them to SQL queries and generating visualizations.
AI Dashboard + Infrastructure + Rocket.Chat
The author shares their experience building an AI agent infrastructure using Rocket.Chat, CLI agents, and tmux, scaling to 250 clients to help them build websites. They pivoted from selling a service to teaching clients to use agents themselves, emphasizing the importance of context management in such systems.
Building data agents
Discusses the evolution from text-to-SQL to autonomous data agents, comparing custom-built agents using LangGraph with managed platforms like Snowflake Cortex Analyst, Databricks Genie, and PowerBI Copilot.