bead

a provenance tool

Krisztián Fekete
Miklós Koren

2025-09-10

The Editor Gives You One Week

You need to:

  1. Address reviewer concerns about source data
  2. Redo analysis with new data
  3. Recreate Figure 1
  4. Submit within one week

But the Submission Was Months Ago

  • Research submitted months ago
  • Team has been improving data cleaning since then
    • Some team members left
  • Different statistical methods now
  • First question: How exactly was Figure 1 produced?

Luckily, You Worked Reproducibly

Figure 1 = code(data)

  • Results depend on both algorithms and data
  • Code under version control (Git) ✓
  • Tagged commit at submission ✓
  • But what about the data?

Data is Also a the Result of a Computation

data₁ = code₂(data₂)

  • Data transformed by wrangling/cleaning steps
    • countries dropped
    • transformations applied
    • feature engineering details
  • Chain of data provenance

A Real-World Data Pipeline

The Data Provenance Problem

Why It Is Complex:

  1. Frequent changes: Code and data both evolve
  2. Complex pipelines: Many steps, multiple datasets
  3. Tool heterogeneity: Python, R, SQL, DuckDB all in one project
  4. Team dynamics: People join, leave, change roles

Existing Solutions

Version Control (Git)

  • Great for code
  • Not suitable for large binary data

Data Version Control (DVC)

dvc.org

  • Similar spirit to bead, but delivery/versioning focused
  • More complex than needed for provenance tracking

Orchestration Tools

Enter bead

A command-line tool that captures your data’s story, step by step.

  • Much simpler than alternatives
  • Language agnostic
  • Supports heterogeneous teams

What bead Does NOT Do

Not a code runner

  • You run your own code
  • Python, R, Stata, SQL - doesn’t matter

Not a file sharing system

  • File system stores your files
  • Sharing it with others is your responsibility (but can be easily automated)

Only requirement:

  • Works with flat files on file system
  • Files not too big (20GB works fine)

Core bead Concepts

The bead

  • Self-contained unit of computation
  • Contains code, reference to input data, results
  • Packaged as ZIP file
  • Remembers exact provenance

Simple Commands

bead new my-analysis
bead input add source-data
bead save 

Demo Time

📐 Design

  • Integrity
  • Ease of use
  • Reproducibility

⚡ Inspiration

  • Human concept of story
    • Stories are composable
    • Helps us make sense of the world
  • Project
  • Publishing: ISBN / ISSN

🎬 Demo

Conference session classification by title

  • Inputs:

    • list of sessions
    • session theme classification rules
  • Output:

    • list of sessions extended with theme

/demo $

    

    

/demo $ : ⚙️ Setup

    

    

/demo $ : ⚙️ Setup /demo $

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects

    

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box
/demo/projects

    

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $
/demo/projects
/demo/bead-box

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $ bead box add demo /demo/bead-box
/demo/projects
/demo/bead-box

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $ bead box add demo /demo/bead-box Will remember box demo /demo/projects $
/demo/projects
/demo/bead-box

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $ bead box add demo /demo/bead-box Will remember box demo /demo/projects $ bead box list
/demo/projects
/demo/bead-box

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $ bead box add demo /demo/bead-box Will remember box demo /demo/projects $ bead box list Boxes: ------------- demo: /demo/bead-box /demo/projects $
/demo/projects
/demo/bead-box

/demo $ : ⚙️ Setup /demo $ : prepared files /demo $ tree /demo /demo └── files ├── run.sh ├── sessions.csv └── theme_aliases.csv 2 directories, 3 files /demo $ : working directory /demo $ mkdir /demo/projects /demo $ cd /demo/projects /demo/projects $ : box = storage for beads /demo/projects $ mkdir /demo/bead-box /demo/projects $ bead box add demo /demo/bead-box Will remember box demo /demo/projects $ bead box list Boxes: ------------- demo: /demo/bead-box /demo/projects $ clear
/demo/projects
/demo/bead-box

/demo/projects $
/demo/projects
/demo/bead-box

