shuttle-hq/shuttle
Build & ship backends without writing any infrastructure files.
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
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 4mo ago
- ✓7 active contributors
- ✓Apache-2.0 licensed
Show all 7 evidence items →Show less
- ✓Tests present
- ⚠Slowing — last commit 4mo ago
- ⚠Concentrated ownership — top contributor handles 78% of recent commits
- ⚠No CI workflows detected
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 "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/shuttle-hq/shuttle)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/shuttle-hq/shuttle on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: shuttle-hq/shuttle
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/shuttle-hq/shuttle 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
GO — Healthy across all four use cases
- Last commit 4mo ago
- 7 active contributors
- Apache-2.0 licensed
- Tests present
- ⚠ Slowing — last commit 4mo ago
- ⚠ Concentrated ownership — top contributor handles 78% of recent commits
- ⚠ No CI workflows detected
<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 shuttle-hq/shuttle
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/shuttle-hq/shuttle.
What it runs against: a local clone of shuttle-hq/shuttle — 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 shuttle-hq/shuttle | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | Last commit ≤ 148 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of shuttle-hq/shuttle. If you don't
# have one yet, run these first:
#
# git clone https://github.com/shuttle-hq/shuttle.git
# cd shuttle
#
# 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 shuttle-hq/shuttle and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "shuttle-hq/shuttle(\\.git)?\\b" \\
&& ok "origin remote is shuttle-hq/shuttle" \\
|| miss "origin remote is not shuttle-hq/shuttle (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 148 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~118d)"
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/shuttle-hq/shuttle"
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
Shuttle is a Rust-native backend framework that eliminates infrastructure boilerplate by provisioning cloud resources (databases, caches, queues) through single lines of code in your application, then deploying the entire project without writing YAML or Dockerfile manually. It transforms multi-step deployment workflows into a cargo shuttle deploy command, targeting developers who want production infrastructure as seamlessly as adding a crate dependency. Monorepo with 9 member crates: cargo-shuttle/ is the CLI binary that users invoke, runtime/ provides the async runtime and macros, codegen/ generates boilerplate via proc-macros, builder/ renders Dockerfiles from Jinja2 templates, service/ handles deployment orchestration, api-client/ wraps the shuttle.rs HTTP API, and common/ and admin/ provide shared utilities. The workspace uses Cargo.lock for reproducible builds and Makefile.toml for task automation.
👥Who it's for
Rust backend developers who want to ship web services and APIs without learning infrastructure-as-code tools like Terraform or Kubernetes; teams prioritizing development velocity over infrastructure control; developers coming from platforms like Heroku or Vercel who expect 'just deploy it' experiences in Rust.
🌱Maturity & risk
Production-ready and actively developed (v0.57.0). The project has CircleCI CI/CD (.circleci/config.yml), structured issue templates, security audit tooling (.cargo/audit.toml), comprehensive CONTRIBUTING.md and DEVELOPING.md, and is maintained as a proper workspace with 9 coordinated crates. Signals active use and stability, though as a 2-3 year old project it may still ship breaking changes across minor versions.
Moderate risk: the monorepo spans 10+ interdependent crates (runtime, builder, codegen, service) creating tight coupling; dependency on external builder infrastructure (Dockerfiles in builder/templates/) means deployment failures can be environmental; the cargo-shuttle CLI is the sole entry point (single point of failure for usability). However, the hosted platform model means risk is partially shifted to shuttle.rs operations rather than user code.
Active areas of work
Project is under active development with v0.57.0 as current release. The file structure shows recent investment in builder infrastructure (Jinja2 templating for multi-language Dockerfile generation), API client middleware improvements, and admin tooling expansion. CircleCI pipeline is configured for continuous integration. No specific PR or issue data visible, but the presence of bounty integration (Algora) suggests ongoing feature velocity.
🚀Get running
git clone https://github.com/shuttle-hq/shuttle.git
cd shuttle
cargo build --workspace
cargo test --workspace
# For CLI use:
cargo install --path cargo-shuttle
cargo shuttle new my-project
cd my-project
cargo shuttle run
Daily commands:
Development: cargo build && cargo run -p cargo-shuttle -- shuttle new my-app starts the local workflow. For testing the full stack: cargo test --workspace runs the integration suite. The actual deployment requires connectivity to shuttle.rs API (not local). Read DEVELOPING.md for environment setup details.
🗺️Map of the codebase
- cargo-shuttle/src/bin/cargo-shuttle.rs: Entry point of the CLI tool that users invoke; orchestrates subcommands like
new,run,deploy - runtime/src/lib.rs: Core async runtime and macro definitions that allow developers to declare resources with
#[shuttle::main] - builder/templates/rust.Dockerfile.jinja2: Template for generating Dockerfiles during build; critical for reproducible multi-stage builds
- codegen/src/: Proc-macro expansion for the
#[shuttle::*]attribute macros that developers write - api-client/src/lib.rs: HTTP client for communicating with shuttle.rs backend; handles authentication and deployment API calls
- Cargo.toml: Workspace manifest; defines all member crates, shared dependencies, and version coordination
- .circleci/config.yml: CI/CD pipeline definition; shows how tests, builds, and releases are automated
- DEVELOPING.md: Developer guide with environment setup, testing procedures, and contribution workflow
🛠️How to make changes
For CLI changes: edit cargo-shuttle/src/args.rs (command parsing) and cargo-shuttle/src/bin/cargo-shuttle.rs (entrypoint). For resource provisioning: modify runtime/src/lib.rs (async runtime) or codegen/src/ (macro expansion). For deployment flow: edit service/src/ or api-client/src/. For Dockerfile generation: update builder/templates/rust.Dockerfile.jinja2 and builder/src/lib.rs. For docs: start in DEVELOPING.md and README.md.
🪤Traps & gotchas
Authentication: cargo-shuttle commands require valid API credentials (typically stored in ~/.shuttle after login); local cargo shuttle run may fail silently if API tokens are expired. Docker requirement: builder/ uses Bollard to invoke Docker daemon; must have Docker running locally for builds. Jinja2 template syntax: modifying builder/templates/*.Dockerfile.jinja2 requires understanding Jinja2 filter chains (e.g., {{ var | split | join }}), not standard Rust. Workspace resolution: changing workspace member versions in individual Cargo.toml files will conflict with [workspace.dependencies] pinning; use the workspace version for consistency. API evolution: the shuttle.rs remote API is not versioned in this repo; breaking changes to the HTTP contract will silently fail older CLI clients.
💡Concepts to learn
- Proc-macro code generation — Shuttle's
#[shuttle::main]and resource declaration macros are compile-time metaprogramming; understanding howcodegen/transforms attributes into boilerplate is essential for extending the framework - Workspace dependency management — The monorepo uses
[workspace.dependencies]and[workspace.package]for version pinning across 10 crates; understanding this pattern prevents accidental version skew and build failures - Docker multi-stage builds — Shuttle's Jinja2 templates generate optimized Dockerfiles with separate compile and runtime stages; understanding this pattern explains why builder/templates/ exists and how image size is minimized
- Async trait patterns — The codebase heavily uses
async-traitfor trait methods with async fn; this is a key pattern in Rust async code and essential for understanding runtime/ and service/ abstractions - Tower/Hyper middleware composition — Axum's middleware model (via
towerabstraction) is used throughout; api-client/src/middleware.rs shows request/response interception patterns critical for auth and retry logic - Cargo metadata introspection — The builder uses
cargo_metadatacrate to parse Cargo.toml and extract workspace/package metadata at build time; this is how Shuttle discovers project structure without parsing TOML manually - Jinja2 template rendering — The Askama crate compiles Jinja2 templates to Rust at compile-time for safe Dockerfile generation; understanding template syntax and filter chains is necessary for modifying builder output
🔗Related repos
tokio-rs/tokio— Underlying async runtime used throughout shuttle; understanding Tokio's task spawning and executor model is essential for debugging runtime behaviorlaunchbadge/sqlx— Likely database access pattern for Shuttle services; compile-time query checking is commonly provisioned alongside shuttle resourcesseanmonstar/warp— Alternative HTTP framework in Rust ecosystem; Shuttle chose Axum but understanding warp's design (filters, composability) contextualizes architectural choicesvercel/vercel— Platform inspiration: Vercel pioneered the 'deploy from git without config' model that Shuttle replicates for Rust backendsflyio/fly— Competitive backend-as-a-service for Rust; understanding Fly's approach (VMs vs containers, pricing model) clarifies Shuttle's positioning
🪄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 integration tests for cargo-shuttle provisioner_server module
The provisioner_server.rs file exists in cargo-shuttle/src/ but there are no corresponding integration tests in cargo-shuttle/tests/integration/. This module likely handles critical provisioner communication. Adding tests would improve reliability of the local development server and catch regressions early.
- [ ] Create cargo-shuttle/tests/integration/provisioner_server.rs with tests for server initialization and shutdown
- [ ] Add tests for provisioner request/response handling by examining provisioner_server.rs implementation
- [ ] Update cargo-shuttle/tests/integration/main.rs to include the new provisioner_server test module
- [ ] Run
cargo testto ensure all tests pass in the workspace
Add missing cargo-shuttle CLI command documentation and examples
The cargo-shuttle crate has args.rs defining CLI arguments and builder.rs/init.rs/config.rs handling major commands, but cargo-shuttle/README.md is minimal. New contributors need clear examples of common commands (init, run, deploy, link resources). This fills a documentation gap that affects onboarding.
- [ ] Examine cargo-shuttle/src/args.rs to identify all primary commands and their flags
- [ ] Review cargo-shuttle/src/builder.rs, init.rs, and config.rs to understand command behavior
- [ ] Expand cargo-shuttle/README.md with sections: 'Getting Started', 'Common Commands', and 'Configuration'
- [ ] Include examples for
cargo shuttle init,cargo shuttle run, andcargo shuttle linkwith output examples
Add CI workflow for testing builder Dockerfile templates across platforms
The builder/templates/ directory contains critical Dockerfile templates (cargo-chef.Dockerfile, runtime-base.Dockerfile, rust.Dockerfile.jinja2) but .circleci/config.yml doesn't show dedicated build/validation steps for these templates. A new GitHub Action or CircleCI job should validate Dockerfile syntax and test template rendering with actual parameters.
- [ ] Review builder/templates/ and builder/tests/rust.Dockerfile to understand current testing approach
- [ ] Create a new CircleCI job in .circleci/config.yml that validates Dockerfile syntax using
docker build --dry-runor similar - [ ] Add template rendering tests in builder/tests/ that verify Dockerfile.jinja2 produces valid output with sample context
- [ ] Ensure the new job runs on each push and blocks merges if templates are invalid
🌿Good first issues
- Add integration tests for
builder/src/lib.rsDockerfile generation logic inbuilder/tests/(currently onlyrust.Dockerfilesnapshot exists); test edge cases like non-standard Rust editions, custom build profiles, and workspace member selection.: The builder is a critical path component with minimal test coverage relative to its complexity; this improves release confidence. - Expand
api-client/src/middleware.rsto add retry logic with exponential backoff for transient HTTP errors (e.g., 503); referencereqwest_middlewarepatterns.: Deployment can fail due to temporary API unavailability; this improves UX without requiring user-side retry wrappers. - Write helper documentation in DEVELOPING.md with a 'Adding a new resource type' walkthrough showing how to: define the resource in
runtime/, generate macros incodegen/, and add an example inexamples/; include a real example like adding Kafka support.: Resource provisioning is Shuttle's core value but the extension mechanism is underdocumented; this unblocks community contributions.
⭐Top contributors
Click to expand
Top contributors
- @jonaro00 — 78 commits
- @the-wondersmith — 9 commits
- @oddgrd — 4 commits
- @fussybeaver — 4 commits
- @dcodesdev — 3 commits
📝Recent commits
Click to expand
Recent commits
a95d413— compute tier ord (#2135) (jonaro00)a594474— feat(admin): unsuspend user command, cargo update, MSRV 1.89 (#2131) (jonaro00)0e66b3e— feat: suspend user admin command (#2129) (oddgrd)90fdf1b— fix(cargo-shuttle): simplify resolving local project name, fix metadata error when --id provided (#2125) (jonaro00)5681baf— feat(common): deployment description field (#2127) (jonaro00)1c7ed0a— feat(common): github integration types (#2126) (jonaro00)0781c0d— feat(cargo-shuttle): improve library API, expose args module (#2111) (jonaro00)8b84c4a— chore(cargo-shuttle): v0.57.3 (#2124) (jonaro00)78945dd— feat(mcp): add project create tool (#2123) (dcodesdev)c97d553— fix(mcp): lock rmcp-macros dep (#2121) (jonaro00)
🔒Security observations
The Shuttle codebase demonstrates reasonable security practices with use of Rust ecosystem security-focused dependencies (rustls-tls, default-features controls). Key strengths include cargo-audit integration and strategic use of secure TLS implementations. Primary concerns are: (1) incomplete visibility into Docker build security, (2) limited transparency into api-client TLS configuration, (3) procedural macro and code generation safety, and (4) test resource isolation. The architecture shows good security awareness but would benefit from explicit security documentation and deeper code review of Docker configurations, macro implementations, and client-server communication patterns. No critical vulnerabilities detected in the visible dependency tree.
- Medium · Dependency on Git2 with Default Features —
Cargo.toml - workspace.dependencies. The codebase includes 'git2' dependency without explicit feature restriction (version 0.20.0). While default-features=false is not explicitly set, git2 can pull in OpenSSL by default which may have security implications. The codebase does use 'gix' with default-features=false which is the recommended approach. Fix: Consider adding 'default-features = false' to git2 dependency and explicitly specify only required features. Alternatively, migrate fully to 'gix' which is used with better practices. - Medium · Unversioned Workspace Members —
Cargo.toml - workspace configuration. While workspace.package specifies version 0.57.0, the Cargo.toml shows excluded paths ('examples', 'resources', 'services') and multiple workspace members that may not all be pinned consistently. This could lead to version mismatches during builds. Fix: Ensure all workspace members explicitly reference the workspace version. Add version checks in CI/CD pipeline to detect version inconsistencies. - Medium · HTTP Communication with TLS but Limited Configuration —
Cargo.toml - reqwest dependency and api-client/src/. The codebase uses 'reqwest' with 'rustls-tls' feature which is good, but lacks visible TLS configuration details. Certificate pinning, custom CA handling, or TLS version constraints are not evident from the dependency declarations. Fix: Review api-client/src/ to ensure proper TLS configuration. Consider implementing certificate pinning for critical API communications and explicit TLS version requirements (1.2+). - Low · Audit Configuration Present but Completeness Unknown —
.cargo/audit.toml. .cargo/audit.toml exists but contents are not visible. Cargo audit is properly configured which is good practice, but the specific audit rules and configurations are not reviewed. Fix: Ensure audit.toml includes checks for: RUSTSEC advisories, deny advisory database, and maintains an updated deny list. Integrate cargo-audit into CI/CD pipeline. - Low · Multiple Dockerfile Templates Without Visible Security Review —
builder/templates/. The builder module includes Dockerfile templates (cargo-chef.Dockerfile, runtime-base.Dockerfile, rust.Dockerfile.jinja2) but these are not fully visible. Docker security best practices like non-root users, minimal base images, and layer security require review. Fix: Review all Dockerfile templates to ensure: base images are pinned to specific versions, non-root users are configured, minimal base images are used, and multi-stage builds optimize for security. - Low · Macro and Code Generation Security —
codegen/, shuttle-mcp/. The 'codegen' and 'shuttle-mcp' modules suggest procedural macro usage and code generation. Without visibility into implementation, there's potential risk of code injection through macro expansion. Fix: Review all procedural macros for: input validation, safe parsing, and protection against malicious input. Ensure generated code follows security best practices. - Low · Test Resources and Integration Tests Require Review —
cargo-shuttle/tests/. Integration tests directory (cargo-shuttle/tests/) and test resources may contain hardcoded credentials, test APIs, or other sensitive data that could be exposed. Fix: Ensure test resources do not contain real credentials, API keys, or sensitive data. Use environment variables or test fixtures instead. Exclude test-only code from production builds.
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.