#485: Creating memories
About the show
Sponsored by us! Support our work through:
- Our courses at Talk Python
- AWS Community Day Midwest tomorrow Wednesday the 24th in downtown Indianapolis, Six Feet Up is sponsoring and there are 2 Sixies presenting
Connect with the hosts
- Michael: Mastodon / BlueSky / X / LinkedIn
- Calvin: Mastodon / BlueSky / X / LinkedIn
- Show: Mastodon / BlueSky / X
Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Tuesday at 7am PT. Older video versions available there too.
Finally, if you want an bonus digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Michael #1: Backup Docker volumes locally or to any S3
- Via Bryan Weber (thanks Bryan!), who spotted it over on Virtualization HowTo. Find Bryan at bryanwweber.com.
- offen/docker-volume-backup is a lightweight companion container that backs up the volumes your apps actually depend on, then ships them somewhere safe.
- It's tiny: written in Go and about 25MB compressed, roughly 1/20th the size of the shell-based image (
jareware/docker-volume-backup) that inspired it. - Drop it into your
docker composefile as abackupservice, mount the volumes you care about as read-only, and you're off. - Push backups to a pile of destinations: a local directory, plus any S3, WebDAV, Azure Blob Storage, Dropbox, Google Drive, or SSH-compatible target. Mix and match as many as you want in one run.
- Recurring cron-style backups in a Compose setup, or one-off backups straight from the Docker CLI.
- Production-friendly touches worth calling out:
- Rotates away old backups so you don't quietly fill the disk.
- GPG encryption for your archives.
- Notifications on finished and failed runs (so you find out about failures before you need the backup).
- Stop a container during backup for a consistent snapshot using a simple
docker-volume-backup.stop-during-backup=truelabel, then auto-restart it. - Run custom commands during the backup lifecycle (great for a database dump before the file copy).
- Docker Swarm support, plus
arm64andarm/v7builds. Hello, Raspberry Pi homelab.
- Fun aside from Bryan: he searched our back catalog for this tool and the search came back so fast he thought it hadn't run. Love to hear it.
Calvin #2: Pyodide 314.0 Release
- PEP 783 is the real news — Pyodide maintainers used to hand-build 300+ packages. Now anyone can publish Pyodide wheels to PyPI with
cibuildwheel. - The version jump from 0.29 to 314.0 is intentional — it now tracks the Python version, so 314.x = Python 3.14. Binary compatibility is locked per Python cycle, meaning packages you build today won't break on the next Pyodide release.
sqlite3,ssl, andlzmaare back in the default stdlib — no moreawait pyodide.loadPackage("sqlite3"). Bigger download, but a much smoother experience for newcomers.bigintprecision bug is fixed — values above 2^53 were silently losing precision when crossing the Python/JS boundary. The newJsBigInttype makes the roundtrip correct. Worth flagging if anyone is doing numeric work in a browser app.- Experimental TCP sockets in Node.js — you can now connect Pyodide to a real database (MySQL, PostgreSQL, Redis tested) when running server-side. Blurs the line between "Python in the browser" and "Python runtime anywhere Wasm runs."
Michael #3: nb-cli: A Command-Line Interface for AI Agents and Notebook Automation
- From Piyush Jain (Jupyter and LangChain maintainer) on the Jupyter blog: nb-cli: A Command-Line Interface for AI Agents and Notebook Automation.
- nb-cli is an experimental, Rust-based CLI to read, write, execute, and search Jupyter notebooks. The premise: agents are great at CLIs but terrible at hand-editing the nested JSON in an
.ipynb, so let them operate on the notebook from the outside instead of running inside it. - Works with or without a Jupyter server. No server? It reads/writes
.ipynbfiles directly and talks to kernels over ZeroMQ. Connected to a live JupyterLab, your edits show up instantly via Y.js (the same CRDT Jupyter uses). - Smart output format: instead of token-heavy JSON or ambiguous plain markdown, it uses
@@cell/@@outputsentinels with inline metadata. Less wasted context, unambiguous structure, and it degrades gracefully on truncation. - The payoff is composability. "Add a summary section and run it" becomes one shell pipeline instead of six agent tool calls. And
nb search notebook.ipynb --with-errorsreturns only the failing cells, so the agent skips the cells that worked. - Claude Code tie-in: it ships as an agent skill.
npx skills install jupyter-ai-contrib/nb-cliand your agent can drive notebooks vianb. - Out of jupyter-ai-contrib, which aims to become an official Jupyter AI subproject. Still early (crates.io is at v0.0.5), so kick the tires before anything load-bearing.
- See also marimo-pair.
Calvin #4: Hindsight Agent Memory That Learns
- AI agents forget everything between sessions — Hindsight gives them persistent memory that learns over time
- Simple three-method API:
retain(),recall(),reflect()— store, retrieve, and reason over memories - TEMPR retrieval runs semantic, keyword, graph, and temporal search in parallel for accurate results
- Automatically consolidates related facts into durable observations instead of piling up duplicates
pip install hindsight-allruns the entire server in-process; integrates with LangChain, LlamaIndex, Pydantic AI, CrewAI, and more
Extras
Calvin:
- Clanker: A Word For The Machine
- **Ponytail — You know him. Long ponytail. Oval glasses. Has been at the company longer than the version control**
- **Klangk: Multi-User AI Sandboxing, Collaboration and Coding Platform**
- Cursor announces Origin
- performative-ui to quick start your new idea Michael:
- Astral Joins OpenAI: The Interview
- SpaceX to acquire Cursor
- And OpenAI renews Open Source support
- Portuguese subtitles are now available for Talk Python courses
- DSF is hiring including Six Feet Up support
Joke: Oh Babe…
Episode Transcript
Collapse transcript
00:00
00:05
00:12
00:13
00:19
00:26
00:29
00:32
00:35
00:41
00:46
00:49
00:54
00:58
01:06
01:08
01:09
01:14
01:15
01:17
01:22
01:26
01:27
01:35
01:41
01:44
01:47
01:54
01:59
02:04
02:08
02:12
02:16
02:18
02:21
02:23
02:26
02:31
02:33
02:34
02:36
02:38
02:42
02:46
02:50
02:54
02:56
03:01
03:03
03:04
03:07
03:08
03:11
03:16
03:20
03:28
03:31
03:33
03:39
03:41
03:43
03:47
03:47
03:53
03:56
03:57
04:03
04:03
04:04
04:05
04:06
04:07
04:08
04:08
04:09
04:10
04:14
04:16
04:18
04:21
04:24
04:25
04:27
04:28
04:29
04:33
04:34
04:36
04:39
04:45
04:52
05:00
05:07
05:10
05:12
05:14
05:19
05:25
05:29
05:34
05:39
05:40
05:42
05:47
05:50
05:52
05:56
05:59
06:01
06:03
06:04
06:08
06:12
06:14
06:15
06:16
06:18
06:20
06:25
06:27
06:28
06:31
06:38
06:39
06:45
06:47
06:49
06:50
06:55
06:55
06:57
07:03
07:06
07:08
07:11
07:14
07:20
07:25
07:30
07:32
07:34
07:35
07:36
07:40
07:47
07:49
07:51
07:52
07:54
07:54
07:59
08:02
08:08
08:09
08:12
08:14
08:19
08:22
08:24
08:26
08:28
08:31
08:34
08:35
08:36
08:38
08:40
08:45
08:49
08:50
08:52
08:56
09:01
09:03
09:03
09:04
09:06
09:08
09:10
09:16
09:16
09:20
09:22
09:25
09:29
09:32
09:37
09:39
09:43
09:47
09:49
09:52
09:55
09:57
10:00
10:06
10:11
10:15
10:18
10:26
10:30
10:34
10:39
10:44
10:49
10:56
11:02
11:07
11:11
11:15
11:17
11:18
11:21
11:27
11:30
11:36
11:38
11:43
11:46
11:50
11:54
11:57
12:00
12:03
12:07
12:11
12:13
12:16
12:21
12:22
12:25
12:33
12:37
12:43
12:45
12:48
12:49
12:52
12:53
12:55
12:59
13:05
13:09
13:11
13:13
13:15
13:19
13:23
13:27
13:31
13:36
13:40
13:46
13:51
14:00
14:05
14:12
14:19
14:24
14:29
14:34
14:41
14:46
14:54
15:01
15:06
15:12
15:18
15:23
15:27
15:30
15:31
15:32
15:35
15:36
15:41
15:45
15:48
15:51
15:57
16:03
16:06
16:13
16:14
16:17
16:20
16:21
16:22
16:23
16:32
16:33
16:38
16:43
16:48
16:51
16:54
16:55
16:59
17:03
17:05
17:07
17:10
17:13
17:15
17:15
17:18
17:23
17:27
17:31
17:34
17:39
17:42
17:45
17:50
17:56
18:03
18:09
18:17
18:21
18:27
18:32
18:36
18:44
18:49
18:54
18:58
19:05
19:07
19:11
19:16
19:18
19:21
19:28
19:33
19:36
19:39
19:41
19:44
19:50
19:55
19:58
20:03
20:08
20:12
20:16
20:17
20:22
20:26
20:28
20:35
20:42
20:48
20:53
20:56
20:57
20:58
20:59
21:02
21:03
21:04
21:08
21:10
21:14
21:19
21:22
21:28
21:30
21:35
21:37
21:37
21:39
21:40
21:41
21:42
21:45
21:48
21:48
21:48
21:50
21:52
21:55
21:56
21:56
21:58
21:59
22:03
22:09
22:12
22:17
22:21
22:29
22:35
22:40
22:44
22:50
22:55
22:59
23:01
23:03
23:05
23:05
23:06
23:12
23:13
23:14
23:14
23:15
23:16
23:17
23:17
23:18
23:21
23:24
23:29
23:30
23:32
23:37
23:40
23:42
23:45
23:46
23:48
23:49
23:49
23:50
23:53
23:55
23:57
23:57
24:02
24:05
24:06
24:07
24:07
24:07
24:08
24:08
24:08
24:09
24:09
24:10
24:14
24:16
24:18
24:22
24:26
24:30
24:32
24:34
24:36
24:37
24:39
24:42
24:43
24:44
24:44
24:45
24:48
24:57
24:59
25:03
25:06
25:08
25:08
25:15
25:20
25:26
25:30
25:35
25:40
25:43
25:48
25:53
25:56
25:59
26:02
26:05
26:10
26:14
26:21
26:24
26:28
26:34
26:40
26:45
26:49
26:55
26:59
27:07
27:11
27:17
27:20
27:24
27:32
27:37
27:44
27:49
27:54
27:58
28:00
28:03
28:06
28:12
28:15
28:17
28:20
28:20
28:23
28:26
28:27
28:28
28:29
28:33
28:36
28:39
28:43
28:48
28:52
28:56
29:01
29:06
29:11
29:14
29:14
29:18
29:25
29:27
29:32
29:33
29:36
29:39
29:41
29:41
29:48
29:53
29:59
30:03
30:09
30:13
30:18
30:24
30:31
30:38
30:42
30:43
30:47
30:50
30:51
30:53
30:55
30:58
31:00
31:03
31:05
31:08
31:09
31:15
31:17
31:20
31:23
31:24
31:27
31:33
31:40
31:46
31:53
31:59
32:04
32:13
32:19
32:24
32:28
32:33
32:39
32:44
32:50
32:53
32:56
32:59
32:59
33:05
33:09
33:14
33:18
33:20
33:23
33:25
33:25
33:26
33:28
33:31
33:34
33:35
33:37
33:39
33:39
33:43
33:43
33:44
33:46
33:47
33:47
33:48
33:57
33:58
34:14
34:16
34:21
34:24
34:26
34:29
34:37
34:40
34:47
34:48
34:49
34:51
34:51
34:53
34:54
34:57
34:58
35:00
35:02
35:07
35:09
35:10
35:15
35:21
35:27
35:35
35:39
35:42
35:46
35:47
35:52
35:54
35:55
35:55
36:01
36:03
36:07
36:09
36:13
36:15
36:19
36:22
36:26
36:29
36:32
36:36
36:41
36:44
36:49
36:52
36:55
36:58
37:02
37:04
37:08
37:09
37:10
37:13
37:16
37:18
37:19
37:20
37:21
37:22
37:23
37:29
37:30
37:33
37:37
37:38
37:40
37:41
37:43
37:45
37:46
37:47
37:49
37:51
37:53
37:55
37:57
37:59
38:00
38:02
38:05
38:11
38:17
38:18
38:19



