Skip to content

Comparison Matrix: Fish vs Other Build Systems

Fish is an ergonomic build-orchestration system written in Rust 2024 for modern polyglot monorepos. Here is a balanced, technical comparison with Bazel, Turborepo, and Buck2:

Capability / DimensionFishTurborepoBazelBuck2
Primary LanguageRust 2024Go / RustJava / C++Rust
Language SupportPolyglot (11+ native toolchains)JS / TS focusedPolyglot (Starlark rules)Polyglot (Starlark rules)
Configuration ModelUnified fish.toml / auto-detectturbo.jsonWORKSPACE + BUILD.bazelBUCK files
Setup ComplexityZero-config / LowLowHigh (fine-grained rules)High (fine-grained rules)
Hashing EngineBlake3 (parallel tree hashing)SHA-256SHA-256Blake3 / SHA-256
CAS CompressionZstandard (Zstd L1-L22) + CoWTar.gz / GzipZstd / CustomZstd / Custom
Local MaterializationReflink / CoW (fallback to copy)File copySymlinks / HardlinksReflink / CoW
Content ChunkingFastCDC (16KB - 256KB block dedup)Whole artifact archiveWhole artifact archiveChunked CAS
VFS ResolutionIn-Memory Snapshot TreeFS scanInotify / Watchman daemonWatchman / EdenFS
Semantic InvalidationAST Interface Hash (.rmeta / ABI)File hash onlyHeader-only compileHeader / rmeta compile
AI DiagnosticsNative IPC + Heuristics + Error ExplainerNoneNoneNone
Interactive DashboardBuilt-in Web GUI + TUIVercel Web AppThird-party UIOpen-source console

Implementation evidence

Each Fish-specific capability above maps to real code in this repository:

CapabilityWhere it lives
Blake3 hashing, Zstd compression, CoW/reflink materialization, FastCDC chunkingcrates/fish-cas/src/ (reflink.rs, chunking.rs) and crates/fish-cache/src/
In-memory VFS snapshot treecrates/fish-incremental/src/vfs.rs (VfsSnapshotTree) — latency depends on tree size; see benchmarks
Semantic/ABI invalidationcrates/fish-incremental/src/abi_extractor.rs
AI diagnostics bridgecrates/fish-cli/src/ai_bridge.rs over the JSON-RPC daemon IPC
Web dashboard + TUIcrates/fish-dashboard/ and crates/fish-cli/src/tui.rs

Competitor columns describe those tools as publicly documented; we do not maintain their code.


Detailed Architectural Breakdown

Fish vs Turborepo

  • Language Scope: Turborepo was created primarily for JavaScript/TypeScript monorepos. While it can run external task scripts, Fish natively discovers and coordinates 11+ toolchains (Cargo, Go modules, CMake, Python, Docker, etc.) directly from their native project manifests.
  • Storage Performance: Turborepo uses standard archive tarballs and file copy. Fish uses Reflink / CoW filesystem extents and FastCDC content-defined chunking to minimize redundant disk I/O and network transfer.

Fish vs Bazel

  • Design Philosophy & Trade-offs: Bazel is engineered for massive codebases requiring strict, fine-grained hermetic sandboxing with detailed BUILD.bazel declarations for every target. Fish is designed as a lightweight, zero-config polyglot task orchestrator that discovers packages automatically, prioritizing quick developer onboarding over fine-grained action graph construction.
  • Runtime Architecture: Bazel relies on a JVM daemon and dedicated sandbox wrappers. Fish runs as a single, self-contained native Rust binary with optional sandboxing and minimal resource overhead.

Fish vs Buck2

  • Workflow & Usability: Buck2 is a high-performance build tool designed for large-scale codebases utilizing Starlark rules and external filesystem watchers. Fish focuses on out-of-the-box polyglot workflow orchestration with built-in in-memory VFS, token-based GNU jobserver pool, and zero required build configuration.