Installation
LeapView ships as a public multi-architecture container image. Pulling that image is the primary onboarding path; no source checkout, registry login, or installer is required. One running container with one persistent state volume is one LeapView instance.
Current controlled-testing release
The supported candidate is
v0.2.0-rc.1,
built from revision
dfb3086d59284c6597180e99a7d07f41e36a7f7e.
It is a release candidate for controlled testing, not GA. Its immutable image
is:
ghcr.io/flidai/leapview@sha256:8b32fc291c86005c69c2ca1fa673dcaa4cb84d39cfc951e065a2775b122f81d9
Download the version-matched operations bundle and checksum for the machine
that will run leapviewctl:
| Operating system | Architecture | Archive | Checksum |
|---|---|---|---|
| Linux | amd64 | leapview-compose-v0.2.0-rc.1-linux-amd64.tar.gz | SHA-256 |
| Linux | arm64 | leapview-compose-v0.2.0-rc.1-linux-arm64.tar.gz | SHA-256 |
| macOS | amd64 | leapview-compose-v0.2.0-rc.1-darwin-amd64.tar.gz | SHA-256 |
| macOS | arm64 | leapview-compose-v0.2.0-rc.1-darwin-arm64.tar.gz | SHA-256 |
Before you begin
Install Docker Engine and Docker Compose. A public instance also needs a DNS name, HTTPS, durable secret storage, PostgreSQL, and provider-native recovery storage.
Choose an installation
The supported installation is the PostgreSQL-backed Compose deployment below. It uses the same native control, delivery, and recovery architecture in local, staging, and production environments; there is no embedded control-plane mode.
Run a durable production instance
The released Compose package is the recommended operations layer around the same public image. It is not a separate LeapView distribution. It supplies hardened container settings, generated production secrets, and optional Caddy HTTPS. Production PostgreSQL/DuckLake backup and restore remain provider-native operations covered by the PostgreSQL operations guide and Backup and restore guide; Compose does not provide image-and-state upgrade or rollback.
- Select, download, verify, and extract the current platform archive:
VERSION='v0.2.0-rc.1'
case "$(uname -s)" in
Linux) OS=linux ;;
Darwin) OS=darwin ;;
*) echo "unsupported OS: $(uname -s)" >&2; exit 1 ;;
esac
case "$(uname -m)" in
x86_64|amd64) ARCH=amd64 ;;
arm64|aarch64) ARCH=arm64 ;;
*) echo "unsupported architecture: $(uname -m)" >&2; exit 1 ;;
esac
ARCHIVE="leapview-compose-${VERSION}-${OS}-${ARCH}.tar.gz"
BASE="https://github.com/flidai/leapview/releases/download/${VERSION}"
curl --fail --location --remote-name "$BASE/$ARCHIVE"
curl --fail --location --remote-name "$BASE/$ARCHIVE.sha256"
if command -v sha256sum >/dev/null 2>&1; then
sha256sum --check "$ARCHIVE.sha256"
else
shasum -a 256 --check "$ARCHIVE.sha256"
fi
tar -xzf "$ARCHIVE"
cd "${ARCHIVE%.tar.gz}"
if command -v sha256sum >/dev/null 2>&1; then
sha256sum --check SHA256SUMS
else
shasum -a 256 --check SHA256SUMS
fi
-
Confirm every checksum reports
OK. The archive contains an immutable application image reference, the base Compose stack, an optional Caddy HTTPS overlay, and the native Goleapviewctloperations binary. -
Copy the deployment and application templates. Before initialization, provision or select the external PostgreSQL provider, then fill in the control/DuckLake URLs, distinct roles, and target delivery-pool identities in
leapview.env:
cp deployment.env.example deployment.env
cp leapview.env.example leapview.env
# Run pool bootstrap without --apply and copy its deterministic pool_id and
# compatibility_digest into leapview.env before init.
./leapviewctl init \
--admin-email admin@example.com \
--domain dash.example.com \
--environment prod
# Now inject the operation-only DuckLake migrator credential and repeat the
# exact pool bootstrap command with --apply before starting the service.
- Start the instance and consume the one-time credentials:
./leapviewctl start
./leapviewctl first-login
Before adoption, run ./leapviewctl qualify installed-candidate from the
extracted archive.
QUALIFICATION.md maps every automated assertion to the corresponding human
check, including anonymous distribution, the five-minute sample, audited
authorization denial, restart persistence, and recovery-readiness checks using
the separately managed secret configuration.
Initialization treats --domain as the canonical public hostname and derives LEAPVIEW_PUBLIC_URL=https://<domain>, the allowed host, and the Caddy domain from it. It also generates production secrets, creates the persistent volume, validates the resulting production configuration, and atomically creates a forced-change local administrator plus a restricted publisher token. first-login prints and deletes that one-time credential file.
The Compose bundle does not include PostgreSQL. Initialization preserves the
operator-supplied PostgreSQL and delivery-pool settings and fails with the
missing variable name when the clean-slate production contract is incomplete.
The pool-bootstrap dry run precedes initialization only to derive identities;
the applying run follows initialization because it verifies the newly applied
control baseline. Do not store the operation-only DuckLake migrator credential
in the serving leapview.env.
leapviewctl is an optional production operations controller, not a prerequisite for pulling or running LeapView. It invokes the installed Docker Compose CLI and does not require Bash or direct access to the Docker socket API. You may manage the image with your existing container platform if it preserves the same single-process, persistent-home, initialization, provider-native recovery, and environment contracts.
Operators integrating the image directly must set the documented production environment first. The initialization command authenticates the dedicated control migrator, applies or verifies the exact control baseline, closes that owner-capable pool, and creates the first administrator through the ordinary control runtime role:
leapview admin initialize --format json > initial-credentials.json
# Store the mode-0600 file in the target secret manager before acknowledging it.
leapview admin initialize --acknowledge-credentials
leapview admin delivery pool bootstrap \
--pool pool-identity.json \
--evidence shared-pool-evidence.json
leapview admin delivery pool bootstrap \
--pool pool-identity.json \
--evidence shared-pool-evidence.json \
--apply
Set LEAPVIEW_DELIVERY_PHYSICAL_POOL_ID and
LEAPVIEW_DELIVERY_PHYSICAL_POOL_COMPATIBILITY_DIGEST to the exact values
printed by the bootstrap command, then start leapview serve --production.
Both initialization and pool bootstrap are exact-replay operations. After
credential acknowledgement, initialization reports that the instance already
exists and never returns the credential material again. The Compose controller
performs the initialization and one-time credential handoff atomically; target
provisioning must still supply the reviewed pool identity and evidence.
The Caddy overlay is enabled by default. Pass --no-https only when an existing trusted HTTPS proxy fronts the localhost-bound application port. This changes where TLS terminates, not the external scheme: the generated public URL remains HTTPS, secure cookies remain enabled, and forwarded host and scheme headers must come only from that trusted proxy.
Understand the instance boundary
Production authority is the PostgreSQL control plane and PostgreSQL-backed DuckLake catalog, with Parquet and managed objects protected in their configured object stores. The local volume contains runtime state and caches; it is not a PostgreSQL recovery artifact. Use provider-native PostgreSQL backup/PITR and DuckLake/object-store versioning or replication, coordinated to one recovery point.
Use separate Compose project directories and names for development, staging, and production. Never scale one project to multiple application containers or point two processes at the same volume.
The controller exposes only basic lifecycle operations:
./leapviewctl status
./leapviewctl logs
./leapviewctl start
Use the container platform's immutable image rollout and change-management
workflow for upgrades or host rollback. The target-level leapview rollback
command remains available for a retained serving generation, but it does not
restore PostgreSQL, DuckLake, object-store, or Compose state. Those recovery
operations are external; use the PostgreSQL operations
guide and Backup and restore
guide.
Contributor installation
Source checkout is the contributor workflow, not the production packaging path. Install the Go version from go.mod, Bun, and Task, then run:
task node:deps
task generate
task dev
task dev provisions a loopback-only PostgreSQL 18 service scoped to the
worktree, runs the local physical-pool qualification/bootstrap once, and
starts one native PostgreSQL target with the private authoring watcher. The
generated credentials remain in .tmp/postgres-dev.env (mode 0600); do not
reuse them outside this worktree. For a durable rollout, use the canonical plan, build, and
publish CANDIDATE_ID commands shown above. Use task dev:status,
task dev:logs, and task dev:stop for lifecycle operations. Run task ci
before handing off substantial changes.
Validate
For the local image path, run docker inspect --format '{{.State.Health.Status}}' leapview and expect healthy. For Compose, run docker compose config --quiet and ./leapviewctl status. A production application container must report healthy, and its resolved image must include a sha256 digest.
For a released Compose archive, verify that every shipped surface has the same identity before trusting the deployment:
sha256sum --check leapview-compose-*.tar.gz.sha256
cat release-identity.json
./leapviewctl version --json
LEAPVIEW_IMAGE="$(cat image-reference.txt)"
docker image inspect "$LEAPVIEW_IMAGE" \
--format '{{index .Config.Labels "org.opencontainers.image.version"}} {{index .Config.Labels "org.opencontainers.image.revision"}}'
docker run --rm "$LEAPVIEW_IMAGE" version --json
The semantic version and full Git revision must agree across
release-identity.json, leapviewctl, the server binary, and the OCI labels.
A release reports "dirty": false and "development": false; an ordinary
local or candidate build reports version development and can never claim the
release version. LeapView uses the release commit timestamp as buildTime so
the identity remains reproducible.
After startup, compare the same identity through the authenticated capabilities endpoint using a token authorized to use the project:
curl --fail --silent --show-error \
--header "Authorization: Bearer $LEAPVIEW_API_TOKEN" \
"$LEAPVIEW_PUBLIC_URL/api/v1/capabilities"
The /api/v1/capabilities response fields buildVersion, buildRevision,
buildTime, buildDirty, and buildDevelopment must match the packaged
identity.
Verify
Open the configured HTTPS URL, sign in with the temporary administrator credentials, and change the password when prompted. Verify the instance identity and readiness through the authenticated capabilities endpoint; follow the PostgreSQL operations guide and Backup and restore guide for PostgreSQL/DuckLake protection.
Troubleshooting
Use ./leapviewctl logs when startup or health checks fail. A second process cannot open the same state volume, and an instance initialized for one environment cannot be started as another; use a separate Compose project and volume instead of changing LEAPVIEW_ENVIRONMENT.
Next steps
Continue with Self-hosting, Connect a data source, and Build your first dashboard.
The commands above illustrate the installation workflow. Use the generated admin CLI reference, serve CLI reference, and environment variable reference for the exact current command and runtime contracts.