Developer Experience November 4, 2026 • 8 min read

Accelerating Developer Velocity: Announcing run.sh and run.bat Root CLI Helpers for OpenCrawling

Building and orchestrating distributed enterprise AI pipelines should not require memorizing complex, multiline Docker Compose flags or waiting minutes for clean Maven rebuilds. Today, we are excited to introduce cross-platform root developer CLI convenience wrappers—./run.sh (for macOS and Linux) and run.bat (for Windows CMD)—giving developers instant 3-second container rebuilds, containerized Java 25 Maven builds with host cache mapping, seamless Docker stack lifecycles, and complete cross-platform parity! 🚀

OpenCrawling Root Developer CLI Architecture
./run.sh / run.bat
→
Pre-Flight Health Checks (Docker / JDK / Node)
→
BuildKit ~/.m2 Cache Mounts
→
oc-maven-builder Container
→
Decoupled Microservices & Apps Stacks

1. The Modern Microservices Developer Friction

OpenCrawling represents a state-of-the-art, enterprise-grade ingestion and RAG platform. Its decoupled architecture spans an array of specialized microservices—including the crawler engine, ingestion consumer, embedding vectorizer, writer consumer, and secure Model Context Protocol (MCP) server—alongside backing infrastructure such as Apache Kafka, PostgreSQL with pgvector, Redis, Ollama, and OpenTelemetry.

While this architecture provides unmatched enterprise resilience and horizontal scalability, local development iterated under significant friction:

With Issue #217, we solved this by designing unified root CLI helpers that eliminate friction while preserving complete build hermeticity for continuous integration.

2. Zero CI Impact: Two-Tier Build Architecture

A core architectural principle of OpenCrawling is that CI production Dockerfiles (docker/Dockerfile.* and oc-runtime/Dockerfile) remain completely untouched. CI workflows on GitHub Actions must always execute clean, isolated, reproducible builds from scratch.

To accelerate local development without compromising production Dockerfiles, run.sh and run.bat leverage a dual-mode strategy:

  1. Local Cache Dockerfiles (docker/local/Dockerfile.*): Local Dockerfiles include BuildKit cache directives:
    RUN --mount=type=cache,target=/root/.m2,id=opencrawling-m2-cache,sharing=shared \
        mvn clean package -DskipTests
    Redundant dependency downloads (such as mvn dependency:go-offline) are eliminated, and all decoupled services share the same persistent cache volume on the local Docker engine.
  2. Containerized Maven Builder (oc-maven-builder): Mounts the developer's host ~/.m2 repository directly into an official Eclipse Temurin JDK 25 builder container:
    docker compose -f docker-compose-maven-builder.yml run --rm oc-maven-builder
    Developers can compile, package, and execute Maven goals without needing JDK 25 or Maven installed on their host workstations!
⚡

Warm Rebuild Benchmark: Rebuilding an OpenCrawling microservice container with source modifications dropped from 4 minutes 15 seconds down to just ~3 seconds!

3. Cross-Platform Parity: macOS, Linux, and Windows CMD

Whether you develop on macOS, Ubuntu, or Windows Command Prompt, the experience is identical:

4. Complete Developer Command Matrix

run.sh and run.bat group everyday engineering workflows into three intuitive categories:

Category Command (./run.sh or run.bat) Description & Underlying Action
Build & Maven build / mvn:build Compile all modules via containerized oc-maven-builder mounting host ~/.m2 (-DskipTests)
build:offline Blazing-fast offline build via oc-maven-builder (-o -DskipTests)
build:host / build:native Build directly using host Maven and JDK 25 (for IDE integration)
build:clean Full clean build with unit test execution inside oc-maven-builder
mvn <args...> Pass arbitrary Maven goals into oc-maven-builder (e.g. mvn test -pl oc-core)
Docker Stacks decoupled:up / decoupled:local Start standalone decoupled stack using local fast Dockerfiles and BuildKit cache mounts
decoupled:override Start decoupled stack using docker-compose-decoupled.local.yml overlay
apps:up / apps:local Start standalone monolithic apps stack (backend, embedding, UI)
infra:up / infra:down Start or stop backing infrastructure only (PostgreSQL/pgvector, Redis, Ollama, Kafka)
down / stop Gracefully stop and clean up all active local OpenCrawling containers across stacks
Productivity & UI status / ps Inspect running containers, service health, and exposed port bindings
logs [service...] Stream and follow live container logs (e.g. ./run.sh logs oc-crawler)
test:unit / test:it Run unit tests or integration tests with automatic local BuildKit cache overlay
ui:dev / ui:build Launch React Admin UI Vite dev server on :5173 or build production bundle
license:format Format Apache 2.0 license headers across all Java and XML files
clean [--prune] Clean Maven target folders and optionally prune dangling Docker build cache

5. Pre-Flight Diagnostics & Error Handling

To prevent cryptic container crashes, run.sh and run.bat validate prerequisites before dispatching commands:

6. Automated Verification: 7-Step Test Suite & CI Matrix

Developer convenience scripts must be as rigorously tested as production code. We implemented a dedicated test suite under scripts/test-run-scripts.sh:

✅

Complete Quality Guarantee: The 7-step test validates script permissions (chmod +x), Apache 2.0 headers, bash -n syntax, help command parity, NO_COLOR=1 ANSI stripping, pre-flight failures, mock command dispatching across all 31 aliases, and Windows run.bat feature parity.

This test suite is automatically executed as part of the GitHub Actions CI matrix in .github/workflows/integration-tests.yml under the job name Root CLI Runner Scripts Test Suite.

7. Quick Start: Try It Today!

Clone the repository and test the new CLI runners immediately:

# macOS or Linux
git clone https://github.com/opencrawling/opencrawling.git
cd opencrawling

./run.sh help             # Explore available commands
./run.sh build            # Compile via containerized oc-maven-builder
./run.sh decoupled:up     # Launch fast local decoupled microservices stack
./run.sh status           # Inspect container health and port bindings
./run.sh down             # Stop local containers

# Windows Command Prompt
run.bat build
run.bat decoupled:up
run.bat down

Supercharge Your OpenCrawling Workflow

Check out the full command reference on our Wiki, test the CLI helpers in your local environment, or join the discussion on GitHub!