/demo/projects $ : 📁 First bead
/demo/projects
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $
/demo/projects
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions
/demo/projects
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $
/demo/projects
└── sessions
    ├── input
    ├── output
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions
/demo/projects
└── sessions
    ├── input
    ├── output
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $
/demo/projects
└── sessions
    ├── input
    ├── output
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output
/demo/projects
└── sessions
    ├── input
    ├── output
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $ bead discard
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $ cd ..
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 First bead /demo/projects $ bead new sessions Created workspace "sessions" /demo/projects $ cd sessions /demo/projects/sessions $ cp -v /demo/files/sessions.csv output '/demo/files/sessions.csv' -> 'output/sessions.csv' /demo/projects/sessions $ csvlook output/sessions.csv | title | speaker | | ---------------------- | ------- | | AI in Healthcare | Alice | | Blockchain for Banking | Bob | | Solar Panel Efficiency | Charlie | | Team Building Workshop | Diana | /demo/projects/sessions $ bead save Successfully stored bead at /demo/bead-box/sessions_20250910T150420886649+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $ cd .. /demo/projects $ clear
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases
/demo/projects
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420886649+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $ bead discard
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd ..
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases Created workspace "theme-aliases" /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ cp -v /demo/files/theme_aliases.csv output '/demo/files/theme_aliases.csv' -> 'output/theme_aliases.csv' /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd .. /demo/projects $ clear
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks
/demo/projects
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   └── sessions
    │       └── sessions.csv
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases
/demo/projects
└── possible-tracks
    ├── input
    │   └── sessions
    │       └── sessions.csv
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh .
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool!
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!"
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $ bead discard
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd ..
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks Created workspace "possible-tracks" /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ bead input add sessions Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done /demo/projects/possible-tracks $ bead input add theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ cp -v /demo/files/run.sh . '/demo/files/run.sh' -> './run.sh' /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ : No arguments: script, not a tool! /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | | /demo/projects/possible-tracks $ cowsay -f hellokitty "Diana did not get a theme assigned!" _____________________________________ < Diana did not get a theme assigned! > ------------------------------------- \ \ /\_)o< | \ | O . O| \_____/ /demo/projects/possible-tracks $ bead save Successfully stored bead at /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip. /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd .. /demo/projects $ clear
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead.
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop"
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
└── theme-aliases_20250910T150620502609+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $ bead discard
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd ..
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620502609+0000.zip ... OK Extracted source into /demo/projects/theme-aliases /demo/projects $ cd theme-aliases /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | /demo/projects/theme-aliases $ : Diana - "Team Building Workshop" /demo/projects/theme-aliases $ cat >> output/theme_aliases.csv <<EOF team,collaboration workshop,collaboration healthcare,healthcare EOF /demo/projects/theme-aliases $ csvlook output/theme_aliases.csv | alias | canonical_theme | | ---------- | ----------------------- | | ai | artificial intelligence | | blockchain | blockchain | | solar | sustainability | | team | collaboration | | workshop | collaboration | | healthcare | healthcare | /demo/projects/theme-aliases $ bead save Successfully stored bead at /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $ cd .. /demo/projects $ clear
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases
/demo/projects
└── possible-tracks
    ├── input
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load
/demo/projects
└── possible-tracks
    ├── input
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay!
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $ bead discard
/demo/projects
└── possible-tracks
    ├── input
    │   ├── sessions
    │   │   └── sessions.csv
    │   └── theme-aliases
    │       └── theme_aliases.csv
    ├── output
    │   └── classified_sessions.csv
    ├── run.sh
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd ..
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $ bead edit possible-tracks Verifying archive /demo/bead-box/possible-tracks_20250910T151020490163+0000.zip ... OK Extracted source into /demo/projects/possible-tracks Input data not loaded, update if needed and load manually /demo/projects $ cd possible-tracks /demo/projects/possible-tracks $ nl run.sh 1 duckdb <<SQL 2 COPY ( 3 SELECT DISTINCT 4 s.*, 5 a.canonical_theme AS theme 6 FROM 7 read_csv_auto('input/sessions/sessions.csv') AS s 8 LEFT JOIN 9 read_csv_auto('input/theme-aliases/theme_aliases.csv') AS a 10 ON ' ' || lower(s.title) || ' ' ILIKE '% ' || lower(a.alias) || ' %' 11 ORDER BY speaker, title, theme 12 ) TO 'output/classified_sessions.csv'; 13 SQL /demo/projects/possible-tracks $ bead status Bead Name: possible-tracks Inputs: input/sessions Status: **NOT LOADED** Bead: sessions # 20250910T150420886649+0000 Box[es]: * -r demo # 20250910T150420886649+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620502609+0000 Box[es]: * -r demo # 20250910T150620502609+0000 Some inputs are currently not loaded. You can "load" or "update" them manually. /demo/projects/possible-tracks $ bead input update theme-aliases Verifying archive /demo/bead-box/theme-aliases_20250910T151300218788+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420886649+0000.zip ... OK Loading new data to sessions ... Done "theme-aliases" is already loaded - skipping /demo/projects/possible-tracks $ bash run.sh /demo/projects/possible-tracks $ csvlook output/classified_sessions.csv | title | speaker | theme | | ---------------------- | ------- | ----------------------- | | AI in Healthcare | Alice | artificial intelligence | | AI in Healthcare | Alice | healthcare | | Blockchain for Banking | Bob | blockchain | | Solar Panel Efficiency | Charlie | sustainability | | Team Building Workshop | Diana | collaboration | /demo/projects/possible-tracks $ : ✨ Yay! /demo/projects/possible-tracks $ bead discard Deleted workspace /demo/projects/possible-tracks /demo/projects/possible-tracks $ cd .. /demo/projects $ clear
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions*
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── sessions_20250910T150420886649+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead box sync
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead box sync Syncing box "demo" at /demo/bead-box ✓ Success /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead box sync Syncing box "demo" at /demo/bead-box ✓ Success /demo/projects $ bead web color svg session-themes.svg
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead box sync Syncing box "demo" at /demo/bead-box ✓ Success /demo/projects $ bead web color svg session-themes.svg Loaded bead 1 (demo : theme-aliases @ 20250910T150620502609+0000) Loaded bead 2 (demo : possible-tracks @ 20250910T151020490163+0000) Loaded bead 3 (demo : theme-aliases @ 20250910T151300218788+0000) Loaded 3 beads Creating SVG: session-themes.svg /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

