prismnote 0.4.3__tar.gz → 0.4.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prismnote-0.4.4/PKG-INFO +364 -0
- prismnote-0.4.4/README.md +304 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/pyproject.toml +1 -1
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote/__init__.py +1 -1
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote/_cli.py +1 -1
- prismnote-0.4.4/python/prismnote.egg-info/PKG-INFO +364 -0
- prismnote-0.4.3/PKG-INFO +0 -279
- prismnote-0.4.3/README.md +0 -219
- prismnote-0.4.3/python/prismnote.egg-info/PKG-INFO +0 -279
- {prismnote-0.4.3 → prismnote-0.4.4}/LICENSE +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote/__main__.py +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote.egg-info/SOURCES.txt +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote.egg-info/dependency_links.txt +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote.egg-info/entry_points.txt +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote.egg-info/requires.txt +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/python/prismnote.egg-info/top_level.txt +0 -0
- {prismnote-0.4.3 → prismnote-0.4.4}/setup.cfg +0 -0
prismnote-0.4.4/PKG-INFO
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: prismnote
|
|
3
|
+
Version: 0.4.4
|
|
4
|
+
Summary: Modern, open-source Jupyter-compatible data science notebook with Rust performance
|
|
5
|
+
Author-email: Georgi Mammen Mullassery <mullassery@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Mullassery/prismnote
|
|
8
|
+
Project-URL: Repository, https://github.com/Mullassery/prismnote
|
|
9
|
+
Project-URL: Documentation, https://github.com/Mullassery/prismnote#readme
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/Mullassery/prismnote/issues
|
|
11
|
+
Keywords: notebook,jupyter,data-science,sql,python,rust
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
24
|
+
Classifier: Environment :: Web Environment
|
|
25
|
+
Requires-Python: >=3.8
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: ipykernel>=6.0
|
|
29
|
+
Requires-Dist: jupyter>=1.0
|
|
30
|
+
Provides-Extra: sql
|
|
31
|
+
Requires-Dist: duckdb>=0.9; extra == "sql"
|
|
32
|
+
Requires-Dist: pg8000>=1.30; extra == "sql"
|
|
33
|
+
Requires-Dist: pymysql>=1.0; extra == "sql"
|
|
34
|
+
Provides-Extra: postgres
|
|
35
|
+
Requires-Dist: pg8000>=1.30; extra == "postgres"
|
|
36
|
+
Provides-Extra: mysql
|
|
37
|
+
Requires-Dist: pymysql>=1.0; extra == "mysql"
|
|
38
|
+
Provides-Extra: duckdb
|
|
39
|
+
Requires-Dist: duckdb>=0.9; extra == "duckdb"
|
|
40
|
+
Provides-Extra: cloud
|
|
41
|
+
Requires-Dist: snowflake-connector-python[pandas]>=3.0; extra == "cloud"
|
|
42
|
+
Requires-Dist: google-cloud-bigquery>=3.0; extra == "cloud"
|
|
43
|
+
Requires-Dist: db-dtypes>=1.0; extra == "cloud"
|
|
44
|
+
Requires-Dist: redshift_connector>=2.0; extra == "cloud"
|
|
45
|
+
Requires-Dist: databricks-sql-connector>=2.0; extra == "cloud"
|
|
46
|
+
Requires-Dist: pyathena>=3.0; extra == "cloud"
|
|
47
|
+
Requires-Dist: trino>=0.328; extra == "cloud"
|
|
48
|
+
Provides-Extra: ai
|
|
49
|
+
Requires-Dist: anthropic>=0.7; extra == "ai"
|
|
50
|
+
Provides-Extra: openai
|
|
51
|
+
Requires-Dist: openai>=1.0; extra == "openai"
|
|
52
|
+
Provides-Extra: spark
|
|
53
|
+
Requires-Dist: pyspark>=3.0; extra == "spark"
|
|
54
|
+
Requires-Dist: pyarrow>=10; extra == "spark"
|
|
55
|
+
Provides-Extra: dev
|
|
56
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
57
|
+
Requires-Dist: black>=22.0; extra == "dev"
|
|
58
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
59
|
+
Dynamic: license-file
|
|
60
|
+
|
|
61
|
+
<div align="center">
|
|
62
|
+
|
|
63
|
+
# ◆ PrismNote
|
|
64
|
+
|
|
65
|
+
**The fast, local-first data-science notebook — with a warehouse-grade Data Explorer built in.**
|
|
66
|
+
|
|
67
|
+
Python + SQL · a BigQuery/Snowflake-style Data Explorer · no-code charts · local AI · jobs · git — all on your machine.
|
|
68
|
+
|
|
69
|
+
[](LICENSE)
|
|
70
|
+
[](https://pypi.org/project/prismnote/)
|
|
71
|
+
[](https://pypi.org/project/prismnote/)
|
|
72
|
+
[](https://www.rust-lang.org/)
|
|
73
|
+
[](https://github.com/Mullassery/prismnote/stargazers)
|
|
74
|
+
|
|
75
|
+
### ⭐ If PrismNote is useful to you, please [**star the repo**](https://github.com/Mullassery/prismnote) — it genuinely helps the project grow and reach more data scientists.
|
|
76
|
+
|
|
77
|
+
<img src="docs/screenshots/02_notebook_dark.png" alt="PrismNote" width="820">
|
|
78
|
+
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Why PrismNote?
|
|
84
|
+
|
|
85
|
+
Jupyter is great for code, but exploring data still means writing `df.head()`, `df.describe()`,
|
|
86
|
+
and one-off `matplotlib` calls. PrismNote makes **data exploration a first-class surface**:
|
|
87
|
+
open any DataFrame — or a Parquet/CSV/Iceberg file — in a fast, scrollable grid with
|
|
88
|
+
per-column statistics, distributions, and lineage, then build charts with no code. It's
|
|
89
|
+
**local-first** (your data never leaves your machine), **Jupyter-compatible** (`.ipynb` in/out),
|
|
90
|
+
and **AI-native** (local via Ollama, or Claude/OpenAI).
|
|
91
|
+
|
|
92
|
+
- 🔍 **Data Explorer first** — the headline feature, ranked above the notebook itself.
|
|
93
|
+
- 🔒 **Local & private** — runs on your machine; local AI via Ollama, no account required.
|
|
94
|
+
- 🦀 **Fast** — a Rust + Axum engine driving a persistent Python kernel.
|
|
95
|
+
- 🔗 **Open formats** — Parquet, CSV, JSON, Arrow, **Apache Iceberg** via DuckDB.
|
|
96
|
+
- 🧩 **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Quickstart
|
|
101
|
+
|
|
102
|
+
Install with **pip** _or_ **uv** _or_ **brew** _or_ **curl** — pick one:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# ── pip ──
|
|
106
|
+
pip install prismnote && prismnote
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
— OR —
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# ── uv ── run instantly (no install), or install as a tool
|
|
113
|
+
uvx prismnote
|
|
114
|
+
# or: uv tool install prismnote && prismnote
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
— OR —
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# ── Homebrew (macOS / Linux) ──
|
|
121
|
+
brew tap Mullassery/prismnote
|
|
122
|
+
brew install prismnote && prismnote
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
— OR —
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# ── curl ── no Python required (installs the binary to /usr/local/bin)
|
|
129
|
+
curl -fsSL https://raw.githubusercontent.com/Mullassery/prismnote/main/install.sh | bash
|
|
130
|
+
prismnote
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Then open **http://localhost:8000** and click **Open Data Explorer** (`⌘E`) or **New Notebook**.
|
|
134
|
+
|
|
135
|
+
> **No Docker required.** PrismNote runs as a single native binary — Docker is **not**
|
|
136
|
+
> needed to install or run it. (Docker is only used by the optional *Deploy to Cloud*
|
|
137
|
+
> artifacts, and by maintainers who cross-build release binaries.)
|
|
138
|
+
|
|
139
|
+
> The pip/uv package is a thin launcher: on first run it downloads the prebuilt server
|
|
140
|
+
> binary for your platform from the matching **GitHub Release** (`vX.Y.Z`). If a release
|
|
141
|
+
> binary isn't published for your platform yet, use **[From source](#from-source)** below.
|
|
142
|
+
|
|
143
|
+
### From source
|
|
144
|
+
|
|
145
|
+
Requires **Rust** (stable), **Node 18+**, and **Python 3.8+** on `PATH`:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# kernel runtime deps (ipykernel required; the rest enable rich output, %sql, charts)
|
|
149
|
+
pip install ipykernel pandas matplotlib rich duckdb
|
|
150
|
+
|
|
151
|
+
cargo run # backend → http://localhost:8000
|
|
152
|
+
cd frontend && npm install && npm run dev # frontend → http://localhost:5173
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Open http://localhost:5173.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Highlights
|
|
160
|
+
|
|
161
|
+
### 🔍 Data Explorer — better than a `df.describe()`
|
|
162
|
+
Open a live DataFrame, a file, or a DuckDB query in a warehouse-style explorer:
|
|
163
|
+
|
|
164
|
+
- **Virtualized grid** that scrolls millions of rows (server-side paging/sort/filter).
|
|
165
|
+
- **Tabs:** Preview · **Schema** (types + null %) · **Statistics** · **Metadata** · **Lineage**.
|
|
166
|
+
- **Per-column profiling** — histograms, top values, and a full `describe()` table
|
|
167
|
+
(count, nulls, distinct, mean, std, min/quartiles/max, sum, skew, kurtosis).
|
|
168
|
+
- **Nested types** — `struct` and `array` columns are detected and rendered.
|
|
169
|
+
- **Open formats via DuckDB** — Parquet, CSV, JSON, Arrow, **Apache Iceberg**; or any DuckDB SQL.
|
|
170
|
+
- **Lineage** — provenance (variable / file / query), upstream sources, and the notebook
|
|
171
|
+
cells that define and use the dataset.
|
|
172
|
+
- **Reproducible** — "Copy as code" / "Insert as cell" emits runnable pandas; export CSV.
|
|
173
|
+
- Collapsible, with **+/- zoom**; double-click a data file in the file browser to open it here.
|
|
174
|
+
|
|
175
|
+
### 📊 Visualization Pane
|
|
176
|
+
- **Plot gallery** — every figure (matplotlib/plotly) collected with zoom, pan, filmstrip,
|
|
177
|
+
and **PNG + vector SVG** export.
|
|
178
|
+
- **No-code chart builder** (Looker-style) — drag dimensions/measures, pick a chart
|
|
179
|
+
(bar/line/area/scatter/heatmap/pie), aggregate, and render via **Vega-Lite** — then
|
|
180
|
+
"Copy as code" to get the equivalent Altair.
|
|
181
|
+
|
|
182
|
+
### 🤖 AI assistance
|
|
183
|
+
- **Choose your provider** in Settings → AI: **Ollama** (local, free, private), **Claude**,
|
|
184
|
+
or **OpenAI** — with model pickers and live connection status.
|
|
185
|
+
- **In-cell ⌘K edit** (diff accept/reject), **Fix with AI** on errors, **Explain**.
|
|
186
|
+
- **Inline autocomplete** (ghost text) and a **Plan/Act agent** that's aware of your
|
|
187
|
+
workspace files and the open dataset.
|
|
188
|
+
|
|
189
|
+
### 📓 Notebook & execution
|
|
190
|
+
- **Persistent shared kernel** — state carries across cells; interrupt & restart.
|
|
191
|
+
- **Magics:** `%python`, `%sql` (in-process DuckDB), `%sh` / `!cmd`, `%md`.
|
|
192
|
+
- **Rich output**, live-streamed over WebSocket; **input widgets** that re-run cells.
|
|
193
|
+
- **Auto-formatting** — code is pretty-printed with **Black** on paste and on `⇧⌥F`.
|
|
194
|
+
- **Friendly errors** — plain-language explanations + in-editor markers.
|
|
195
|
+
|
|
196
|
+
### 🗄️ Data & SQL
|
|
197
|
+
- Connect to SQLite, DuckDB, PostgreSQL, MySQL, and 8 cloud warehouses
|
|
198
|
+
(Snowflake, BigQuery, Redshift, Databricks, Athena, Trino, Presto, Synapse).
|
|
199
|
+
- Queries run through the kernel using **permissively-licensed OSS drivers you install** —
|
|
200
|
+
nothing proprietary vendored. See [CONNECTORS.md](CONNECTORS.md).
|
|
201
|
+
|
|
202
|
+
### ⚙️ Workflow
|
|
203
|
+
- **Jobs** — run a whole notebook on a schedule (manual / interval / daily) with run history;
|
|
204
|
+
**Airflow** trigger + generated DAG.
|
|
205
|
+
- **Source control** — init / clone / commit / push / pull / status from the UI.
|
|
206
|
+
- **Cloud deploy** — generates `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, `fly.toml`.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## How PrismNote compares
|
|
211
|
+
|
|
212
|
+
PrismNote focuses on **data exploration, local AI, and a single-binary local-first
|
|
213
|
+
experience**. JupyterLab, Apache Zeppelin, and PyCharm are mature, broader tools — here's
|
|
214
|
+
an honest side-by-side.
|
|
215
|
+
|
|
216
|
+
> ✅ built-in · ⚠️ via extension / partial / paid · ❌ not available · 🔜 on the roadmap
|
|
217
|
+
|
|
218
|
+
| Feature | PrismNote | JupyterLab | Apache Zeppelin | PyCharm (Pro) |
|
|
219
|
+
|---|:---:|:---:|:---:|:---:|
|
|
220
|
+
| Type | Notebook (web) | Notebook (web) | Notebook (web) | Desktop IDE |
|
|
221
|
+
| Engine / runtime | Rust + Python kernel | Python (Jupyter) | JVM + interpreters | JetBrains (JVM) + Python |
|
|
222
|
+
| `.ipynb` format (native) | ✅ | ✅ | ⚠️ (own format) | ✅ |
|
|
223
|
+
| **Built-in Data Explorer** (grid, sort/filter) | ✅ | ⚠️ | ⚠️ (basic) | ✅ (DataFrame viewer) |
|
|
224
|
+
| Column profiling, `describe()` & **lineage** | ✅ | ❌ | ❌ | ⚠️ (column stats) |
|
|
225
|
+
| Open-format explorer (Parquet/CSV/**Iceberg**) | ✅ (DuckDB) | ⚠️ (code) | ⚠️ (code) | ⚠️ (DB tools/CSV) |
|
|
226
|
+
| No-code chart builder | ✅ (Vega-Lite) | ❌ (code) | ✅ (on SQL) | ⚠️ (viewer charts) |
|
|
227
|
+
| In-process SQL (DuckDB) + magics | ✅ | ⚠️ | ✅ | ⚠️ (DB tools) |
|
|
228
|
+
| AI: in-cell edit / fix / explain / agent | ✅ (Ollama/Claude/OpenAI) | ⚠️ (Jupyter AI) | ❌ | ⚠️ (AI Assistant, paid) |
|
|
229
|
+
| AI inline autocomplete | ✅ | ⚠️ | ❌ | ✅ |
|
|
230
|
+
| Code auto-format (Black) | ✅ | ⚠️ | ❌ | ✅ |
|
|
231
|
+
| Variable explorer | ✅ | ⚠️ | ❌ | ✅ |
|
|
232
|
+
| Scheduled jobs (built-in) | ✅ | ❌ (external) | ✅ (cron) | ❌ |
|
|
233
|
+
| Git integration (UI) | ✅ | ⚠️ (jupyterlab-git) | ⚠️ | ✅ (excellent) |
|
|
234
|
+
| Cloud deploy artifacts (Docker/k8s/Fly) | ✅ | ❌ | ❌ | ⚠️ (plugins) |
|
|
235
|
+
| Real-time collaboration | 🔜 | ✅ | ⚠️ | ✅ (Code With Me) |
|
|
236
|
+
| Multi-language interpreters | ⚠️ (Python/SQL/shell) | ✅ (many kernels) | ✅ (many) | ⚠️ (Python focus) |
|
|
237
|
+
| Install | pip / uv / **single binary** | pip / conda | download + JVM | IDE download |
|
|
238
|
+
| License | MIT | BSD-3 | Apache-2.0 | Proprietary (Pro) |
|
|
239
|
+
|
|
240
|
+
**In short:** choose **JupyterLab** for its vast kernel/extension ecosystem and real-time
|
|
241
|
+
collaboration, **Zeppelin** for JVM/Spark-centric multi-interpreter workloads, **PyCharm**
|
|
242
|
+
for a full desktop IDE with deep refactoring and DB tools (paid Pro), and **PrismNote**
|
|
243
|
+
when you want fast, no-setup **data exploration + charts + local AI** in one free,
|
|
244
|
+
open-source local binary. See also [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) and
|
|
245
|
+
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md).
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Configure AI (optional)
|
|
250
|
+
|
|
251
|
+
**Local — Ollama** (recommended for privacy/cost):
|
|
252
|
+
```bash
|
|
253
|
+
# install from https://ollama.com, then pull a coding model
|
|
254
|
+
ollama pull qwen2.5-coder
|
|
255
|
+
# the browser UI talks to Ollama directly, so allow the origin once:
|
|
256
|
+
OLLAMA_ORIGINS=http://localhost:5173 ollama serve
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Claude / OpenAI** — set it in **Settings → AI Provider** (keys are stored locally in
|
|
260
|
+
`~/.prismnote/ai_config.json` and never leave your machine), or via env:
|
|
261
|
+
```bash
|
|
262
|
+
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
263
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Keyboard shortcuts
|
|
269
|
+
|
|
270
|
+
| Shortcut | Action |
|
|
271
|
+
|---|---|
|
|
272
|
+
| `⌘E` | **Open Data Explorer** |
|
|
273
|
+
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
274
|
+
| `⌘K` | Global search *(in a focused cell, `⌘K` = AI edit)* |
|
|
275
|
+
| `⇧⌘P` | Command palette |
|
|
276
|
+
| `⌘,` | Settings |
|
|
277
|
+
| `⌘⇧↵` / `⇧↵` | Run all / run focused cell |
|
|
278
|
+
| `⇧⌥F` | Format cell (Black) |
|
|
279
|
+
|
|
280
|
+
*(`⌘`/`Ctrl` depending on platform.)*
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Architecture
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
┌──────────────────────────────┐ ┌─────────────────────────────┐
|
|
288
|
+
│ React + TypeScript (Vite) │ HTTP │ Rust backend (Axum) │
|
|
289
|
+
│ Monaco · Tailwind · zustand │ ─────▶ │ REST + WebSocket │
|
|
290
|
+
│ explorer · charts · AI │ ◀───── │ explore · jobs · git · … │
|
|
291
|
+
└──────────────────────────────┘ WS └──────────────┬──────────────┘
|
|
292
|
+
│ stdin/stdout (JSON)
|
|
293
|
+
┌───────▼────────┐
|
|
294
|
+
│ Persistent │
|
|
295
|
+
│ Python kernel │
|
|
296
|
+
│ (shared globals)│
|
|
297
|
+
└─────────────────┘
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
The backend spawns one long-lived `python` process and speaks a line-framed JSON
|
|
301
|
+
protocol; outputs are Jupyter-style MIME bundles, streamed live. The Data Explorer
|
|
302
|
+
pushes profiling/paging/aggregation into the kernel where the data already lives.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Deploy
|
|
307
|
+
|
|
308
|
+
Open **Deploy to Cloud** to copy/download the generated artifacts, then:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
docker compose up -d # Docker
|
|
312
|
+
kubectl apply -f k8s.yaml # Kubernetes
|
|
313
|
+
fly launch --copy-config --now # Fly.io
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Project layout
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
crates/server/ Rust backend (api, kernel, explore, jobs, db, ws, deploy, git…)
|
|
322
|
+
frontend/ React app (components, hooks, api clients)
|
|
323
|
+
python/ PyPI launcher package (prismnote)
|
|
324
|
+
docs/ screenshots & comparison docs
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Further reading: [CONNECTORS.md](CONNECTORS.md) ·
|
|
328
|
+
[ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
329
|
+
[DATABRICKS_COMPARISON.md](DATABRICKS_COMPARISON.md) ·
|
|
330
|
+
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md)
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Roadmap
|
|
335
|
+
|
|
336
|
+
- Prebuilt release binaries for all platforms (so `pip install` runs out of the box).
|
|
337
|
+
- Distributed compute (Spark) and a catalog/data browser.
|
|
338
|
+
- Real-time collaboration (live cursors / co-editing).
|
|
339
|
+
- Notebook parameters and multi-notebook job composition.
|
|
340
|
+
- Reactive (dependency-aware) cell execution.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Contributing
|
|
345
|
+
|
|
346
|
+
⭐ **The easiest way to contribute is to [star the repo](https://github.com/Mullassery/prismnote)** — it boosts visibility and helps others discover PrismNote.
|
|
347
|
+
|
|
348
|
+
Code contributions are welcome too! Please open an issue to discuss substantial changes first.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
git clone https://github.com/Mullassery/prismnote.git
|
|
352
|
+
cd prismnote
|
|
353
|
+
cargo run # backend
|
|
354
|
+
cd frontend && npm install && npm run dev # frontend
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Run `cargo check` and `npm run build` before opening a PR.
|
|
358
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## License
|
|
363
|
+
|
|
364
|
+
[MIT](LICENSE) © Georgi Mammen Mullassery
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# ◆ PrismNote
|
|
4
|
+
|
|
5
|
+
**The fast, local-first data-science notebook — with a warehouse-grade Data Explorer built in.**
|
|
6
|
+
|
|
7
|
+
Python + SQL · a BigQuery/Snowflake-style Data Explorer · no-code charts · local AI · jobs · git — all on your machine.
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://pypi.org/project/prismnote/)
|
|
11
|
+
[](https://pypi.org/project/prismnote/)
|
|
12
|
+
[](https://www.rust-lang.org/)
|
|
13
|
+
[](https://github.com/Mullassery/prismnote/stargazers)
|
|
14
|
+
|
|
15
|
+
### ⭐ If PrismNote is useful to you, please [**star the repo**](https://github.com/Mullassery/prismnote) — it genuinely helps the project grow and reach more data scientists.
|
|
16
|
+
|
|
17
|
+
<img src="docs/screenshots/02_notebook_dark.png" alt="PrismNote" width="820">
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Why PrismNote?
|
|
24
|
+
|
|
25
|
+
Jupyter is great for code, but exploring data still means writing `df.head()`, `df.describe()`,
|
|
26
|
+
and one-off `matplotlib` calls. PrismNote makes **data exploration a first-class surface**:
|
|
27
|
+
open any DataFrame — or a Parquet/CSV/Iceberg file — in a fast, scrollable grid with
|
|
28
|
+
per-column statistics, distributions, and lineage, then build charts with no code. It's
|
|
29
|
+
**local-first** (your data never leaves your machine), **Jupyter-compatible** (`.ipynb` in/out),
|
|
30
|
+
and **AI-native** (local via Ollama, or Claude/OpenAI).
|
|
31
|
+
|
|
32
|
+
- 🔍 **Data Explorer first** — the headline feature, ranked above the notebook itself.
|
|
33
|
+
- 🔒 **Local & private** — runs on your machine; local AI via Ollama, no account required.
|
|
34
|
+
- 🦀 **Fast** — a Rust + Axum engine driving a persistent Python kernel.
|
|
35
|
+
- 🔗 **Open formats** — Parquet, CSV, JSON, Arrow, **Apache Iceberg** via DuckDB.
|
|
36
|
+
- 🧩 **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Quickstart
|
|
41
|
+
|
|
42
|
+
Install with **pip** _or_ **uv** _or_ **brew** _or_ **curl** — pick one:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# ── pip ──
|
|
46
|
+
pip install prismnote && prismnote
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
— OR —
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# ── uv ── run instantly (no install), or install as a tool
|
|
53
|
+
uvx prismnote
|
|
54
|
+
# or: uv tool install prismnote && prismnote
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
— OR —
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# ── Homebrew (macOS / Linux) ──
|
|
61
|
+
brew tap Mullassery/prismnote
|
|
62
|
+
brew install prismnote && prismnote
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
— OR —
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# ── curl ── no Python required (installs the binary to /usr/local/bin)
|
|
69
|
+
curl -fsSL https://raw.githubusercontent.com/Mullassery/prismnote/main/install.sh | bash
|
|
70
|
+
prismnote
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then open **http://localhost:8000** and click **Open Data Explorer** (`⌘E`) or **New Notebook**.
|
|
74
|
+
|
|
75
|
+
> **No Docker required.** PrismNote runs as a single native binary — Docker is **not**
|
|
76
|
+
> needed to install or run it. (Docker is only used by the optional *Deploy to Cloud*
|
|
77
|
+
> artifacts, and by maintainers who cross-build release binaries.)
|
|
78
|
+
|
|
79
|
+
> The pip/uv package is a thin launcher: on first run it downloads the prebuilt server
|
|
80
|
+
> binary for your platform from the matching **GitHub Release** (`vX.Y.Z`). If a release
|
|
81
|
+
> binary isn't published for your platform yet, use **[From source](#from-source)** below.
|
|
82
|
+
|
|
83
|
+
### From source
|
|
84
|
+
|
|
85
|
+
Requires **Rust** (stable), **Node 18+**, and **Python 3.8+** on `PATH`:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# kernel runtime deps (ipykernel required; the rest enable rich output, %sql, charts)
|
|
89
|
+
pip install ipykernel pandas matplotlib rich duckdb
|
|
90
|
+
|
|
91
|
+
cargo run # backend → http://localhost:8000
|
|
92
|
+
cd frontend && npm install && npm run dev # frontend → http://localhost:5173
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Open http://localhost:5173.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Highlights
|
|
100
|
+
|
|
101
|
+
### 🔍 Data Explorer — better than a `df.describe()`
|
|
102
|
+
Open a live DataFrame, a file, or a DuckDB query in a warehouse-style explorer:
|
|
103
|
+
|
|
104
|
+
- **Virtualized grid** that scrolls millions of rows (server-side paging/sort/filter).
|
|
105
|
+
- **Tabs:** Preview · **Schema** (types + null %) · **Statistics** · **Metadata** · **Lineage**.
|
|
106
|
+
- **Per-column profiling** — histograms, top values, and a full `describe()` table
|
|
107
|
+
(count, nulls, distinct, mean, std, min/quartiles/max, sum, skew, kurtosis).
|
|
108
|
+
- **Nested types** — `struct` and `array` columns are detected and rendered.
|
|
109
|
+
- **Open formats via DuckDB** — Parquet, CSV, JSON, Arrow, **Apache Iceberg**; or any DuckDB SQL.
|
|
110
|
+
- **Lineage** — provenance (variable / file / query), upstream sources, and the notebook
|
|
111
|
+
cells that define and use the dataset.
|
|
112
|
+
- **Reproducible** — "Copy as code" / "Insert as cell" emits runnable pandas; export CSV.
|
|
113
|
+
- Collapsible, with **+/- zoom**; double-click a data file in the file browser to open it here.
|
|
114
|
+
|
|
115
|
+
### 📊 Visualization Pane
|
|
116
|
+
- **Plot gallery** — every figure (matplotlib/plotly) collected with zoom, pan, filmstrip,
|
|
117
|
+
and **PNG + vector SVG** export.
|
|
118
|
+
- **No-code chart builder** (Looker-style) — drag dimensions/measures, pick a chart
|
|
119
|
+
(bar/line/area/scatter/heatmap/pie), aggregate, and render via **Vega-Lite** — then
|
|
120
|
+
"Copy as code" to get the equivalent Altair.
|
|
121
|
+
|
|
122
|
+
### 🤖 AI assistance
|
|
123
|
+
- **Choose your provider** in Settings → AI: **Ollama** (local, free, private), **Claude**,
|
|
124
|
+
or **OpenAI** — with model pickers and live connection status.
|
|
125
|
+
- **In-cell ⌘K edit** (diff accept/reject), **Fix with AI** on errors, **Explain**.
|
|
126
|
+
- **Inline autocomplete** (ghost text) and a **Plan/Act agent** that's aware of your
|
|
127
|
+
workspace files and the open dataset.
|
|
128
|
+
|
|
129
|
+
### 📓 Notebook & execution
|
|
130
|
+
- **Persistent shared kernel** — state carries across cells; interrupt & restart.
|
|
131
|
+
- **Magics:** `%python`, `%sql` (in-process DuckDB), `%sh` / `!cmd`, `%md`.
|
|
132
|
+
- **Rich output**, live-streamed over WebSocket; **input widgets** that re-run cells.
|
|
133
|
+
- **Auto-formatting** — code is pretty-printed with **Black** on paste and on `⇧⌥F`.
|
|
134
|
+
- **Friendly errors** — plain-language explanations + in-editor markers.
|
|
135
|
+
|
|
136
|
+
### 🗄️ Data & SQL
|
|
137
|
+
- Connect to SQLite, DuckDB, PostgreSQL, MySQL, and 8 cloud warehouses
|
|
138
|
+
(Snowflake, BigQuery, Redshift, Databricks, Athena, Trino, Presto, Synapse).
|
|
139
|
+
- Queries run through the kernel using **permissively-licensed OSS drivers you install** —
|
|
140
|
+
nothing proprietary vendored. See [CONNECTORS.md](CONNECTORS.md).
|
|
141
|
+
|
|
142
|
+
### ⚙️ Workflow
|
|
143
|
+
- **Jobs** — run a whole notebook on a schedule (manual / interval / daily) with run history;
|
|
144
|
+
**Airflow** trigger + generated DAG.
|
|
145
|
+
- **Source control** — init / clone / commit / push / pull / status from the UI.
|
|
146
|
+
- **Cloud deploy** — generates `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, `fly.toml`.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## How PrismNote compares
|
|
151
|
+
|
|
152
|
+
PrismNote focuses on **data exploration, local AI, and a single-binary local-first
|
|
153
|
+
experience**. JupyterLab, Apache Zeppelin, and PyCharm are mature, broader tools — here's
|
|
154
|
+
an honest side-by-side.
|
|
155
|
+
|
|
156
|
+
> ✅ built-in · ⚠️ via extension / partial / paid · ❌ not available · 🔜 on the roadmap
|
|
157
|
+
|
|
158
|
+
| Feature | PrismNote | JupyterLab | Apache Zeppelin | PyCharm (Pro) |
|
|
159
|
+
|---|:---:|:---:|:---:|:---:|
|
|
160
|
+
| Type | Notebook (web) | Notebook (web) | Notebook (web) | Desktop IDE |
|
|
161
|
+
| Engine / runtime | Rust + Python kernel | Python (Jupyter) | JVM + interpreters | JetBrains (JVM) + Python |
|
|
162
|
+
| `.ipynb` format (native) | ✅ | ✅ | ⚠️ (own format) | ✅ |
|
|
163
|
+
| **Built-in Data Explorer** (grid, sort/filter) | ✅ | ⚠️ | ⚠️ (basic) | ✅ (DataFrame viewer) |
|
|
164
|
+
| Column profiling, `describe()` & **lineage** | ✅ | ❌ | ❌ | ⚠️ (column stats) |
|
|
165
|
+
| Open-format explorer (Parquet/CSV/**Iceberg**) | ✅ (DuckDB) | ⚠️ (code) | ⚠️ (code) | ⚠️ (DB tools/CSV) |
|
|
166
|
+
| No-code chart builder | ✅ (Vega-Lite) | ❌ (code) | ✅ (on SQL) | ⚠️ (viewer charts) |
|
|
167
|
+
| In-process SQL (DuckDB) + magics | ✅ | ⚠️ | ✅ | ⚠️ (DB tools) |
|
|
168
|
+
| AI: in-cell edit / fix / explain / agent | ✅ (Ollama/Claude/OpenAI) | ⚠️ (Jupyter AI) | ❌ | ⚠️ (AI Assistant, paid) |
|
|
169
|
+
| AI inline autocomplete | ✅ | ⚠️ | ❌ | ✅ |
|
|
170
|
+
| Code auto-format (Black) | ✅ | ⚠️ | ❌ | ✅ |
|
|
171
|
+
| Variable explorer | ✅ | ⚠️ | ❌ | ✅ |
|
|
172
|
+
| Scheduled jobs (built-in) | ✅ | ❌ (external) | ✅ (cron) | ❌ |
|
|
173
|
+
| Git integration (UI) | ✅ | ⚠️ (jupyterlab-git) | ⚠️ | ✅ (excellent) |
|
|
174
|
+
| Cloud deploy artifacts (Docker/k8s/Fly) | ✅ | ❌ | ❌ | ⚠️ (plugins) |
|
|
175
|
+
| Real-time collaboration | 🔜 | ✅ | ⚠️ | ✅ (Code With Me) |
|
|
176
|
+
| Multi-language interpreters | ⚠️ (Python/SQL/shell) | ✅ (many kernels) | ✅ (many) | ⚠️ (Python focus) |
|
|
177
|
+
| Install | pip / uv / **single binary** | pip / conda | download + JVM | IDE download |
|
|
178
|
+
| License | MIT | BSD-3 | Apache-2.0 | Proprietary (Pro) |
|
|
179
|
+
|
|
180
|
+
**In short:** choose **JupyterLab** for its vast kernel/extension ecosystem and real-time
|
|
181
|
+
collaboration, **Zeppelin** for JVM/Spark-centric multi-interpreter workloads, **PyCharm**
|
|
182
|
+
for a full desktop IDE with deep refactoring and DB tools (paid Pro), and **PrismNote**
|
|
183
|
+
when you want fast, no-setup **data exploration + charts + local AI** in one free,
|
|
184
|
+
open-source local binary. See also [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) and
|
|
185
|
+
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md).
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Configure AI (optional)
|
|
190
|
+
|
|
191
|
+
**Local — Ollama** (recommended for privacy/cost):
|
|
192
|
+
```bash
|
|
193
|
+
# install from https://ollama.com, then pull a coding model
|
|
194
|
+
ollama pull qwen2.5-coder
|
|
195
|
+
# the browser UI talks to Ollama directly, so allow the origin once:
|
|
196
|
+
OLLAMA_ORIGINS=http://localhost:5173 ollama serve
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Claude / OpenAI** — set it in **Settings → AI Provider** (keys are stored locally in
|
|
200
|
+
`~/.prismnote/ai_config.json` and never leave your machine), or via env:
|
|
201
|
+
```bash
|
|
202
|
+
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
203
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Keyboard shortcuts
|
|
209
|
+
|
|
210
|
+
| Shortcut | Action |
|
|
211
|
+
|---|---|
|
|
212
|
+
| `⌘E` | **Open Data Explorer** |
|
|
213
|
+
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
214
|
+
| `⌘K` | Global search *(in a focused cell, `⌘K` = AI edit)* |
|
|
215
|
+
| `⇧⌘P` | Command palette |
|
|
216
|
+
| `⌘,` | Settings |
|
|
217
|
+
| `⌘⇧↵` / `⇧↵` | Run all / run focused cell |
|
|
218
|
+
| `⇧⌥F` | Format cell (Black) |
|
|
219
|
+
|
|
220
|
+
*(`⌘`/`Ctrl` depending on platform.)*
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Architecture
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
┌──────────────────────────────┐ ┌─────────────────────────────┐
|
|
228
|
+
│ React + TypeScript (Vite) │ HTTP │ Rust backend (Axum) │
|
|
229
|
+
│ Monaco · Tailwind · zustand │ ─────▶ │ REST + WebSocket │
|
|
230
|
+
│ explorer · charts · AI │ ◀───── │ explore · jobs · git · … │
|
|
231
|
+
└──────────────────────────────┘ WS └──────────────┬──────────────┘
|
|
232
|
+
│ stdin/stdout (JSON)
|
|
233
|
+
┌───────▼────────┐
|
|
234
|
+
│ Persistent │
|
|
235
|
+
│ Python kernel │
|
|
236
|
+
│ (shared globals)│
|
|
237
|
+
└─────────────────┘
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
The backend spawns one long-lived `python` process and speaks a line-framed JSON
|
|
241
|
+
protocol; outputs are Jupyter-style MIME bundles, streamed live. The Data Explorer
|
|
242
|
+
pushes profiling/paging/aggregation into the kernel where the data already lives.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Deploy
|
|
247
|
+
|
|
248
|
+
Open **Deploy to Cloud** to copy/download the generated artifacts, then:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
docker compose up -d # Docker
|
|
252
|
+
kubectl apply -f k8s.yaml # Kubernetes
|
|
253
|
+
fly launch --copy-config --now # Fly.io
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Project layout
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
crates/server/ Rust backend (api, kernel, explore, jobs, db, ws, deploy, git…)
|
|
262
|
+
frontend/ React app (components, hooks, api clients)
|
|
263
|
+
python/ PyPI launcher package (prismnote)
|
|
264
|
+
docs/ screenshots & comparison docs
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Further reading: [CONNECTORS.md](CONNECTORS.md) ·
|
|
268
|
+
[ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
269
|
+
[DATABRICKS_COMPARISON.md](DATABRICKS_COMPARISON.md) ·
|
|
270
|
+
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md)
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Roadmap
|
|
275
|
+
|
|
276
|
+
- Prebuilt release binaries for all platforms (so `pip install` runs out of the box).
|
|
277
|
+
- Distributed compute (Spark) and a catalog/data browser.
|
|
278
|
+
- Real-time collaboration (live cursors / co-editing).
|
|
279
|
+
- Notebook parameters and multi-notebook job composition.
|
|
280
|
+
- Reactive (dependency-aware) cell execution.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Contributing
|
|
285
|
+
|
|
286
|
+
⭐ **The easiest way to contribute is to [star the repo](https://github.com/Mullassery/prismnote)** — it boosts visibility and helps others discover PrismNote.
|
|
287
|
+
|
|
288
|
+
Code contributions are welcome too! Please open an issue to discuss substantial changes first.
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
git clone https://github.com/Mullassery/prismnote.git
|
|
292
|
+
cd prismnote
|
|
293
|
+
cargo run # backend
|
|
294
|
+
cd frontend && npm install && npm run dev # frontend
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Run `cargo check` and `npm run build` before opening a PR.
|
|
298
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## License
|
|
303
|
+
|
|
304
|
+
[MIT](LICENSE) © Georgi Mammen Mullassery
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "prismnote"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.4"
|
|
8
8
|
description = "Modern, open-source Jupyter-compatible data science notebook with Rust performance"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|