Thanks for your interest in contributing. This document covers what the project is, the design constraints that shape it, and how to propose changes.
Lance Data Viewer is a read-only, mount-and-go web UI for browsing Lance and LanceDB tables. The intended flow is:
- Point a Docker container at a directory of Lance files.
- Open a browser.
- Browse.
There is no setup, no database to configure, no writes. The viewer is meant for local development, data inspection, and sanity-checking datasets produced by other pipelines.
A few constraints are load-bearing. They are the reason the project is small, fast to start, and easy to drop into a Docker Compose stack next to other services. Proposals that move away from them need a strong justification and are best discussed in an issue before code is written.
The frontend is plain JavaScript, HTML, and CSS served directly from the
container. There is no Webpack, Vite, esbuild, tsc, or npm install in the
build path. This keeps the container image small, the contributor onboarding
bar low, and the edit-refresh loop instant.
Proposals to introduce TypeScript, React, Vue, Svelte, jQuery, or a CSS framework such as Tailwind fall under this constraint.
Every endpoint in backend/app.py is a GET. There are no sessions, no
server-side state between requests, and no POST/PUT/DELETE surface. The
viewer's single job is to read Lance files and serialize them to JSON.
Proposals that introduce POST endpoints, server-side query state, or filtering that accepts raw SQL from the client fall under this constraint.
The Lance files in the mounted directory are the only source of truth. The viewer does not maintain a separate SQLite, DuckDB, or Redis alongside them. Adding one would introduce a lifecycle (migrations, eviction, consistency) that conflicts with the mount-and-go model.
There is no login, no token check, and no RBAC. Deployments that need access control are expected to run the container on localhost or behind a reverse proxy (Nginx, Traefik, Caddy) that handles auth at the edge.
The viewer never writes to the mounted Lance directory. The examples in the
README mount /data with :ro, and the code path contains no write
operations. This is deliberate: the viewer should be safe to point at
production data without any fear of corruption.
For small bug fixes and direct improvements, opening a PR is fine. For anything that touches the design constraints above, adds a new dependency, or meaningfully changes the architecture, please open an issue first so the approach can be discussed before code is written.
Recent examples of the "issue first" path:
- Adding media previews for columns that reference external assets: see the approach discussion in #29.
- Replacing the vanilla JS frontend with a framework or toolkit: see #5 (TypeScript) and #39 (jQuery + DataTables + DuckDB) for prior discussions of why this direction does not fit.
The improvement plan lives in the issue tracker. A few good starting points for new contributors:
- Issues labeled
bugfor direct fixes. - Issues labeled
documentationfor low-risk contributions while learning the codebase. - Issues labeled
enhancementfor feature work. Read the design constraints above first.
# Build with a specific Lance version (default: 0.29.2)
docker build -f docker/Dockerfile \
--build-arg LANCEDB_VERSION=0.29.2 \
-t lance-data-viewer:dev .
# Run with your data
docker run --rm -p 8080:8080 -v $(pwd)/data:/data:ro lance-data-viewer:dev
# Open the UI
open http://localhost:8080No frontend build step. Edit files in web/vanilla/ and reload the browser.