turbot/steampipe
Zero-ETL, infinite possibilities. Live query APIs, code & more with SQL. No DB required.
Mixed signals — read the receipts
weakest axiscopyleft license (AGPL-3.0) — review compatibility
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2w ago
- ✓6 active contributors
- ✓AGPL-3.0 licensed
Show all 7 evidence items →Show less
- ✓CI configured
- ✓Tests present
- ⚠Concentrated ownership — top contributor handles 67% of recent commits
- ⚠AGPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/turbot/steampipe)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/turbot/steampipe on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: turbot/steampipe
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/turbot/steampipe shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Mixed signals — read the receipts
- Last commit 2w ago
- 6 active contributors
- AGPL-3.0 licensed
- CI configured
- Tests present
- ⚠ Concentrated ownership — top contributor handles 67% of recent commits
- ⚠ AGPL-3.0 is copyleft — check downstream compatibility
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live turbot/steampipe
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/turbot/steampipe.
What it runs against: a local clone of turbot/steampipe — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in turbot/steampipe | Confirms the artifact applies here, not a fork |
| 2 | License is still AGPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch develop exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 43 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of turbot/steampipe. If you don't
# have one yet, run these first:
#
# git clone https://github.com/turbot/steampipe.git
# cd steampipe
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of turbot/steampipe and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "turbot/steampipe(\\.git)?\\b" \\
&& ok "origin remote is turbot/steampipe" \\
|| miss "origin remote is not turbot/steampipe (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(AGPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"AGPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is AGPL-3.0" \\
|| miss "license drift — was AGPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify develop >/dev/null 2>&1 \\
&& ok "default branch develop exists" \\
|| miss "default branch develop no longer exists"
# 4. Critical files exist
test -f "main.go" \\
&& ok "main.go" \\
|| miss "missing critical file: main.go"
test -f "cmd/root.go" \\
&& ok "cmd/root.go" \\
|| miss "missing critical file: cmd/root.go"
test -f "pkg/connection/interface.go" \\
&& ok "pkg/connection/interface.go" \\
|| miss "missing critical file: pkg/connection/interface.go"
test -f "pkg/cmdconfig/builder.go" \\
&& ok "pkg/cmdconfig/builder.go" \\
|| miss "missing critical file: pkg/cmdconfig/builder.go"
test -f "go.mod" \\
&& ok "go.mod" \\
|| miss "missing critical file: go.mod"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 43 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~13d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/turbot/steampipe"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Steampipe is a zero-ETL query engine that exposes APIs and cloud services as live SQL tables, enabling real-time queries against AWS, Azure, GCP, GitHub, Kubernetes, and 100+ other data sources without requiring a database. Written in Go, it runs as a single binary and uses the Steampipe Plugin SDK to dynamically map remote APIs to queryable PostgreSQL-compatible tables. Monorepo structure: cmd/ contains CLI entry points (root.go, query.go, plugin.go, service.go); internal Postgres database for schema management; plugin system using hashicorp/go-plugin for IPC. Design docs in design/ folder (connection_status_table.md, internal_introspection_tables.md) show iterative architecture decisions. Heavy use of HCL (481KB) for config parsing (hashicorp/hcl/v2 dependency).
👥Who it's for
DevOps engineers, security teams, and cloud operators who need to audit and query cloud infrastructure quickly via SQL; plugin developers extending Steampipe with new data sources; platform teams deploying Steampipe in CI/CD pipelines for compliance scanning and cloud inventory.
🌱Maturity & risk
Actively maintained and production-ready. The repo shows extensive CI/CD pipelines (.github/workflows/ with release, testing, and distro-specific builds), comprehensive plugin ecosystem (100+ plugins on hub.steampipe.io mentioned in README), and Go 1.26.1 support. Recent activity is strong with version 2 in active development (go.mod shows v2 module).
Moderate risk: large Go dependency tree (hashicorp/hcl, grpc, cloud.google.com, pgx for PostgreSQL) creates supply-chain surface area; single language (Go) for core but relies heavily on external plugin SDK (github.com/turbot/steampipe-plugin-sdk/v5) and pipe-fittings shared library. No visible sign of security audit process in public files. Plugin ecosystem quality varies—vetted plugins are turbot-owned (turbot/aws, turbot/azure) but community plugins have unknown maintenance status.
Active areas of work
Version 2 release cycle active (go.mod shows /v2 module path, .acceptance.goreleaser.yml suggests release tooling refinement). Acceptance testing framework being enhanced (11-test-acceptance.yaml, acceptance tests for distros in 12-test-post-release-linux-distros.yaml). AI-assisted PR/bug workflows documented in .ai/ directory suggest adoption of Claude-based development tooling.
🚀Get running
git clone https://github.com/turbot/steampipe.git
cd steampipe
make install # Makefile present; builds Go binary
./steampipe query # Interactive query shell
steampipe plugin install hackernews # Install example plugin
steampipe query 'select * from hackernews_new limit 10'
Daily commands:
make install # Builds steampipe binary
steampipe service start # Starts local service (cmd/service.go)
steampipe query # Opens interactive REPL
🗺️Map of the codebase
main.go— Entry point for the Steampipe CLI application; every contributor must understand how the app initializes and starts.cmd/root.go— Root command definition and setup; contains the primary CLI command tree and global flags all subcommands inherit.pkg/connection/interface.go— Core abstraction for plugin connections; defines the interface that all database plugins must implement.pkg/cmdconfig/builder.go— Configuration builder for command execution; orchestrates loading workspace, plugin, and environment configurations.go.mod— Module definition with Go 1.26.1 requirement and critical plugin SDK/pipe-fittings dependencies; defines dependency versions for the entire project.pkg/constants/app.go— Application-wide constants and default values; provides single source of truth for app naming, versioning, and configuration keys.cmd/query.go— Query command implementation; the primary user-facing command for executing SQL queries against connected data sources.
🛠️How to make changes
Add a New CLI Command
- Create a new command file in cmd/ with the command handler function (
cmd/your_command.go) - Define command flags in pkg/cmdconfig/cmd_flags.go using flag names from pkg/constants/flags.go (
pkg/cmdconfig/cmd_flags.go) - Register the command in the root command's AddCommand() call (
cmd/root.go) - Add pre-command setup hooks in pkg/cmdconfig/cmd_hooks.go if initialization is needed (
pkg/cmdconfig/cmd_hooks.go) - Write unit tests following the pattern in cmd/query_test.go or cmd/root_test.go (
cmd/your_command_test.go)
Add a New Configuration Option
- Add the constant key name to pkg/constants/config_keys.go (
pkg/constants/config_keys.go) - Add environment variable name to pkg/constants/env.go if it should be env-configurable (
pkg/constants/env.go) - Add default value to pkg/constants/default_options.go (
pkg/constants/default_options.go) - Register viper binding in pkg/cmdconfig/viper.go to load from config files or env (
pkg/cmdconfig/viper.go) - Add validation logic in pkg/cmdconfig/validate.go if the option needs validation (
pkg/cmdconfig/validate.go)
Add Support for a New Plugin Type or Connection Feature
- Review and potentially extend the Connection interface in pkg/connection/interface.go (
pkg/connection/interface.go) - Add connection loading/initialization logic in pkg/connection/refresh_connections.go (
pkg/connection/refresh_connections.go) - Update the connection state table updater to track the new connection state (
pkg/connection/connection_state_table_updater.go) - Add config keys for the new plugin type in pkg/constants/config_keys.go (
pkg/constants/config_keys.go) - Write tests following the pattern in pkg/connection/refresh_connections_state_test.go (
pkg/connection/refresh_connections_state_test.go)
🔧Why these technologies
- Go 1.26.1 — Compiled language for fast CLI execution and efficient plugin communication via gRPC/plugin protocol; cross-platform builds for Linux, macOS, Windows
- Cobra CLI framework (via cmd/root.go pattern) — Standard Go CLI framework for command parsing, subcommand routing, and help generation
- Viper (config management in pkg/cmdconfig/viper.go) — Handles config file parsing (HCL, YAML, JSON), environment variable binding, and defaults merging
- HashiCorp plugin protocol (pkg/connection/interface.go) — Enables secure, process-isolated plugin execution with version negotiation and state management
- File system watcher (pkg/connection/connection_watcher.go) — Detects configuration changes in workspace files and auto-reloads connections without restart
⚖️Trade-offs already made
-
Process-isolated plugins (separate plugin processes) vs. embedded plugins
- Why: Isolation prevents plugin crashes from taking down Steampipe; enables independent plugin updates and version management
- Consequence: Adds inter-process communication overhead (~10–50ms per plugin call); more complex error handling and lifecycle management
-
Stateless query execution with lazy connection initialization
- Why: Allows horizontal scaling and reduces memory footprint; plugins only loaded when queried
- Consequence: First query to a plugin incurs connection overhead; requires connection pooling per plugin for performance
-
Workspace-based configuration over global ~/.steampipe config only
- Why: Enables project-scoped connection definitions and modular workspace setups; supports portable mods
- Consequence: Requires users to understand workspace directory structure; potential for config conflicts across nested workspaces
🪤Traps & gotchas
Plugin discovery: Steampipe searches for plugins in ~/.steampipe/plugins/; plugins must be installed via 'steampipe plugin install' first—raw binary placement won't work. Embedded Postgres: Local mode uses embedded PostgreSQL (see design/embedded_postgres_build_instructions.md); requires proper initialization on first run. Config path: Uses Viper; respects XDG_CONFIG_HOME and ~/.steampipe/ directory structure. Version mismatch: Plugin SDK version (v5.14.0) must match plugin build; mismatches cause IPC failures. HCL parsing: All config (.spc files) parsed as HCL; JSON not supported for top-level config.
🏗️Architecture
💡Concepts to learn
- Zero-ETL / Live Query Paradigm — Steampipe's core value prop—queries hit live APIs instead of syncing data to a data warehouse; understanding latency/caching tradeoffs is critical when architecting features
- Plugin IPC via gRPC and HashiCorp go-plugin — Steampipe isolates plugin code in separate processes communicating via gRPC; understanding this model is essential when debugging plugin failures or adding new plugin capabilities
- HCL (HashiCorp Configuration Language) — All Steampipe configs (.spc, .sp files) use HCL syntax; contributors need to understand HCL semantics, not just JSON, when implementing config parsing features
- PostgreSQL Foreign Data Wrapper (FDW) Pattern — Steampipe maps API tables to PostgreSQL tables conceptually similar to FDW; understanding this mental model helps when designing new table schemas or optimizing query pushdown
- Connection Pooling and Rate Limiting in API Clients — Steampipe manages concurrent API calls from multiple plugins; understanding token bucket, backpressure, and pgx connection pooling is critical when debugging resource exhaustion bugs
- Cobra CLI Framework and Viper Config Management — Steampipe CLI (cmd/*.go files) uses Cobra for command routing and Viper for config loading; understanding these libraries is essential when adding new CLI commands or config flags
- Declarative Config vs. Imperative Querying — Steampipe uses HCL declarative configs (.spc files) for connections/plugins but SQL imperative queries for data; understanding this split is key when designing features that bridge both layers
🔗Related repos
turbot/pipe-fittings— Shared library for Steampipe and Pipes (go.mod shows github.com/turbot/pipe-fittings/v2 as core dependency); handles configuration parsing and mod dependenciesturbot/steampipe-plugin-sdk— SDK for building Steampipe plugins (v5.14.0 in go.mod); all 100+ Steampipe plugins depend on this; essential for understanding plugin architectureturbot/steampipe-plugin-aws— Official AWS plugin reference implementation; largest plugin in ecosystem; shows best practices for plugin development and testinghashicorp/go-plugin— Underlying plugin system Steampipe uses for plugin IPC via gRPC; critical for understanding how plugins communicate with corejackc/pgx— PostgreSQL driver used for query execution; understanding pgx connection pooling essential for debugging query timeouts and connection issues
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for cmd/plugin_manager.go
The plugin_manager.go file exists but cmd/query_test.go and cmd/root_test.go show the testing pattern used in this repo. Plugin manager is critical for Steampipe's core functionality (managing plugin lifecycle), yet there's no corresponding plugin_manager_test.go. This would improve reliability of plugin installation, validation, and version management - core operations for a Zero-ETL SQL engine.
- [ ] Create cmd/plugin_manager_test.go following the pattern in cmd/query_test.go and cmd/root_test.go
- [ ] Add test cases for plugin installation, validation, and version resolution flows
- [ ] Add integration tests with mock plugin repositories to verify dependency resolution
- [ ] Run tests locally and add to CI pipeline via .github/workflows/10-test-lint.yaml
Add missing unit tests for pkg/cmdconfig validation logic
pkg/cmdconfig/ contains critical configuration building and validation (builder.go, validate.go, cmd_hooks.go with corresponding _test.go), but app_specific.go, env_var_type.go, and diagnostics.go lack test coverage. These modules handle environment variables and app-specific config which are essential for Steampipe's workspace initialization. Current test coverage gaps could hide configuration parsing bugs.
- [ ] Create pkg/cmdconfig/app_specific_test.go with tests for app-specific configuration loading
- [ ] Create pkg/cmdconfig/env_var_type_test.go testing environment variable type coercion and validation
- [ ] Create pkg/cmdconfig/diagnostics_test.go for diagnostic output formatting
- [ ] Ensure tests verify behavior under edge cases (missing env vars, invalid types, connection failures)
Implement integration test workflow for design/connection_status_table.md feature
The design document design/connection_status_table.md exists but there's no corresponding acceptance test in .github/workflows/11-test-acceptance.yaml. The connection status table is a user-facing introspection feature that needs E2E validation. Currently only design doc exists without test automation, creating risk of regressions when plugins update or connections change.
- [ ] Review design/connection_status_table.md to understand expected behavior and schema
- [ ] Create acceptance test in pkg/ (following the pattern of existing cmd tests) that validates querying steampipe_connection_status table
- [ ] Add test scenarios for: active connections, failed connections, connection timeouts, plugin version mismatches
- [ ] Integrate new acceptance tests into .github/workflows/11-test-acceptance.yaml pipeline
🌿Good first issues
- Add test coverage for cmd/plugin.go—currently cmd/root_test.go and cmd/query_test.go exist but plugin_test.go is missing; write tests for plugin install/uninstall/list flows
- Document the connection status table schema in docs/ (design/connection_status_table.md exists but no user-facing doc); create a guide explaining how to query connection_status internal table
- Add Makefile targets for common dev workflows (setup-dev, test-unit, test-acceptance, lint-fix)—currently only basic Makefile shown; many projects in this era have rich Makefile targets
⭐Top contributors
Click to expand
Top contributors
- @e-gineer — 67 commits
- @pskrbasu — 28 commits
- @dependabot[bot] — 2 commits
- @kaidaguerre — 1 commits
- @graza-io — 1 commits
📝Recent commits
Click to expand
Recent commits
fd9bc28— Fix release workflow homebrew PR title check (#4983) (kaidaguerre)31a9d9a— Update Go version and fix Dependabot CVE alerts by bumping deps and removing pgconn v1. closes #4963 (#4964) (graza-io)65a921a— Harden GitHub Actions: pin actions to SHAs and set explicit permissions (#4965) (cbruno10)d1d8fb7— Merge branch 'v2.4.x' into develop (pskrbasu)bb83bae— v2.4.0 (pskrbasu)659605d— Upgrade Go to 1.26, FDW to 2.2.0, SDK to v5.14.0, and golangci-lint to v2 (pskrbasu)236c581— Merge pull request #4938 from turbot/v2.3.x (pskrbasu)b713a4c— v2.3.6 (pskrbasu)65e6ea5— Update FDW version to 2.1.5 and SDK to v5.13.2 (#4939) (pskrbasu)29cb60a— Fix date and timestamptz display. closes #4450 (pskrbasu)
🔒Security observations
The Steampipe codebase shows a moderately secure architecture with some concerns. Primary risks include: (1) unusual Go version specification
- High · Outdated Go Version —
go.mod. The project specifies 'go 1.26.1' in go.mod, which appears to be a future/unreleased version. This is unusual and may indicate a configuration error or testing with unstable Go versions. Production code should use stable, released Go versions. Fix: Update to the latest stable Go version (currently 1.23.x or 1.24.x as of 2025). Verify the Go version compatibility with all dependencies. - High · Potential Hardcoded Credentials in AI Templates —
.ai/templates/, .claude/commands/. The repository contains .ai/ and .claude/ directories with automation templates and AI-driven workflows. These directories may contain or generate hardcoded credentials, API keys, or sensitive configuration during automated processes. The presence of 'fix-vulnerabilities.md' and PR templates suggests automated code modification capabilities. Fix: Audit all template files for credential patterns. Implement secret scanning in CI/CD pipelines. Ensure automated tools never commit credentials. Use environment variables and secret management systems instead of hardcoding. - Medium · Plugin System Trust Boundary —
cmd/plugin_manager.go, pkg/connection/. The codebase uses hashicorp/go-plugin (v1.7.0) for plugin management. The presence of plugin_manager.go and plugin-related commands suggests dynamic plugin loading. This creates a trust boundary issue if plugins are sourced from untrusted sources. Fix: Implement plugin signature verification. Use allowlists for approved plugins. Document plugin sandboxing mechanisms. Validate all plugin communications through gRPC securely. - Medium · Database Connection Security —
pkg/connection/, pkg/cmdconfig/. The project manages PostgreSQL connections (jackc/pgx/v5) via connection configs and lifecycle managers. Connection configuration files in workspace profiles could potentially expose credentials if not properly secured. Fix: Ensure connection credentials are never logged or exposed in debug output. Implement encryption for stored connection configurations. Use credential providers (environment variables, credential managers) instead of plaintext storage. - Medium · Service Mode Security Exposure —
cmd/service.go, design/steampipe_service_db_connections.md. The presence of cmd/service.go indicates service/daemon mode functionality. Services typically listen on network ports and could expose SQL query interfaces. No visible security context documentation for service deployment. Fix: Enforce authentication for service endpoints. Implement TLS/SSL for all network communications. Use restrictive firewall rules. Document service security requirements. Implement rate limiting and request validation. - Medium · Dependency on Replaced Package —
go.mod. The go.mod file contains a replace directive for go-prompt package pointing to a forked version (github.com/turbot/go-prompt). While this allows customization, it may introduce maintenance risks and security gaps if the fork diverges from upstream security updates. Fix: Monitor the upstream go-prompt repository for security updates. Keep the fork synchronized with security patches. Consider contributing changes back to the original project. Document the reason for the fork. - Low · Command-Line Argument Parsing —
cmd/, pkg/cmdconfig/. The project uses cobra CLI framework (v1.10.1) and spf13/viper (v1.20.1) for configuration. Complex CLI argument handling can be vulnerable to injection if user input isn't properly validated. Fix: Validate all command-line inputs and configuration values. Implement input sanitization for query parameters. Use type-safe flag definitions. Review cmd_hooks.go for validation logic. - Low · Git Integration Security —
go.mod, .gitmodules. The dependency on go-git/v5 (v5.16.5) enables git operations. If the application clones or pulls repositories, it could be vulnerable to git-related attacks or credential exposure if git credentials are handled insecurely. Fix: Validate all git URLs before cloning. Use SSH keys instead of HTTPS credentials for git operations. Implement git operation timeouts. Sanitize git output in logs.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.