尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A local-first notebook that teaches: the AI hints, you run the code.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Dandelion is a notebook where the AI is a thinking partner, not a ghostwriter. You work in small steps, writing and running every cell yourself, and the AI asks a guiding question or gives a hint when you need one. It looks like the Claude desktop app, runs on your laptop, and switches to a remote GPU from a dropdown without changing how you work.
~/.config/dandelion, never in git, and the front end loads nothing from a CDN. The
same notebook runs against your laptop or an H100 through an SSH tunnel.You need uv and just
(brew install uv just).
git clone https://github.com/slegroux/dandelion.git && cd dandelion
uv sync --extra kernel --extra paper --extra web # the app, the kernel's numpy/torch stack, PDF + web readers
just start # kernel on :5055, UI on http://localhost:8000
just stop stops both, and just app builds a double-clickable Dandelion.app.
The LED in the top-right should be green: the UI has reached the kernel and code
runs for real. Amber means it fell back to an in-memory demo; just doctor
tells you why.
Then choose how Ask AI reaches a model, in ⚙ Settings:
| Route | You need | Billed |
|---|---|---|
| Claude subscription (Pro / Max) | the claude CLI, signed in (claude auth login; make it last) | your plan |
| ChatGPT subscription (Codex) | the codex CLI, signed in (codex login) | your plan |
| Claude API or GLM | an API key, pasted in Settings | per token |
A dialog is a column of cells: notes (markdown), code, and Ask AI prompts. Here is the loop, end to end.
1. Write code and run it. Variables persist between cells, as in Jupyter.
import numpy as np
sr, f0 = 8000, 100
t = np.arange(sr) / sr
sq = np.sign(np.sin(2 * np.pi * f0 * t)) # one second of a 100 Hz square wave
2. Ask, and get a nudge. Put $`expr` in a prompt and the AI receives its
live value, computed fresh each time you ask:
Why does a square wave only have odd harmonics? Don't give me the answer. My signal is
$`sq.shape`samples long.
It answers with a hint and a check you can run, then leaves the next step to you.
3. Let it edit, when you ask. Every cell has a number in its gutter. "Vectorise the loop in cell 4" rewrites that cell in place, and the new code waits there until you press Run.
4. Read a paper beside your notebook. Click 📄 and paste
arxiv.org/abs/1706.03762: the PDF becomes structured text with equations, tables
and figures. Highlight a passage, click → Notebook, and it arrives as a note
with an empty code cell below it for your version.
5. Ship what you learned. Tag cells, from any dialog, into a Python package:
#| export audiolib:layers # this cell goes to library `audiolib`, module `layers`
class Conv1d: ...
uv run python -m dandelion.cli library build audiolib ./audiolib # nbdev tangles it into a package
Click Use in kernel, and import audiolib works in any cell. Each generated
function links back to the cell you wrote it in.
| Editable cells | Rendered by default, click to edit; headings fold into sections |
| Linked cells | #_<id> links within and across dialogs; the AI can cite cells too |
| Live completion | From what you've actually run, via jedi |
| Live values in prompts | $`df.shape` sends the real number |
| Context you can see | Per-cell token counts; mute a cell to drop it, pin one to keep it |
| Three modes | learning, concise, standard |
| Cell edits, not an agent | Visible, in-notebook edits only; Write, Edit and Bash denied |
| Rich output | Matplotlib, _repr_html_ and _repr_png_, inline |
| Jupyter keys | Command and edit modes, /, /, , |
A target is just the server URL the client points at, defined in
targets.yaml. For a remote GPU, run the bundled kernel server there
and tunnel it back. The URL stays on localhost, and the port never touches the
public internet:
uv run python -m dandelion.cli up h100 # open the SSH tunnel
uv run python -m dandelion.cli doctor h100 # DNS, port, token, route: exactly what's broken
Then switch targets from the dropdown in the top bar. Code runs on the bundled
kernel server by default; with the solveit extra, Dandelion can instead connect to a
SolveIt server through Answer.AI's solveit_client. See
the guide.
just test # the suite runs offline: no server, subprocess or network
just lint
just dev # kernel + UI in the foreground; Ctrl+C stops both
| Path | What it is |
|---|---|
dandelion/app.py | The FastHTML UI: server-side rendering, htmx swaps |
dandelion/client.py | One connect() over the bundled kernel, solveit_client and an in-memory mock |
server/kernel_server.py | The kernel server: execution, rich output, completion |
dandelion/claude_cli.py, codex_cli.py | Ask AI over your Claude or ChatGPT subscription |
site/ | The landing page |
Renamed from Pappus (and before that, SolveIt Sidekick). On first start, Dandelion moves your data from
~/.config/pappusto~/.config/dandelionand leaves a link at the old path; converted papers keep their cache.PAPPUS_*andSIDEKICK_*settings still work as theirDANDELION_*equivalents. Notebook code that importedpappus.*modules now importsdandelion.*.
jkabddz| Papers and web pages | marker for PDFs, trafilatura for articles, or one section at a time |
| Cells into a library | Cross-dialog modules built with nbdev, with links back to the source cells |
| Saved and portable | Rolling backups, corrupt-file recovery, just backup / just restore |
| Export | Any dialog as .ipynb or markdown |