prismnote 0.4.0__tar.gz → 0.4.1__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.0/python/prismnote.egg-info → prismnote-0.4.1}/PKG-INFO +109 -100
- prismnote-0.4.1/README.md +198 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/pyproject.toml +1 -1
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote/__init__.py +1 -1
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote/_cli.py +1 -1
- {prismnote-0.4.0 → prismnote-0.4.1/python/prismnote.egg-info}/PKG-INFO +109 -100
- prismnote-0.4.0/README.md +0 -189
- {prismnote-0.4.0 → prismnote-0.4.1}/LICENSE +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote/__main__.py +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote.egg-info/SOURCES.txt +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote.egg-info/dependency_links.txt +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote.egg-info/entry_points.txt +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote.egg-info/requires.txt +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/python/prismnote.egg-info/top_level.txt +0 -0
- {prismnote-0.4.0 → prismnote-0.4.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prismnote
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Modern, open-source Jupyter-compatible data science notebook with Rust performance
|
|
5
5
|
Author-email: Georgi Mammen Mullassery <mullassery@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -59,7 +59,7 @@ Dynamic: license-file
|
|
|
59
59
|
**A fast, modern, open-source data-science notebook.**
|
|
60
60
|
Rust engine · React UI · local-first · AI-native.
|
|
61
61
|
|
|
62
|
-
**License:** MIT · **Status:** Beta (v0.4)
|
|
62
|
+
**License:** MIT · **Status:** Beta (v0.4) · **PyPI:** [`prismnote`](https://pypi.org/project/prismnote/)
|
|
63
63
|
|
|
64
64
|
</div>
|
|
65
65
|
|
|
@@ -68,72 +68,106 @@ Rust engine · React UI · local-first · AI-native.
|
|
|
68
68
|
## Overview
|
|
69
69
|
|
|
70
70
|
PrismNote is a local-first alternative to Jupyter, Zeppelin, and Databricks notebooks.
|
|
71
|
-
|
|
72
|
-
**VS Code-style React**
|
|
73
|
-
|
|
74
|
-
the cloud — all from one app that runs entirely on your machine.
|
|
71
|
+
A **Rust + Axum** backend drives a **persistent Python kernel**, and a modern,
|
|
72
|
+
**VS Code-style React** UI gives you Python + SQL, rich output and live charts, local
|
|
73
|
+
AI assistance, scheduled jobs, git, and generated cloud-deploy files — all on your machine.
|
|
75
74
|
|
|
76
|
-
- **Local-first & private** — runs
|
|
77
|
-
- **Jupyter-compatible** — native `.ipynb`
|
|
75
|
+
- **Local-first & private** — runs locally; local AI via Ollama, no account required.
|
|
76
|
+
- **Jupyter-compatible** — native `.ipynb` import/export.
|
|
78
77
|
- **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
79
78
|
|
|
79
|
+
> **Status note:** PrismNote is **beta**. The notebook, kernel, AI, jobs, git, and
|
|
80
|
+
> charts are functional. Cloud-warehouse connectors are **scaffolding** (query results
|
|
81
|
+
> are currently stubbed), and deployment files are **generated templates** you review
|
|
82
|
+
> before shipping. See the [roadmap](#roadmap).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Install & run
|
|
87
|
+
|
|
88
|
+
### From source (recommended today)
|
|
89
|
+
Requires **Rust** (stable), **Node 18+**, and **Python 3.8+** on `PATH`:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Python runtime deps for the kernel (ipykernel is required; the rest enable
|
|
93
|
+
# rich output, %sql, and charts)
|
|
94
|
+
pip install ipykernel pandas matplotlib rich duckdb
|
|
95
|
+
|
|
96
|
+
# 1) backend — http://localhost:8000
|
|
97
|
+
cargo run
|
|
98
|
+
|
|
99
|
+
# 2) frontend — http://localhost:5173 (proxies /api and /ws to the backend)
|
|
100
|
+
cd frontend && npm install && npm run dev
|
|
101
|
+
```
|
|
102
|
+
Open http://localhost:5173.
|
|
103
|
+
|
|
104
|
+
### From PyPI
|
|
105
|
+
```bash
|
|
106
|
+
pip install prismnote
|
|
107
|
+
prismnote
|
|
108
|
+
```
|
|
109
|
+
The PyPI package is a thin launcher: on first run it downloads the prebuilt server
|
|
110
|
+
binary for your platform from the matching **GitHub Release** (`vX.Y.Z`). If a release
|
|
111
|
+
binary isn't published for your platform/version yet, use the from-source steps above.
|
|
112
|
+
(`pip install prismnote` succeeds regardless; only the prebuilt launch depends on a release.)
|
|
113
|
+
|
|
114
|
+
### Enable AI (optional)
|
|
115
|
+
- **Local, free, private — Ollama:** install from https://ollama.com, then
|
|
116
|
+
`ollama pull qwen2.5-coder`. The UI talks to Ollama from the browser, so allow the
|
|
117
|
+
dev origin once:
|
|
118
|
+
```bash
|
|
119
|
+
OLLAMA_ORIGINS=http://localhost:5173 ollama serve
|
|
120
|
+
```
|
|
121
|
+
- **Claude / OpenAI:** set it in AI settings, or via env (persisted to
|
|
122
|
+
`~/.prismnote/ai_config.json`):
|
|
123
|
+
```bash
|
|
124
|
+
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
125
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
126
|
+
```
|
|
127
|
+
|
|
80
128
|
---
|
|
81
129
|
|
|
82
130
|
## Features
|
|
83
131
|
|
|
84
132
|
### Notebook & execution
|
|
85
|
-
- **Persistent shared kernel** — variables
|
|
86
|
-
|
|
87
|
-
- **Per-cell interpreters (magics)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- **Rich output** — text, HTML, matplotlib figures (`image/png`), and pandas DataFrames.
|
|
93
|
-
- **Chart switcher** — view any DataFrame as a **Table, Bar, or Line** chart.
|
|
133
|
+
- **Persistent shared kernel** — variables/imports/functions from one cell are
|
|
134
|
+
available in later cells.
|
|
135
|
+
- **Per-cell interpreters (magics):** `%python` (default), `%sql` (in-process DuckDB;
|
|
136
|
+
can query DataFrames from other cells — needs `pip install duckdb`), `%sh` / `!cmd`
|
|
137
|
+
(shell), `%md` (rendered markdown).
|
|
138
|
+
- **Rich output** — text, HTML, matplotlib figures, and pandas DataFrames.
|
|
139
|
+
- **Chart switcher** — view any DataFrame as **Table / Bar / Line**.
|
|
94
140
|
- **Live streamed output** over WebSocket while a cell runs.
|
|
95
|
-
- **Interrupt** a running cell
|
|
96
|
-
- **Dynamic input widgets** — `prism.input / slider / select / checkbox`
|
|
97
|
-
|
|
98
|
-
- Pretty-printing enabled by default via `rich`.
|
|
141
|
+
- **Interrupt** a running cell and **restart** the kernel.
|
|
142
|
+
- **Dynamic input widgets** — `prism.input / slider / select / checkbox` re-run the
|
|
143
|
+
cell when changed.
|
|
99
144
|
|
|
100
145
|
### AI assistance
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
- **
|
|
104
|
-
- **
|
|
105
|
-
- **
|
|
106
|
-
- **Teacher persona** — any model explains the "why" and suggests tips/tricks.
|
|
107
|
-
- **Agent panel** — Plan/Act assistant that can propose and apply cell edits.
|
|
146
|
+
Local models via **Ollama**, or **Claude / OpenAI**.
|
|
147
|
+
- **In-cell AI edit** (diff accept/reject), **Fix with AI** on errors, **Explain**.
|
|
148
|
+
- **Inline autocomplete** (ghost text) when Ollama is connected.
|
|
149
|
+
- **Teacher persona** — explanations of the "why" plus a contextual tip.
|
|
150
|
+
- **Agent panel** — Plan/Act assistant that proposes and applies cell edits.
|
|
108
151
|
|
|
109
152
|
### Errors that help
|
|
110
|
-
- **Natural-language explanations** for common Python errors
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
- **
|
|
117
|
-
with status and run history (Airflow-style).
|
|
118
|
-
- **Airflow** — a stable `run-by-name` trigger plus a **generated, ready-to-use DAG**.
|
|
153
|
+
- **Natural-language explanations** for common Python errors.
|
|
154
|
+
- **In-editor markers** on the offending line/column, with a collapsible traceback.
|
|
155
|
+
|
|
156
|
+
### Workflow
|
|
157
|
+
- **Jobs** — save a whole notebook and run it as a unit: **manual / interval / daily**,
|
|
158
|
+
with status + run history.
|
|
159
|
+
- **Airflow** — a stable `run-by-name` trigger and a **generated DAG**.
|
|
119
160
|
- **Source control** — `init`, `clone`, `commit`, `push`, `pull`, `status` from the UI.
|
|
120
|
-
- **Cloud deploy** —
|
|
121
|
-
`fly.toml
|
|
161
|
+
- **Cloud deploy** — generates `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
|
|
162
|
+
`fly.toml` (review before deploying).
|
|
122
163
|
|
|
123
164
|
### Workspace & UX
|
|
124
|
-
- VS Code-style layout
|
|
125
|
-
- **All panels collapsible**, each with **independent font +/-** controls.
|
|
165
|
+
- VS Code-style layout; **all panels collapsible**, each with **independent font +/-**.
|
|
126
166
|
- **Responsive** — side panels auto-collapse on narrow windows.
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
(works in any browser via a server-side browser).
|
|
167
|
+
- Global **search**, **command palette**, integrated **terminal**, a **Python console**
|
|
168
|
+
(shares the kernel), and a **file browser** that works in any browser.
|
|
130
169
|
- Dark/light themes; `.ipynb` import/export.
|
|
131
170
|
|
|
132
|
-
### Data connectivity
|
|
133
|
-
- DuckDB in-process SQL engine.
|
|
134
|
-
- Connection scaffolding for 8 cloud warehouses (Snowflake, BigQuery, Redshift,
|
|
135
|
-
Azure Synapse, Databricks, Athena, Presto, Trino) — see [CLOUD_WAREHOUSES.md](CLOUD_WAREHOUSES.md).
|
|
136
|
-
|
|
137
171
|
---
|
|
138
172
|
|
|
139
173
|
## Architecture
|
|
@@ -152,76 +186,49 @@ Works with **local models via Ollama** (free, private, offline) or **Claude / Op
|
|
|
152
186
|
└─────────────────┘
|
|
153
187
|
```
|
|
154
188
|
|
|
155
|
-
- **Backend
|
|
156
|
-
|
|
157
|
-
- **
|
|
158
|
-
|
|
159
|
-
restartable, with matplotlib (Agg) and rich preloaded.
|
|
189
|
+
- **Backend** spawns one long-lived `python` process and talks to it over a
|
|
190
|
+
line-framed JSON protocol; outputs are Jupyter-style MIME bundles, streamed live.
|
|
191
|
+
- **Kernel** has a shared namespace, is SIGINT-interruptible and restartable, with
|
|
192
|
+
matplotlib (Agg) and `rich` preloaded.
|
|
160
193
|
|
|
161
194
|
---
|
|
162
195
|
|
|
163
|
-
##
|
|
164
|
-
|
|
165
|
-
### Prerequisites
|
|
166
|
-
- **Rust** (stable) and **Node.js 18+**
|
|
167
|
-
- **Python 3.8+** on your `PATH` with `ipykernel`:
|
|
168
|
-
```bash
|
|
169
|
-
pip install ipykernel pandas matplotlib rich duckdb
|
|
170
|
-
```
|
|
171
|
-
- *(optional)* **Ollama** for local AI: https://ollama.com — then `ollama pull qwen2.5-coder`
|
|
196
|
+
## Keyboard shortcuts
|
|
172
197
|
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
# 1) backend (port 8000)
|
|
176
|
-
cargo run
|
|
198
|
+
All of these are wired:
|
|
177
199
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
200
|
+
| Shortcut | Action |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
203
|
+
| `⌘K` | Global search *(in a focused cell, `⌘K` is AI edit instead)* |
|
|
204
|
+
| `⇧⌘P` | Command palette |
|
|
205
|
+
| `⌘,` | Settings |
|
|
206
|
+
| `⌘⇧↵` | Run all cells |
|
|
207
|
+
| `⇧↵` | Run the focused cell |
|
|
182
208
|
|
|
183
|
-
|
|
184
|
-
- **Local (Ollama)**: start Ollama and pick a model in the AI panel.
|
|
185
|
-
- **Claude/OpenAI**: set in the AI settings, or via env:
|
|
186
|
-
```bash
|
|
187
|
-
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
188
|
-
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
189
|
-
```
|
|
190
|
-
Settings saved in the UI persist to `~/.prismnote/ai_config.json`.
|
|
209
|
+
*(`⌘`/`Ctrl` depending on platform.)*
|
|
191
210
|
|
|
192
211
|
---
|
|
193
212
|
|
|
194
213
|
## Deploy
|
|
195
214
|
|
|
196
|
-
Open **Deploy to Cloud**
|
|
215
|
+
Open **Deploy to Cloud** to copy/download the generated artifacts, then:
|
|
197
216
|
|
|
198
217
|
```bash
|
|
199
|
-
docker compose up -d
|
|
200
|
-
kubectl apply -f k8s.yaml
|
|
201
|
-
fly launch --copy-config --now# Fly.io
|
|
218
|
+
docker compose up -d # Docker
|
|
219
|
+
kubectl apply -f k8s.yaml # Kubernetes
|
|
220
|
+
fly launch --copy-config --now # Fly.io
|
|
202
221
|
```
|
|
203
222
|
|
|
204
223
|
---
|
|
205
224
|
|
|
206
|
-
## Keyboard shortcuts
|
|
207
|
-
|
|
208
|
-
| Shortcut | Action |
|
|
209
|
-
|---|---|
|
|
210
|
-
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
211
|
-
| `⌘K` | Global search |
|
|
212
|
-
| `⇧⌘P` | Command palette |
|
|
213
|
-
| `⌘K` *(in a cell)* | AI edit |
|
|
214
|
-
| `⌘⇧⏎` | Run all cells |
|
|
215
|
-
| `⇧⏎` | Run cell |
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
225
|
## Repository layout
|
|
220
226
|
|
|
221
227
|
```
|
|
222
|
-
crates/server/
|
|
223
|
-
frontend/
|
|
224
|
-
|
|
228
|
+
crates/server/ Rust backend (api, kernel, jobs, db, ws, deploy, git…)
|
|
229
|
+
frontend/ React app (components, hooks, api clients)
|
|
230
|
+
python/ PyPI launcher package (prismnote)
|
|
231
|
+
*.md Architecture & comparison docs
|
|
225
232
|
```
|
|
226
233
|
|
|
227
234
|
Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
@@ -232,8 +239,10 @@ Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
|
232
239
|
|
|
233
240
|
## Roadmap
|
|
234
241
|
|
|
242
|
+
- Functional cloud-warehouse query execution (currently scaffolded/stubbed).
|
|
243
|
+
- Prebuilt release binaries for all platforms (so `pip install` runs out of the box).
|
|
235
244
|
- Distributed compute (Spark) and a catalog/data browser.
|
|
236
|
-
- Real-time collaboration (live cursors/co-editing).
|
|
245
|
+
- Real-time collaboration (live cursors / co-editing).
|
|
237
246
|
- Notebook parameters and multi-notebook job composition.
|
|
238
247
|
|
|
239
248
|
---
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# ◆ PrismNote
|
|
4
|
+
|
|
5
|
+
**A fast, modern, open-source data-science notebook.**
|
|
6
|
+
Rust engine · React UI · local-first · AI-native.
|
|
7
|
+
|
|
8
|
+
**License:** MIT · **Status:** Beta (v0.4) · **PyPI:** [`prismnote`](https://pypi.org/project/prismnote/)
|
|
9
|
+
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
PrismNote is a local-first alternative to Jupyter, Zeppelin, and Databricks notebooks.
|
|
17
|
+
A **Rust + Axum** backend drives a **persistent Python kernel**, and a modern,
|
|
18
|
+
**VS Code-style React** UI gives you Python + SQL, rich output and live charts, local
|
|
19
|
+
AI assistance, scheduled jobs, git, and generated cloud-deploy files — all on your machine.
|
|
20
|
+
|
|
21
|
+
- **Local-first & private** — runs locally; local AI via Ollama, no account required.
|
|
22
|
+
- **Jupyter-compatible** — native `.ipynb` import/export.
|
|
23
|
+
- **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
24
|
+
|
|
25
|
+
> **Status note:** PrismNote is **beta**. The notebook, kernel, AI, jobs, git, and
|
|
26
|
+
> charts are functional. Cloud-warehouse connectors are **scaffolding** (query results
|
|
27
|
+
> are currently stubbed), and deployment files are **generated templates** you review
|
|
28
|
+
> before shipping. See the [roadmap](#roadmap).
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Install & run
|
|
33
|
+
|
|
34
|
+
### From source (recommended today)
|
|
35
|
+
Requires **Rust** (stable), **Node 18+**, and **Python 3.8+** on `PATH`:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Python runtime deps for the kernel (ipykernel is required; the rest enable
|
|
39
|
+
# rich output, %sql, and charts)
|
|
40
|
+
pip install ipykernel pandas matplotlib rich duckdb
|
|
41
|
+
|
|
42
|
+
# 1) backend — http://localhost:8000
|
|
43
|
+
cargo run
|
|
44
|
+
|
|
45
|
+
# 2) frontend — http://localhost:5173 (proxies /api and /ws to the backend)
|
|
46
|
+
cd frontend && npm install && npm run dev
|
|
47
|
+
```
|
|
48
|
+
Open http://localhost:5173.
|
|
49
|
+
|
|
50
|
+
### From PyPI
|
|
51
|
+
```bash
|
|
52
|
+
pip install prismnote
|
|
53
|
+
prismnote
|
|
54
|
+
```
|
|
55
|
+
The PyPI package is a thin launcher: on first run it downloads the prebuilt server
|
|
56
|
+
binary for your platform from the matching **GitHub Release** (`vX.Y.Z`). If a release
|
|
57
|
+
binary isn't published for your platform/version yet, use the from-source steps above.
|
|
58
|
+
(`pip install prismnote` succeeds regardless; only the prebuilt launch depends on a release.)
|
|
59
|
+
|
|
60
|
+
### Enable AI (optional)
|
|
61
|
+
- **Local, free, private — Ollama:** install from https://ollama.com, then
|
|
62
|
+
`ollama pull qwen2.5-coder`. The UI talks to Ollama from the browser, so allow the
|
|
63
|
+
dev origin once:
|
|
64
|
+
```bash
|
|
65
|
+
OLLAMA_ORIGINS=http://localhost:5173 ollama serve
|
|
66
|
+
```
|
|
67
|
+
- **Claude / OpenAI:** set it in AI settings, or via env (persisted to
|
|
68
|
+
`~/.prismnote/ai_config.json`):
|
|
69
|
+
```bash
|
|
70
|
+
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
71
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Features
|
|
77
|
+
|
|
78
|
+
### Notebook & execution
|
|
79
|
+
- **Persistent shared kernel** — variables/imports/functions from one cell are
|
|
80
|
+
available in later cells.
|
|
81
|
+
- **Per-cell interpreters (magics):** `%python` (default), `%sql` (in-process DuckDB;
|
|
82
|
+
can query DataFrames from other cells — needs `pip install duckdb`), `%sh` / `!cmd`
|
|
83
|
+
(shell), `%md` (rendered markdown).
|
|
84
|
+
- **Rich output** — text, HTML, matplotlib figures, and pandas DataFrames.
|
|
85
|
+
- **Chart switcher** — view any DataFrame as **Table / Bar / Line**.
|
|
86
|
+
- **Live streamed output** over WebSocket while a cell runs.
|
|
87
|
+
- **Interrupt** a running cell and **restart** the kernel.
|
|
88
|
+
- **Dynamic input widgets** — `prism.input / slider / select / checkbox` re-run the
|
|
89
|
+
cell when changed.
|
|
90
|
+
|
|
91
|
+
### AI assistance
|
|
92
|
+
Local models via **Ollama**, or **Claude / OpenAI**.
|
|
93
|
+
- **In-cell AI edit** (diff accept/reject), **Fix with AI** on errors, **Explain**.
|
|
94
|
+
- **Inline autocomplete** (ghost text) when Ollama is connected.
|
|
95
|
+
- **Teacher persona** — explanations of the "why" plus a contextual tip.
|
|
96
|
+
- **Agent panel** — Plan/Act assistant that proposes and applies cell edits.
|
|
97
|
+
|
|
98
|
+
### Errors that help
|
|
99
|
+
- **Natural-language explanations** for common Python errors.
|
|
100
|
+
- **In-editor markers** on the offending line/column, with a collapsible traceback.
|
|
101
|
+
|
|
102
|
+
### Workflow
|
|
103
|
+
- **Jobs** — save a whole notebook and run it as a unit: **manual / interval / daily**,
|
|
104
|
+
with status + run history.
|
|
105
|
+
- **Airflow** — a stable `run-by-name` trigger and a **generated DAG**.
|
|
106
|
+
- **Source control** — `init`, `clone`, `commit`, `push`, `pull`, `status` from the UI.
|
|
107
|
+
- **Cloud deploy** — generates `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
|
|
108
|
+
`fly.toml` (review before deploying).
|
|
109
|
+
|
|
110
|
+
### Workspace & UX
|
|
111
|
+
- VS Code-style layout; **all panels collapsible**, each with **independent font +/-**.
|
|
112
|
+
- **Responsive** — side panels auto-collapse on narrow windows.
|
|
113
|
+
- Global **search**, **command palette**, integrated **terminal**, a **Python console**
|
|
114
|
+
(shares the kernel), and a **file browser** that works in any browser.
|
|
115
|
+
- Dark/light themes; `.ipynb` import/export.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
┌──────────────────────────────┐ ┌─────────────────────────────┐
|
|
123
|
+
│ React + TypeScript (Vite) │ HTTP │ Rust backend (Axum) │
|
|
124
|
+
│ Monaco · Tailwind · zustand │ ─────▶ │ REST API + WebSocket │
|
|
125
|
+
│ cells · panels · AI · jobs │ ◀───── │ routing, jobs, git, deploy │
|
|
126
|
+
└──────────────────────────────┘ WS └──────────────┬──────────────┘
|
|
127
|
+
│ stdin/stdout (JSON)
|
|
128
|
+
┌───────▼────────┐
|
|
129
|
+
│ Persistent │
|
|
130
|
+
│ Python kernel │
|
|
131
|
+
│ (shared globals)│
|
|
132
|
+
└─────────────────┘
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- **Backend** spawns one long-lived `python` process and talks to it over a
|
|
136
|
+
line-framed JSON protocol; outputs are Jupyter-style MIME bundles, streamed live.
|
|
137
|
+
- **Kernel** has a shared namespace, is SIGINT-interruptible and restartable, with
|
|
138
|
+
matplotlib (Agg) and `rich` preloaded.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Keyboard shortcuts
|
|
143
|
+
|
|
144
|
+
All of these are wired:
|
|
145
|
+
|
|
146
|
+
| Shortcut | Action |
|
|
147
|
+
|---|---|
|
|
148
|
+
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
149
|
+
| `⌘K` | Global search *(in a focused cell, `⌘K` is AI edit instead)* |
|
|
150
|
+
| `⇧⌘P` | Command palette |
|
|
151
|
+
| `⌘,` | Settings |
|
|
152
|
+
| `⌘⇧↵` | Run all cells |
|
|
153
|
+
| `⇧↵` | Run the focused cell |
|
|
154
|
+
|
|
155
|
+
*(`⌘`/`Ctrl` depending on platform.)*
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Deploy
|
|
160
|
+
|
|
161
|
+
Open **Deploy to Cloud** to copy/download the generated artifacts, then:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
docker compose up -d # Docker
|
|
165
|
+
kubectl apply -f k8s.yaml # Kubernetes
|
|
166
|
+
fly launch --copy-config --now # Fly.io
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Repository layout
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
crates/server/ Rust backend (api, kernel, jobs, db, ws, deploy, git…)
|
|
175
|
+
frontend/ React app (components, hooks, api clients)
|
|
176
|
+
python/ PyPI launcher package (prismnote)
|
|
177
|
+
*.md Architecture & comparison docs
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
181
|
+
[DATABRICKS_COMPARISON.md](DATABRICKS_COMPARISON.md) ·
|
|
182
|
+
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md)
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Roadmap
|
|
187
|
+
|
|
188
|
+
- Functional cloud-warehouse query execution (currently scaffolded/stubbed).
|
|
189
|
+
- Prebuilt release binaries for all platforms (so `pip install` runs out of the box).
|
|
190
|
+
- Distributed compute (Spark) and a catalog/data browser.
|
|
191
|
+
- Real-time collaboration (live cursors / co-editing).
|
|
192
|
+
- Notebook parameters and multi-notebook job composition.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -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.1"
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prismnote
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Modern, open-source Jupyter-compatible data science notebook with Rust performance
|
|
5
5
|
Author-email: Georgi Mammen Mullassery <mullassery@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -59,7 +59,7 @@ Dynamic: license-file
|
|
|
59
59
|
**A fast, modern, open-source data-science notebook.**
|
|
60
60
|
Rust engine · React UI · local-first · AI-native.
|
|
61
61
|
|
|
62
|
-
**License:** MIT · **Status:** Beta (v0.4)
|
|
62
|
+
**License:** MIT · **Status:** Beta (v0.4) · **PyPI:** [`prismnote`](https://pypi.org/project/prismnote/)
|
|
63
63
|
|
|
64
64
|
</div>
|
|
65
65
|
|
|
@@ -68,72 +68,106 @@ Rust engine · React UI · local-first · AI-native.
|
|
|
68
68
|
## Overview
|
|
69
69
|
|
|
70
70
|
PrismNote is a local-first alternative to Jupyter, Zeppelin, and Databricks notebooks.
|
|
71
|
-
|
|
72
|
-
**VS Code-style React**
|
|
73
|
-
|
|
74
|
-
the cloud — all from one app that runs entirely on your machine.
|
|
71
|
+
A **Rust + Axum** backend drives a **persistent Python kernel**, and a modern,
|
|
72
|
+
**VS Code-style React** UI gives you Python + SQL, rich output and live charts, local
|
|
73
|
+
AI assistance, scheduled jobs, git, and generated cloud-deploy files — all on your machine.
|
|
75
74
|
|
|
76
|
-
- **Local-first & private** — runs
|
|
77
|
-
- **Jupyter-compatible** — native `.ipynb`
|
|
75
|
+
- **Local-first & private** — runs locally; local AI via Ollama, no account required.
|
|
76
|
+
- **Jupyter-compatible** — native `.ipynb` import/export.
|
|
78
77
|
- **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
79
78
|
|
|
79
|
+
> **Status note:** PrismNote is **beta**. The notebook, kernel, AI, jobs, git, and
|
|
80
|
+
> charts are functional. Cloud-warehouse connectors are **scaffolding** (query results
|
|
81
|
+
> are currently stubbed), and deployment files are **generated templates** you review
|
|
82
|
+
> before shipping. See the [roadmap](#roadmap).
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Install & run
|
|
87
|
+
|
|
88
|
+
### From source (recommended today)
|
|
89
|
+
Requires **Rust** (stable), **Node 18+**, and **Python 3.8+** on `PATH`:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Python runtime deps for the kernel (ipykernel is required; the rest enable
|
|
93
|
+
# rich output, %sql, and charts)
|
|
94
|
+
pip install ipykernel pandas matplotlib rich duckdb
|
|
95
|
+
|
|
96
|
+
# 1) backend — http://localhost:8000
|
|
97
|
+
cargo run
|
|
98
|
+
|
|
99
|
+
# 2) frontend — http://localhost:5173 (proxies /api and /ws to the backend)
|
|
100
|
+
cd frontend && npm install && npm run dev
|
|
101
|
+
```
|
|
102
|
+
Open http://localhost:5173.
|
|
103
|
+
|
|
104
|
+
### From PyPI
|
|
105
|
+
```bash
|
|
106
|
+
pip install prismnote
|
|
107
|
+
prismnote
|
|
108
|
+
```
|
|
109
|
+
The PyPI package is a thin launcher: on first run it downloads the prebuilt server
|
|
110
|
+
binary for your platform from the matching **GitHub Release** (`vX.Y.Z`). If a release
|
|
111
|
+
binary isn't published for your platform/version yet, use the from-source steps above.
|
|
112
|
+
(`pip install prismnote` succeeds regardless; only the prebuilt launch depends on a release.)
|
|
113
|
+
|
|
114
|
+
### Enable AI (optional)
|
|
115
|
+
- **Local, free, private — Ollama:** install from https://ollama.com, then
|
|
116
|
+
`ollama pull qwen2.5-coder`. The UI talks to Ollama from the browser, so allow the
|
|
117
|
+
dev origin once:
|
|
118
|
+
```bash
|
|
119
|
+
OLLAMA_ORIGINS=http://localhost:5173 ollama serve
|
|
120
|
+
```
|
|
121
|
+
- **Claude / OpenAI:** set it in AI settings, or via env (persisted to
|
|
122
|
+
`~/.prismnote/ai_config.json`):
|
|
123
|
+
```bash
|
|
124
|
+
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
125
|
+
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
126
|
+
```
|
|
127
|
+
|
|
80
128
|
---
|
|
81
129
|
|
|
82
130
|
## Features
|
|
83
131
|
|
|
84
132
|
### Notebook & execution
|
|
85
|
-
- **Persistent shared kernel** — variables
|
|
86
|
-
|
|
87
|
-
- **Per-cell interpreters (magics)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- **Rich output** — text, HTML, matplotlib figures (`image/png`), and pandas DataFrames.
|
|
93
|
-
- **Chart switcher** — view any DataFrame as a **Table, Bar, or Line** chart.
|
|
133
|
+
- **Persistent shared kernel** — variables/imports/functions from one cell are
|
|
134
|
+
available in later cells.
|
|
135
|
+
- **Per-cell interpreters (magics):** `%python` (default), `%sql` (in-process DuckDB;
|
|
136
|
+
can query DataFrames from other cells — needs `pip install duckdb`), `%sh` / `!cmd`
|
|
137
|
+
(shell), `%md` (rendered markdown).
|
|
138
|
+
- **Rich output** — text, HTML, matplotlib figures, and pandas DataFrames.
|
|
139
|
+
- **Chart switcher** — view any DataFrame as **Table / Bar / Line**.
|
|
94
140
|
- **Live streamed output** over WebSocket while a cell runs.
|
|
95
|
-
- **Interrupt** a running cell
|
|
96
|
-
- **Dynamic input widgets** — `prism.input / slider / select / checkbox`
|
|
97
|
-
|
|
98
|
-
- Pretty-printing enabled by default via `rich`.
|
|
141
|
+
- **Interrupt** a running cell and **restart** the kernel.
|
|
142
|
+
- **Dynamic input widgets** — `prism.input / slider / select / checkbox` re-run the
|
|
143
|
+
cell when changed.
|
|
99
144
|
|
|
100
145
|
### AI assistance
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
- **
|
|
104
|
-
- **
|
|
105
|
-
- **
|
|
106
|
-
- **Teacher persona** — any model explains the "why" and suggests tips/tricks.
|
|
107
|
-
- **Agent panel** — Plan/Act assistant that can propose and apply cell edits.
|
|
146
|
+
Local models via **Ollama**, or **Claude / OpenAI**.
|
|
147
|
+
- **In-cell AI edit** (diff accept/reject), **Fix with AI** on errors, **Explain**.
|
|
148
|
+
- **Inline autocomplete** (ghost text) when Ollama is connected.
|
|
149
|
+
- **Teacher persona** — explanations of the "why" plus a contextual tip.
|
|
150
|
+
- **Agent panel** — Plan/Act assistant that proposes and applies cell edits.
|
|
108
151
|
|
|
109
152
|
### Errors that help
|
|
110
|
-
- **Natural-language explanations** for common Python errors
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
- **
|
|
117
|
-
with status and run history (Airflow-style).
|
|
118
|
-
- **Airflow** — a stable `run-by-name` trigger plus a **generated, ready-to-use DAG**.
|
|
153
|
+
- **Natural-language explanations** for common Python errors.
|
|
154
|
+
- **In-editor markers** on the offending line/column, with a collapsible traceback.
|
|
155
|
+
|
|
156
|
+
### Workflow
|
|
157
|
+
- **Jobs** — save a whole notebook and run it as a unit: **manual / interval / daily**,
|
|
158
|
+
with status + run history.
|
|
159
|
+
- **Airflow** — a stable `run-by-name` trigger and a **generated DAG**.
|
|
119
160
|
- **Source control** — `init`, `clone`, `commit`, `push`, `pull`, `status` from the UI.
|
|
120
|
-
- **Cloud deploy** —
|
|
121
|
-
`fly.toml
|
|
161
|
+
- **Cloud deploy** — generates `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
|
|
162
|
+
`fly.toml` (review before deploying).
|
|
122
163
|
|
|
123
164
|
### Workspace & UX
|
|
124
|
-
- VS Code-style layout
|
|
125
|
-
- **All panels collapsible**, each with **independent font +/-** controls.
|
|
165
|
+
- VS Code-style layout; **all panels collapsible**, each with **independent font +/-**.
|
|
126
166
|
- **Responsive** — side panels auto-collapse on narrow windows.
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
(works in any browser via a server-side browser).
|
|
167
|
+
- Global **search**, **command palette**, integrated **terminal**, a **Python console**
|
|
168
|
+
(shares the kernel), and a **file browser** that works in any browser.
|
|
130
169
|
- Dark/light themes; `.ipynb` import/export.
|
|
131
170
|
|
|
132
|
-
### Data connectivity
|
|
133
|
-
- DuckDB in-process SQL engine.
|
|
134
|
-
- Connection scaffolding for 8 cloud warehouses (Snowflake, BigQuery, Redshift,
|
|
135
|
-
Azure Synapse, Databricks, Athena, Presto, Trino) — see [CLOUD_WAREHOUSES.md](CLOUD_WAREHOUSES.md).
|
|
136
|
-
|
|
137
171
|
---
|
|
138
172
|
|
|
139
173
|
## Architecture
|
|
@@ -152,76 +186,49 @@ Works with **local models via Ollama** (free, private, offline) or **Claude / Op
|
|
|
152
186
|
└─────────────────┘
|
|
153
187
|
```
|
|
154
188
|
|
|
155
|
-
- **Backend
|
|
156
|
-
|
|
157
|
-
- **
|
|
158
|
-
|
|
159
|
-
restartable, with matplotlib (Agg) and rich preloaded.
|
|
189
|
+
- **Backend** spawns one long-lived `python` process and talks to it over a
|
|
190
|
+
line-framed JSON protocol; outputs are Jupyter-style MIME bundles, streamed live.
|
|
191
|
+
- **Kernel** has a shared namespace, is SIGINT-interruptible and restartable, with
|
|
192
|
+
matplotlib (Agg) and `rich` preloaded.
|
|
160
193
|
|
|
161
194
|
---
|
|
162
195
|
|
|
163
|
-
##
|
|
164
|
-
|
|
165
|
-
### Prerequisites
|
|
166
|
-
- **Rust** (stable) and **Node.js 18+**
|
|
167
|
-
- **Python 3.8+** on your `PATH` with `ipykernel`:
|
|
168
|
-
```bash
|
|
169
|
-
pip install ipykernel pandas matplotlib rich duckdb
|
|
170
|
-
```
|
|
171
|
-
- *(optional)* **Ollama** for local AI: https://ollama.com — then `ollama pull qwen2.5-coder`
|
|
196
|
+
## Keyboard shortcuts
|
|
172
197
|
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
# 1) backend (port 8000)
|
|
176
|
-
cargo run
|
|
198
|
+
All of these are wired:
|
|
177
199
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
200
|
+
| Shortcut | Action |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
203
|
+
| `⌘K` | Global search *(in a focused cell, `⌘K` is AI edit instead)* |
|
|
204
|
+
| `⇧⌘P` | Command palette |
|
|
205
|
+
| `⌘,` | Settings |
|
|
206
|
+
| `⌘⇧↵` | Run all cells |
|
|
207
|
+
| `⇧↵` | Run the focused cell |
|
|
182
208
|
|
|
183
|
-
|
|
184
|
-
- **Local (Ollama)**: start Ollama and pick a model in the AI panel.
|
|
185
|
-
- **Claude/OpenAI**: set in the AI settings, or via env:
|
|
186
|
-
```bash
|
|
187
|
-
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
188
|
-
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
189
|
-
```
|
|
190
|
-
Settings saved in the UI persist to `~/.prismnote/ai_config.json`.
|
|
209
|
+
*(`⌘`/`Ctrl` depending on platform.)*
|
|
191
210
|
|
|
192
211
|
---
|
|
193
212
|
|
|
194
213
|
## Deploy
|
|
195
214
|
|
|
196
|
-
Open **Deploy to Cloud**
|
|
215
|
+
Open **Deploy to Cloud** to copy/download the generated artifacts, then:
|
|
197
216
|
|
|
198
217
|
```bash
|
|
199
|
-
docker compose up -d
|
|
200
|
-
kubectl apply -f k8s.yaml
|
|
201
|
-
fly launch --copy-config --now# Fly.io
|
|
218
|
+
docker compose up -d # Docker
|
|
219
|
+
kubectl apply -f k8s.yaml # Kubernetes
|
|
220
|
+
fly launch --copy-config --now # Fly.io
|
|
202
221
|
```
|
|
203
222
|
|
|
204
223
|
---
|
|
205
224
|
|
|
206
|
-
## Keyboard shortcuts
|
|
207
|
-
|
|
208
|
-
| Shortcut | Action |
|
|
209
|
-
|---|---|
|
|
210
|
-
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
211
|
-
| `⌘K` | Global search |
|
|
212
|
-
| `⇧⌘P` | Command palette |
|
|
213
|
-
| `⌘K` *(in a cell)* | AI edit |
|
|
214
|
-
| `⌘⇧⏎` | Run all cells |
|
|
215
|
-
| `⇧⏎` | Run cell |
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
225
|
## Repository layout
|
|
220
226
|
|
|
221
227
|
```
|
|
222
|
-
crates/server/
|
|
223
|
-
frontend/
|
|
224
|
-
|
|
228
|
+
crates/server/ Rust backend (api, kernel, jobs, db, ws, deploy, git…)
|
|
229
|
+
frontend/ React app (components, hooks, api clients)
|
|
230
|
+
python/ PyPI launcher package (prismnote)
|
|
231
|
+
*.md Architecture & comparison docs
|
|
225
232
|
```
|
|
226
233
|
|
|
227
234
|
Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
@@ -232,8 +239,10 @@ Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
|
232
239
|
|
|
233
240
|
## Roadmap
|
|
234
241
|
|
|
242
|
+
- Functional cloud-warehouse query execution (currently scaffolded/stubbed).
|
|
243
|
+
- Prebuilt release binaries for all platforms (so `pip install` runs out of the box).
|
|
235
244
|
- Distributed compute (Spark) and a catalog/data browser.
|
|
236
|
-
- Real-time collaboration (live cursors/co-editing).
|
|
245
|
+
- Real-time collaboration (live cursors / co-editing).
|
|
237
246
|
- Notebook parameters and multi-notebook job composition.
|
|
238
247
|
|
|
239
248
|
---
|
prismnote-0.4.0/README.md
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
# ◆ PrismNote
|
|
4
|
-
|
|
5
|
-
**A fast, modern, open-source data-science notebook.**
|
|
6
|
-
Rust engine · React UI · local-first · AI-native.
|
|
7
|
-
|
|
8
|
-
**License:** MIT · **Status:** Beta (v0.4)
|
|
9
|
-
|
|
10
|
-
</div>
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Overview
|
|
15
|
-
|
|
16
|
-
PrismNote is a local-first alternative to Jupyter, Zeppelin, and Databricks notebooks.
|
|
17
|
-
It pairs a **Rust + Axum** backend and a **persistent Python kernel** with a modern,
|
|
18
|
-
**VS Code-style React** interface. Write Python and SQL, get rich output and live
|
|
19
|
-
charts, ask a local AI for help, schedule notebooks as jobs, manage git, and ship to
|
|
20
|
-
the cloud — all from one app that runs entirely on your machine.
|
|
21
|
-
|
|
22
|
-
- **Local-first & private** — runs on your machine; local AI via Ollama, no account required.
|
|
23
|
-
- **Jupyter-compatible** — native `.ipynb` format.
|
|
24
|
-
- **Batteries included** — kernel, SQL, charts, AI, jobs, git, deploy, search, terminal.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Features
|
|
29
|
-
|
|
30
|
-
### Notebook & execution
|
|
31
|
-
- **Persistent shared kernel** — variables, imports, and functions defined in one cell
|
|
32
|
-
are available in every later cell (true notebook semantics).
|
|
33
|
-
- **Per-cell interpreters (magics)**:
|
|
34
|
-
- `%python` (default) — runs in the shared kernel.
|
|
35
|
-
- `%sql` — in-process **DuckDB**; can query pandas DataFrames defined in other cells.
|
|
36
|
-
- `%sh` / `%bash` / `!cmd` — shell commands.
|
|
37
|
-
- `%md` / `%markdown` — rendered markdown.
|
|
38
|
-
- **Rich output** — text, HTML, matplotlib figures (`image/png`), and pandas DataFrames.
|
|
39
|
-
- **Chart switcher** — view any DataFrame as a **Table, Bar, or Line** chart.
|
|
40
|
-
- **Live streamed output** over WebSocket while a cell runs.
|
|
41
|
-
- **Interrupt** a running cell (Stop) and **restart** the kernel from the toolbar/menu.
|
|
42
|
-
- **Dynamic input widgets** — `prism.input / slider / select / checkbox` render controls
|
|
43
|
-
that re-run the cell when changed (Databricks `dbutils.widgets`-style).
|
|
44
|
-
- Pretty-printing enabled by default via `rich`.
|
|
45
|
-
|
|
46
|
-
### AI assistance
|
|
47
|
-
Works with **local models via Ollama** (free, private, offline) or **Claude / OpenAI**.
|
|
48
|
-
- **⌘K in-cell edit** — describe a change, review a diff, accept or reject.
|
|
49
|
-
- **Fix with AI** — one click on an errored cell.
|
|
50
|
-
- **Explain** — a teaching-oriented explanation with a contextual tip.
|
|
51
|
-
- **Inline autocomplete** — ghost-text completions when Ollama is connected.
|
|
52
|
-
- **Teacher persona** — any model explains the "why" and suggests tips/tricks.
|
|
53
|
-
- **Agent panel** — Plan/Act assistant that can propose and apply cell edits.
|
|
54
|
-
|
|
55
|
-
### Errors that help
|
|
56
|
-
- **Natural-language explanations** for common Python errors (NameError, KeyError,
|
|
57
|
-
ModuleNotFoundError, TypeError, ZeroDivisionError, SyntaxError, …).
|
|
58
|
-
- **In-editor markers** highlighting the offending **line and column**.
|
|
59
|
-
- Collapsible full traceback when you want the details.
|
|
60
|
-
|
|
61
|
-
### Workflow: Jobs, Airflow, Git, Deploy
|
|
62
|
-
- **Jobs** — save a whole notebook and run it as a unit, **manual / interval / daily**,
|
|
63
|
-
with status and run history (Airflow-style).
|
|
64
|
-
- **Airflow** — a stable `run-by-name` trigger plus a **generated, ready-to-use DAG**.
|
|
65
|
-
- **Source control** — `init`, `clone`, `commit`, `push`, `pull`, `status` from the UI.
|
|
66
|
-
- **Cloud deploy** — generated `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
|
|
67
|
-
`fly.toml`, each with its one-line deploy command.
|
|
68
|
-
|
|
69
|
-
### Workspace & UX
|
|
70
|
-
- VS Code-style layout: activity rail, collapsible panels, status bar.
|
|
71
|
-
- **All panels collapsible**, each with **independent font +/-** controls.
|
|
72
|
-
- **Responsive** — side panels auto-collapse on narrow windows.
|
|
73
|
-
- **Global search (⌘K)**, **command palette (⇧⌘P)**, working top menus.
|
|
74
|
-
- Integrated **Terminal**, a **Python Console** (shares the kernel), and a **file browser**
|
|
75
|
-
(works in any browser via a server-side browser).
|
|
76
|
-
- Dark/light themes; `.ipynb` import/export.
|
|
77
|
-
|
|
78
|
-
### Data connectivity
|
|
79
|
-
- DuckDB in-process SQL engine.
|
|
80
|
-
- Connection scaffolding for 8 cloud warehouses (Snowflake, BigQuery, Redshift,
|
|
81
|
-
Azure Synapse, Databricks, Athena, Presto, Trino) — see [CLOUD_WAREHOUSES.md](CLOUD_WAREHOUSES.md).
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Architecture
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
┌──────────────────────────────┐ ┌─────────────────────────────┐
|
|
89
|
-
│ React + TypeScript (Vite) │ HTTP │ Rust backend (Axum) │
|
|
90
|
-
│ Monaco · Tailwind · zustand │ ─────▶ │ REST API + WebSocket │
|
|
91
|
-
│ cells · panels · AI · jobs │ ◀───── │ routing, jobs, git, deploy │
|
|
92
|
-
└──────────────────────────────┘ WS └──────────────┬──────────────┘
|
|
93
|
-
│ stdin/stdout (JSON)
|
|
94
|
-
┌───────▼────────┐
|
|
95
|
-
│ Persistent │
|
|
96
|
-
│ Python kernel │
|
|
97
|
-
│ (shared globals)│
|
|
98
|
-
└─────────────────┘
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
- **Backend**: Rust (Axum + Tokio). Spawns one long-lived Python process and talks to
|
|
102
|
-
it over a line-framed JSON protocol; outputs are Jupyter-style MIME bundles.
|
|
103
|
-
- **Frontend**: React 18 + TypeScript + Vite, Monaco editor, Tailwind CSS.
|
|
104
|
-
- **Kernel**: a single `python` process with a shared namespace; SIGINT-interruptible,
|
|
105
|
-
restartable, with matplotlib (Agg) and rich preloaded.
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## Getting started
|
|
110
|
-
|
|
111
|
-
### Prerequisites
|
|
112
|
-
- **Rust** (stable) and **Node.js 18+**
|
|
113
|
-
- **Python 3.8+** on your `PATH` with `ipykernel`:
|
|
114
|
-
```bash
|
|
115
|
-
pip install ipykernel pandas matplotlib rich duckdb
|
|
116
|
-
```
|
|
117
|
-
- *(optional)* **Ollama** for local AI: https://ollama.com — then `ollama pull qwen2.5-coder`
|
|
118
|
-
|
|
119
|
-
### Run in development
|
|
120
|
-
```bash
|
|
121
|
-
# 1) backend (port 8000)
|
|
122
|
-
cargo run
|
|
123
|
-
|
|
124
|
-
# 2) frontend (port 5173, proxies /api and /ws to the backend)
|
|
125
|
-
cd frontend && npm install && npm run dev
|
|
126
|
-
```
|
|
127
|
-
Open http://localhost:5173.
|
|
128
|
-
|
|
129
|
-
### Configure AI (optional)
|
|
130
|
-
- **Local (Ollama)**: start Ollama and pick a model in the AI panel.
|
|
131
|
-
- **Claude/OpenAI**: set in the AI settings, or via env:
|
|
132
|
-
```bash
|
|
133
|
-
export PRISMNOTE_AI_PROVIDER=claude # or openai / ollama
|
|
134
|
-
export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY
|
|
135
|
-
```
|
|
136
|
-
Settings saved in the UI persist to `~/.prismnote/ai_config.json`.
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Deploy
|
|
141
|
-
|
|
142
|
-
Open **Deploy to Cloud** (rocket icon) to copy/download ready-to-use artifacts:
|
|
143
|
-
|
|
144
|
-
```bash
|
|
145
|
-
docker compose up -d # Docker
|
|
146
|
-
kubectl apply -f k8s.yaml # Kubernetes
|
|
147
|
-
fly launch --copy-config --now# Fly.io
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Keyboard shortcuts
|
|
153
|
-
|
|
154
|
-
| Shortcut | Action |
|
|
155
|
-
|---|---|
|
|
156
|
-
| `⌘N` / `⌘O` / `⌘S` | New / Open / Save notebook |
|
|
157
|
-
| `⌘K` | Global search |
|
|
158
|
-
| `⇧⌘P` | Command palette |
|
|
159
|
-
| `⌘K` *(in a cell)* | AI edit |
|
|
160
|
-
| `⌘⇧⏎` | Run all cells |
|
|
161
|
-
| `⇧⏎` | Run cell |
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## Repository layout
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
crates/server/ Rust backend (api, kernel, jobs, db, ws, …)
|
|
169
|
-
frontend/ React app (components, hooks, api clients)
|
|
170
|
-
*.md Architecture & comparison docs
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Comparisons: [ZEPPELIN_COMPARISON.md](ZEPPELIN_COMPARISON.md) ·
|
|
174
|
-
[DATABRICKS_COMPARISON.md](DATABRICKS_COMPARISON.md) ·
|
|
175
|
-
[NOTEBOOK_COMPARISON_MATRIX.md](NOTEBOOK_COMPARISON_MATRIX.md)
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Roadmap
|
|
180
|
-
|
|
181
|
-
- Distributed compute (Spark) and a catalog/data browser.
|
|
182
|
-
- Real-time collaboration (live cursors/co-editing).
|
|
183
|
-
- Notebook parameters and multi-notebook job composition.
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## License
|
|
188
|
-
|
|
189
|
-
MIT — see [LICENSE](LICENSE).
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|