Perspective

[![Build Status](https://img.shields.io/github/actions/workflow/status/perspective-dev/perspective/build.yaml?event=push&style=for-the-badge)](https://github.com/perspective-dev/perspective/actions/workflows/build.yaml) [![npm](https://img.shields.io/npm/v/@perspective-dev/client.svg?style=for-the-badge)](https://www.npmjs.com/package/@perspective-dev/client) [![PyPI](https://img.shields.io/pypi/v/perspective-python.svg?style=for-the-badge)](https://pypi.python.org/pypi/perspective-python) [![crates.io](https://img.shields.io/crates/v/perspective?style=for-the-badge)](https://crates.io/crates/perspective) Perspective is an open-source data grid, pivot table and charting component for large, real-time and streaming datasets. Build user-configurable reports, dashboards, notebooks and embedded analytics applications, backed by a high-performance streaming query engine that runs in-browser via WebAssembly or server-side in Python, Node.js and Rust — or delegates to a database you already have.
A collage of Perspective data grids, pivot tables, charts and maps ## Features - A data-reactive UI packaged as a [Custom Element](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements), with drag-and-drop query and layout configuration. Includes a virtual-scrolling, editable data grid, WebGL charting engine with 15+ chart types, tile-based geographic maps, full theme support, and [React](https://react.dev/) bindings. - A fast, memory-efficient streaming query engine written in C++ and compiled for [WebAssembly](https://webassembly.org/) (including a 64-bit `memory64` build for in-browser datasets larger than 4GB, and support for paging columns to disk via OPFS in the browser or memory-mapped files natively), [Python](https://www.python.org/) and [Rust](https://www.rust-lang.org/). Tables update incrementally and views tick in real time, with reactive joins across tables, a columnar expression language based on [ExprTK](https://github.com/ArashPartow/exprtk), and read/write/streaming support for [Apache Arrow](https://arrow.apache.org/), CSV and JSON. - A symmetric client/server architecture — the same Client API connects to an engine in-process, in a Web Worker, or remotely over WebSocket, with server bindings for Python (aiohttp, Starlette, Tornado), Node.js and Rust. Datasets can be mirrored to the browser for fluid interaction or virtualized server-side, streaming only what's visible. - Virtual servers that run Perspective's UI directly on external engines like [DuckDB](https://duckdb.org/), [ClickHouse](https://clickhouse.com/), [PostgreSQL](https://www.postgresql.org/) and [Polars](https://pola.rs/), translating view configurations into native queries — no ETL or data copy required. - A [Jupyter](https://jupyter.org/) widget built on [anywidget](https://anywidget.dev/) and a Python client library for interactive data analysis in JupyterLab and other notebook environments. ## Documentation - [Project Site](https://perspective-dev.github.io/) - [User Guide](https://perspective-dev.github.io/guide/) - JavaScript API - [`@perspective-dev/react` React Component](https://perspective-dev.github.io/react/index.html) - [`@perspective-dev/viewer` Web Component](https://perspective-dev.github.io/viewer/modules/perspective-viewer.html) - [`@perspective-dev/client` Client (Browser)](https://perspective-dev.github.io/browser/modules/src_ts_perspective.browser.ts.html) - [`@perspective-dev/client` Client (Node.js)](https://perspective-dev.github.io/node/modules/src_ts_perspective.node.ts.html) - [`@perspective-dev/client` Clickhouse Virtual Server](https://perspective-dev.github.io/browser/modules/dist_esm_virtual_servers_clickhouse.js.html) - [`@perspective-dev/client` DuckDB Virtual Server](https://perspective-dev.github.io/browser/modules/dist_esm_virtual_servers_duckdb.js.html) - Python API - [`perspective`](https://perspective-dev.github.io/python/index.html) - [`perspective.widget`](https://perspective-dev.github.io/python/perspective/widget.html) - [`perspective.handlers.aiohttp`](https://perspective-dev.github.io/python/perspective/handlers/aiohttp.html) - [`perspective.handlers.starlette`](https://perspective-dev.github.io/python/perspective/handlers/starlette.html) - [`perspective.handlers.tornado`](https://perspective-dev.github.io/python/perspective/handlers/tornado.html) - [`perspective.virtual_servers.clickhouse`](https://perspective-dev.github.io/python/perspective/virtual_servers/clickhouse.html) - [`perspective.virtual_servers.duckdb`](https://perspective-dev.github.io/python/perspective/virtual_servers/duckdb.html) - [`perspective.virtual_servers.postgres`](https://perspective-dev.github.io/python/perspective/virtual_servers/postgres.html) - Rust API - [`perspective`](https://docs.rs/perspective/latest/perspective/) ## Examples
SuperstoreWorkspaceWebcam
Perspective example: superstore Perspective example: superstore overview Perspective example: webcam video wall
RaycastingMarketNYPD
Perspective example: raycasting Perspective example: market trading desk Perspective example: nypd 4
MoviesEvictionsFractal
Perspective example: movies Perspective example: evictions 2 Perspective example: fractal
## Media
@timkpaine @timbess @sc1f
Perspective conference talk Perspective conference talk Perspective conference talk
@texodus @texodus
Perspective conference talk Perspective conference talk


---
OpenJS Foundation


The Perspective project is a member of the [The OpenJS Foundation](https://openjsf.org/). Copyright [OpenJS Foundation](https://openjsf.org) and Perspective contributors. All rights reserved. The [OpenJS Foundation](https://openjsf.org) has registered trademarks and uses trademarks. For a list of trademarks of the [OpenJS Foundation](https://openjsf.org), please see our [Trademark Policy](https://trademark-policy.openjsf.org/) and [Trademark List](https://trademark-list.openjsf.org/). Trademarks and logos not indicated on the [list of OpenJS Foundation trademarks](https://trademark-list.openjsf.org) are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. [The OpenJS Foundation](https://openjsf.org/) | [Terms of Use](https://terms-of-use.openjsf.org/) | [Privacy Policy](https://privacy-policy.openjsf.org/) | [Bylaws](https://bylaws.openjsf.org/) | [Code of Conduct](https://code-of-conduct.openjsf.org) | [Trademark Policy](https://trademark-policy.openjsf.org/) | [Trademark List](https://trademark-list.openjsf.org/) | [Cookie Policy](https://www.linuxfoundation.org/cookies/)