LocalCloud vs Google Emulators
Google provides individual emulators for Pub/Sub, Firestore, and Spanner. For everything else - BigQuery, Bigtable, Cloud Storage, and 15 more services - there is no official local option.
LocalCloud is a single Docker container that bundles official emulators with custom and third-party ones to give you a complete Google Cloud local development environment.
Service Coverage & Fidelity
| Service | Google Emulator | LocalCloud | Why LocalCloud? |
|---|---|---|---|
| ● | ● | Provides persistence + console UI operations. | |
| ● | ● | Directly bundled; no fidelity loss. | |
| ● (In-Memory only) | ● (Persisted data / Extended features) | More closer to Spanner production, compare to Spanner emulator | |
| ● | ● | ~96% BigQuery SQL coverage, DDL/DML, scripting, REST + gRPC Storage APIs. | |
| ● (In-Memory only) | ● (Persisted data + Extended features) | Extends Google’s Bigtable emulator with PostgreSQL-backed persistence and a console data browser. | |
| ● | ● | Bucket and object CRUD, metadata, multipart uploads via fake-gcs-server. | |
| ● | ● | Key operations, hashes, sets. Pub/Sub, Lua, streams, and MULTI/EXEC not yet supported. | |
| ● | ● | Create, read, update, delete secrets. Rotation and CMEK not emulated. | |
| ● | ● | Task creation, dispatch, and queue management. | |
| ● | ● | Full workflow execution with standard library. | |
| Cloud Scheduler | ● | ● | Job CRUD and cron firing. |
| ● | ● | Log ingestion and query. Metrics, sinks, exclusions, and audit logs not yet emulated. | |
| ● | ● | Custom metrics and descriptor management. Alerting, uptime checks, and dashboards not yet emulated. |
Why BigQuery Matters
There is no official BigQuery emulator. Teams either pay for real queries during development or skip local testing entirely.
LocalCloud’s BigQuery emulator runs on DuckDB and covers ~96% of standard SQL, DDL, DML, scripting, and INFORMATION_SCHEMA. It exposes both REST and gRPC Storage APIs so your existing Python, Go, and Java SDKs work unchanged.
Built-In Web Console
Google’s emulators are terminal-only. LocalCloud includes a full web console at http://localhost:8080:
| Feature | What It Does |
|---|---|
| Dashboard | Health status, uptime, and request counts for all 23 services in one view. |
| Data Browser | Preview and mutate data across BigQuery, Cloud Storage, Spanner, Firestore, Pub/Sub, Memorystore, and Secret Manager. |
| SQL Editor | Run BigQuery and Spanner queries directly in the browser with results in a table grid. |
| Logs | Real-time request logs with filtering and auto-tail — no docker logs needed. |
| Usage Metrics | API call counts per service and estimated GCP cost savings from staying local. |
| Settings | One-click export of environment variables as shell, Terraform, or Docker Compose formats. |
This removes the context switching between terminals, SDK scripts, and cloud consoles during daily development.
When to Use Google Emulators
Choose Google’s individual emulators when:
- You need only Pub/Sub or Firestore in isolation.
- Maximum fidelity for those specific services is critical.
- You prefer managing infrastructure manually.
When to Use LocalCloud
Choose LocalCloud when:
- Your stack uses 3+ GCP services.
- You need BigQuery, Bigtable, or Cloud Storage locally.
- You want a unified web console and single environment export.
- You run integration tests in CI/CD and prefer one service container.
- Your team wants one onboarding command instead of per-service docs.
The Setup Difference
Google emulators require the Cloud SDK, separate binaries, and per-service startup:
# Pub/Sub
gcloud components install pubsub-emulator
gcloud beta emulators pubsub start --host-port=localhost:8085
# Firestore
gcloud beta emulators firestore start --host-port=localhost:8086
# Spanner
gcloud components install spanner-emulator
gcloud emulators spanner start --host-port=localhost:9010
You manage ports, environment variables, and health checks for each process.
LocalCloud is one command:
docker run -d -p 8080:8080 -p 4443:4443 -p 8085-8087:8085-8087 \
-p 9010:9010 -p 9020:9020 -p 9050:9050 -p 9060:9060 \
-p 6379:6379 -m 4g --name localcloud \
jaysen2apache/localcloud
eval "$(curl -s http://localhost:8080/_localcloud/env?format=shell)"
One container exports every emulator host automatically.