Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
acf20e0
docs(presentations): add the "SpyDE — an overview" talk, authored in …
CSSFrancis Jul 31, 2026
3c2a246
Merge remote-tracking branch 'origin/main' into docs/spyde-presentation
CSSFrancis Aug 4, 2026
d4214e7
docs(presentations): rewrite the overview talk — the arc, the argumen…
CSSFrancis Aug 4, 2026
9cd20bf
feat(present): all four split layouts, text slides that fill, and a P…
CSSFrancis Aug 4, 2026
38bf08f
feat(report): saved figures reopen interactive, not as a flat picture
CSSFrancis Aug 4, 2026
6731786
fix(ui): the Dask dashboard link stops disappearing, and 15 border st…
CSSFrancis Aug 4, 2026
5d66569
feat(report): replace a picture in place — drop another image, or a l…
CSSFrancis Aug 4, 2026
09a3efc
feat(report): drop a figure or a PNG on a text slide to make it a spl…
CSSFrancis Aug 4, 2026
4c10696
feat(ui): update report
CSSFrancis Aug 4, 2026
e463b81
feat(report): drop an image on a live figure to replace it
CSSFrancis Aug 4, 2026
4e1af8b
diag(lifecycle): log the suspend/resume boundary and process deaths
CSSFrancis Aug 4, 2026
3b5c48f
docs: scope the session-resync fix (proposal, nothing implemented)
CSSFrancis Aug 4, 2026
1e63166
docs: withdraw the claim that the Dask cluster survives
CSSFrancis Aug 4, 2026
dd5db24
docs: scope the cluster-liveness workstream (section 9)
CSSFrancis Aug 4, 2026
45114c5
test: measure what survives a renderer loss (plan Phase 1)
CSSFrancis Aug 5, 2026
e2b208f
docs: the Python process is confirmed alive after a real Mac lid-close
CSSFrancis Aug 5, 2026
809cae6
docs: Phase 0 results — cluster survives, but the renderer-death hypo…
CSSFrancis Aug 5, 2026
e724d62
wip(presentations): your in-progress decks, so they travel between ma…
CSSFrancis Aug 5, 2026
37758f9
docs: control answered — the renderer SURVIVED, so the diagnosis reopens
CSSFrancis Aug 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
550 changes: 550 additions & 0 deletions SESSION_RESYNC_PLAN.md

Large diffs are not rendered by default.

116 changes: 116 additions & 0 deletions doc/presentations/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Presentations

Talks about SpyDE, authored **in** SpyDE — each one is a real `.spyde-report`
presentation document, not a PDF.

| file | what it is | length |
|---|---|---|
| `spyde-overview.spyde-report` | "SpyDE — an overview": where the project came from, the HyperSpy stack it builds on, the Electron/anyplotlib architecture, the case for open and reproducible analysis, and where it is going | 21 slides, ~12.4 min |

## Opening a deck

1. Launch SpyDE (`cd electron && npm run dev`, or a released build).
2. Open the **Report** sidebar — the panel toggle at the top right of the app bar.
3. **Open**, and pick the `.spyde-report` file.
4. **Present** for the full-screen deck.

In Present mode: `→` / `Space` / `PageDown` advance, `←` / `PageUp` go back,
`Home` / `End` jump to the ends, `Esc` exits. **`S` toggles the presenter view** —
the current slide, the next one, the speaker notes, and a timer. A presentation
clicker sends arrow / page keys, so it works without extra setup.

Every slide carries speaker notes. They are visible only in the presenter view,
never to the audience and never in an exported deck.

## Editing

The deck is ordinary content — open it and edit the slides in the sidebar like
any report. Slides can be reordered by dragging their grips, and
`Export ▾` writes static HTML, interactive HTML, PDF, or a markdown folder.

`spyde-overview.spyde-report` is **generated**, so the durable source is the
script:

```bash
python doc/presentations/build_spyde_overview.py
```

Three tables in `build_spyde_overview.py` are what you edit:

| table | what it controls |
|---|---|
| `SPEAKER` | name, role, affiliation, email, **venue and date**. Feeds the title card, the closing card and the footer bar, so booking a new venue is one edit. Leave `venue`/`date` blank and the line is omitted rather than left dangling. |
| `THEME` | the deck's look — background, text, muted, accent, font stack, logo, footer. Written into the document's `theme:` front matter, so it travels with the file. |
| `SLIDES` | the talk: text, layout, speaker notes, per-slide time budget. |

The script prints the slide count, the total time budget and the resolved theme
on every rebuild, and **fails the build** if the budget leaves the ~11–13.5 min
slot the deck targets — better to find that here than on stage.

If you edit the deck in the app instead and save over the file, the script
becomes stale — that is fine, but say so in the commit.

Nothing on a slide is a placeholder. Anything still to be decided lives in the
speaker notes, where a projector can't show it to the room.

### Screenshots

The app screenshots live in `media/` and are captured from the **real app** by
`electron/tests/talk_screenshots.spec.ts` (a capture run, not a regression test):

```bash
cd electron
npx playwright test tests/talk_screenshots.spec.ts --project=electron \
--reporter=line --retries=0
cp talk_shots/*.png ../doc/presentations/media/
```

`build_spyde_overview.py` crops each shot to the region that carries meaning
(`CROPS`) and caps its width (`IMAGE_WIDTH`) before embedding it, which is what
keeps the committed deck under a megabyte. Re-capturing at a different window
size will shift the crop boxes; the crop clamps rather than raising, so check the
slides afterwards.

### Verifying

`electron/tests/talk_present.spec.ts` opens the committed deck in the real app,
pages through every slide in Present mode, screenshots each one to
`electron/talk_present_shots/`, and fails on a slide that renders no text or
overflows horizontally. It also asserts the **theme** survives the round trip:
the deck's background and accent, the footer bar with its embedded logo and
contact line, that a title card carries *no* footer, and that slide headings
take the themed colour rather than the stylesheet's hard-coded one.

Look at the screenshots — that is the actual check. `N_SLIDES` and the theme
colours in the spec are duplicated from the build script on purpose: if you
change one, the other fails loudly.

```bash
cd electron
npx playwright test tests/talk_present.spec.ts --project=electron \
--reporter=line --retries=0
```

## The file format

A `.spyde-report` is a plain zip you can unzip and read:

```
report.md # YAML front-matter + markdown body — the whole document
figures/<id>.yaml # a live figure recipe, per figure cell
assets/<id>.png # the baked snapshot / embedded image, per cell
```

`report.md` is valid standalone markdown (pandoc-ready once unzipped).
Presentation-only attributes — slide breaks, title slides, background styles,
speaker notes — ride as invisible HTML comments, so an external markdown renderer
shows the prose and ignores the rest. `type: presentation` in the front matter is
what makes the document a deck rather than a scrolling report, and `theme:`
carries its look. The logo is embedded as a `data:` URL rather than a path, so
the deck survives being emailed to someone whose disk has never had this repo on
it.

This deck uses only markdown, image, and split cells, so it carries no live
signal bindings and opens standalone with no data loaded. A deck built from your
own session can instead hold **live figure cells** that re-bind to the signal when
you reopen it with the data loaded.
470 changes: 470 additions & 0 deletions doc/presentations/SpyDE_an_overview2.html

Large diffs are not rendered by default.

Loading
Loading