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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prismnote
3
- Version: 0.4.0
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
- It pairs a **Rust + Axum** backend and a **persistent Python kernel** with a modern,
72
- **VS Code-style React** interface. Write Python and SQL, get rich output and live
73
- charts, ask a local AI for help, schedule notebooks as jobs, manage git, and ship to
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 on your machine; local AI via Ollama, no account required.
77
- - **Jupyter-compatible** — native `.ipynb` format.
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, imports, and functions defined in one cell
86
- are available in every later cell (true notebook semantics).
87
- - **Per-cell interpreters (magics)**:
88
- - `%python` (default)runs in the shared kernel.
89
- - `%sql` in-process **DuckDB**; can query pandas DataFrames defined in other cells.
90
- - `%sh` / `%bash` / `!cmd` shell commands.
91
- - `%md` / `%markdown` rendered markdown.
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 (Stop) and **restart** the kernel from the toolbar/menu.
96
- - **Dynamic input widgets** — `prism.input / slider / select / checkbox` render controls
97
- that re-run the cell when changed (Databricks `dbutils.widgets`-style).
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
- Works with **local models via Ollama** (free, private, offline) or **Claude / OpenAI**.
102
- - **⌘K in-cell edit** describe a change, review a diff, accept or reject.
103
- - **Fix with AI** one click on an errored cell.
104
- - **Explain** — a teaching-oriented explanation with a contextual tip.
105
- - **Inline autocomplete** — ghost-text completions when Ollama is connected.
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 (NameError, KeyError,
111
- ModuleNotFoundError, TypeError, ZeroDivisionError, SyntaxError, …).
112
- - **In-editor markers** highlighting the offending **line and column**.
113
- - Collapsible full traceback when you want the details.
114
-
115
- ### Workflow: Jobs, Airflow, Git, Deploy
116
- - **Jobs** — save a whole notebook and run it as a unit, **manual / interval / daily**,
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** — generated `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
121
- `fly.toml`, each with its one-line deploy command.
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: activity rail, collapsible panels, status bar.
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
- - **Global search (⌘K)**, **command palette (⇧⌘P)**, working top menus.
128
- - Integrated **Terminal**, a **Python Console** (shares the kernel), and a **file browser**
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**: Rust (Axum + Tokio). Spawns one long-lived Python process and talks to
156
- it over a line-framed JSON protocol; outputs are Jupyter-style MIME bundles.
157
- - **Frontend**: React 18 + TypeScript + Vite, Monaco editor, Tailwind CSS.
158
- - **Kernel**: a single `python` process with a shared namespace; SIGINT-interruptible,
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
- ## Getting started
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
- ### Run in development
174
- ```bash
175
- # 1) backend (port 8000)
176
- cargo run
198
+ All of these are wired:
177
199
 
178
- # 2) frontend (port 5173, proxies /api and /ws to the backend)
179
- cd frontend && npm install && npm run dev
180
- ```
181
- Open http://localhost:5173.
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
- ### Configure AI (optional)
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** (rocket icon) to copy/download ready-to-use artifacts:
215
+ Open **Deploy to Cloud** to copy/download the generated artifacts, then:
197
216
 
198
217
  ```bash
199
- docker compose up -d # Docker
200
- kubectl apply -f k8s.yaml # Kubernetes
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/ Rust backend (api, kernel, jobs, db, ws, …)
223
- frontend/ React app (components, hooks, api clients)
224
- *.md Architecture & comparison docs
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.0"
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,3 +1,3 @@
1
1
  """PrismNote - A modern data science notebook."""
2
2
 
3
- __version__ = "0.4.0"
3
+ __version__ = "0.4.1"
@@ -15,7 +15,7 @@ import platform
15
15
  import urllib.request
16
16
  from pathlib import Path
17
17
 
18
- __version__ = "0.4.0"
18
+ __version__ = "0.4.1"
19
19
 
20
20
  GITHUB_REPO = "Mullassery/prismnote"
21
21
  CACHE_DIR = Path.home() / ".prismnote" / "bin"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prismnote
3
- Version: 0.4.0
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
- It pairs a **Rust + Axum** backend and a **persistent Python kernel** with a modern,
72
- **VS Code-style React** interface. Write Python and SQL, get rich output and live
73
- charts, ask a local AI for help, schedule notebooks as jobs, manage git, and ship to
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 on your machine; local AI via Ollama, no account required.
77
- - **Jupyter-compatible** — native `.ipynb` format.
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, imports, and functions defined in one cell
86
- are available in every later cell (true notebook semantics).
87
- - **Per-cell interpreters (magics)**:
88
- - `%python` (default)runs in the shared kernel.
89
- - `%sql` in-process **DuckDB**; can query pandas DataFrames defined in other cells.
90
- - `%sh` / `%bash` / `!cmd` shell commands.
91
- - `%md` / `%markdown` rendered markdown.
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 (Stop) and **restart** the kernel from the toolbar/menu.
96
- - **Dynamic input widgets** — `prism.input / slider / select / checkbox` render controls
97
- that re-run the cell when changed (Databricks `dbutils.widgets`-style).
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
- Works with **local models via Ollama** (free, private, offline) or **Claude / OpenAI**.
102
- - **⌘K in-cell edit** describe a change, review a diff, accept or reject.
103
- - **Fix with AI** one click on an errored cell.
104
- - **Explain** — a teaching-oriented explanation with a contextual tip.
105
- - **Inline autocomplete** — ghost-text completions when Ollama is connected.
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 (NameError, KeyError,
111
- ModuleNotFoundError, TypeError, ZeroDivisionError, SyntaxError, …).
112
- - **In-editor markers** highlighting the offending **line and column**.
113
- - Collapsible full traceback when you want the details.
114
-
115
- ### Workflow: Jobs, Airflow, Git, Deploy
116
- - **Jobs** — save a whole notebook and run it as a unit, **manual / interval / daily**,
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** — generated `Dockerfile`, `docker-compose.yml`, `k8s.yaml`, and
121
- `fly.toml`, each with its one-line deploy command.
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: activity rail, collapsible panels, status bar.
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
- - **Global search (⌘K)**, **command palette (⇧⌘P)**, working top menus.
128
- - Integrated **Terminal**, a **Python Console** (shares the kernel), and a **file browser**
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**: Rust (Axum + Tokio). Spawns one long-lived Python process and talks to
156
- it over a line-framed JSON protocol; outputs are Jupyter-style MIME bundles.
157
- - **Frontend**: React 18 + TypeScript + Vite, Monaco editor, Tailwind CSS.
158
- - **Kernel**: a single `python` process with a shared namespace; SIGINT-interruptible,
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
- ## Getting started
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
- ### Run in development
174
- ```bash
175
- # 1) backend (port 8000)
176
- cargo run
198
+ All of these are wired:
177
199
 
178
- # 2) frontend (port 5173, proxies /api and /ws to the backend)
179
- cd frontend && npm install && npm run dev
180
- ```
181
- Open http://localhost:5173.
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
- ### Configure AI (optional)
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** (rocket icon) to copy/download ready-to-use artifacts:
215
+ Open **Deploy to Cloud** to copy/download the generated artifacts, then:
197
216
 
198
217
  ```bash
199
- docker compose up -d # Docker
200
- kubectl apply -f k8s.yaml # Kubernetes
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/ Rust backend (api, kernel, jobs, db, ws, …)
223
- frontend/ React app (components, hooks, api clients)
224
- *.md Architecture & comparison docs
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