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.
@@ -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: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
70
+ [![PyPI](https://img.shields.io/pypi/v/prismnote.svg)](https://pypi.org/project/prismnote/)
71
+ [![Python](https://img.shields.io/pypi/pyversions/prismnote.svg)](https://pypi.org/project/prismnote/)
72
+ [![Built with Rust](https://img.shields.io/badge/engine-Rust-orange.svg)](https://www.rust-lang.org/)
73
+ [![GitHub stars](https://img.shields.io/github/stars/Mullassery/prismnote?style=social)](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: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
10
+ [![PyPI](https://img.shields.io/pypi/v/prismnote.svg)](https://pypi.org/project/prismnote/)
11
+ [![Python](https://img.shields.io/pypi/pyversions/prismnote.svg)](https://pypi.org/project/prismnote/)
12
+ [![Built with Rust](https://img.shields.io/badge/engine-Rust-orange.svg)](https://www.rust-lang.org/)
13
+ [![GitHub stars](https://img.shields.io/github/stars/Mullassery/prismnote?style=social)](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.3"
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" }
@@ -1,3 +1,3 @@
1
1
  """PrismNote - A modern data science notebook."""
2
2
 
3
- __version__ = "0.4.3"
3
+ __version__ = "0.4.4"