session-themes.svg

/demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $ unzip -v /demo/bead-box/possible-tracks_*.zip | tail -8
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $ unzip -v /demo/bead-box/possible-tracks_*.zip | tail -8 Length Method Size Cmpr Date Time CRC-32 Name -------- ------ ------- ---- ---------- ----- -------- ---- 181 Defl:N 139 23% 2025-09-05 13:37 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-05 13:37 e1c1f982 code/run.sh 941 Defl:N 481 49% 2025-09-10 15:10 b6fe215c meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 5e951697 meta/manifest -------- ------- --- ------- 1962 1151 41% 4 files /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $ unzip -v /demo/bead-box/possible-tracks_*.zip | tail -8 Length Method Size Cmpr Date Time CRC-32 Name -------- ------ ------- ---- ---------- ----- -------- ---- 181 Defl:N 139 23% 2025-09-05 13:37 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-05 13:37 e1c1f982 code/run.sh 941 Defl:N 481 49% 2025-09-10 15:10 b6fe215c meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 5e951697 meta/manifest -------- ------- --- ------- 1962 1151 41% 4 files /demo/projects $ : end of demo
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $ unzip -v /demo/bead-box/possible-tracks_*.zip | tail -8 Length Method Size Cmpr Date Time CRC-32 Name -------- ------ ------- ---- ---------- ----- -------- ---- 181 Defl:N 139 23% 2025-09-05 13:37 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-05 13:37 e1c1f982 code/run.sh 941 Defl:N 481 49% 2025-09-10 15:10 b6fe215c meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 5e951697 meta/manifest -------- ------- --- ------- 1962 1151 41% 4 files /demo/projects $ : end of demo /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020490163+0000.zip
├── theme-aliases_20250910T150620502609+0000.zip
└── theme-aliases_20250910T151300218788+0000.zip

🧩 Similar ideas

🧩 Similar ideas2

🐙 Source

Case Study From Our Research Lab

Case Study From Our Research Lab

  • Used since 2017 in our research groups: CEU MicroData, MACROMANAGERS.eu
    • internally
    • when sharing data with others
  • Saved about 600+ beads, two versions on average
  • Interquartile range of bead sizes: 10 to 500 MB, largest is 23 GB
  • Median time between saving new versions: 51 days

Practices We Adopted

  • Everything is a bead: raw data, intermediate data, analysis sample, research results
  • Never load data directly, from outside a bead
    • Side product: always use relative paths
  • We don’t often recompute everything, but good to know we could

Lessons For Research Software Engineers

  • Minimal learning curve for researchers
  • No infrastructure requirements
  • Works with existing workflows
  • Complements version control
  • Enables true reproducibility

Key Takeaways

  1. Data provenance is hard - especially with changing teams
  2. Existing tools too complex - for heterogeneous research teams
  3. bead keeps it simple - focuses on one thing well
  4. Reproducibility becomes automatic - not an afterthought

Contact and Acknowledgements

1

Slides

bead.zip/rsecon25