bead

a provenance tool

Krisztián Fekete
Miklós Koren

RSECon25

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

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

You want to reconstruct the chain of data provenance.

A Real-World Data Pipeline

The Data Provenance Problem

Why It Is Complex:

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

Existing Solutions

   
Version Control (Git) Not suitable for large binary data.
Data Version Control (DVC) Only versions data.
Orchestration Tools (Airflow, dbt, KNIME) Language specific and too complex.

bead

A command-line tool that packages code and data together in immutable snapshots, with all data dependencies declared explicitly.

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_20250910T150420306964+0000.zip. /demo/projects/sessions $
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+0000.zip. /demo/projects/sessions $ bead discard
/demo/projects
└── sessions
    ├── input
    ├── output
    │   └── sessions.csv
    └── temp
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $ cd ..
/demo/projects
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+0000.zip. /demo/projects/sessions $ bead discard Deleted workspace /demo/projects/sessions /demo/projects/sessions $ cd .. /demo/projects $
/demo/projects
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+0000.zip

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

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

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

/demo/projects $ : 📁 Second bead /demo/projects $ bead new theme-aliases
/demo/projects
/demo/bead-box
└── sessions_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150420306964+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_20250910T150620911398+0000.zip. /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150620911398+0000.zip. /demo/projects/theme-aliases $ bead discard
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150620911398+0000.zip. /demo/projects/theme-aliases $ bead discard Deleted workspace /demo/projects/theme-aliases /demo/projects/theme-aliases $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

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

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

/demo/projects $ : 🔗 Computation /demo/projects $ bead new possible-tracks
/demo/projects
/demo/bead-box
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+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_20250910T150420306964+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_20250910T150620911398+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead.
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
└── theme-aliases_20250910T150620911398+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+0000.zip. /demo/projects/theme-aliases $
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+0000.zip. /demo/projects/theme-aliases $ bead discard
/demo/projects
└── theme-aliases
    ├── input
    ├── output
    │   └── theme_aliases.csv
    └── temp
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : New version of theme-aliases bead. /demo/projects $ bead edit theme-aliases --review Verifying archive /demo/bead-box/theme-aliases_20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : Use the improved input to re-classify sessions /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+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 # 20250910T150420306964+0000 Box[es]: * -r demo # 20250910T150420306964+0000 input/theme-aliases Status: **NOT LOADED** Bead: theme-aliases # 20250910T150620911398+0000 Box[es]: * -r demo # 20250910T150620911398+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_20250910T151300589642+0000.zip ... OK Loading new data to theme-aliases ... Done /demo/projects/possible-tracks $ bead input load Verifying archive /demo/bead-box/sessions_20250910T150420306964+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_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : 🖼️ Visual Overview
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions*
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── sessions_20250910T150420306964+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

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

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead web color svg session-themes.svg
/demo/projects
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : 🖼️ Visual Overview /demo/projects $ rm /demo/bead-box/sessions* /demo/projects $ bead web color svg session-themes.svg Loaded bead 1 (demo : theme-aliases @ 20250910T151300589642+0000) Loaded bead 2 (demo : possible-tracks @ 20250910T151020873645+0000) Loaded bead 3 (demo : theme-aliases @ 20250910T150620911398+0000) Loaded 3 beads Creating SVG: session-themes.svg /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

session-themes.svg

/demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : ⚙️ Internals
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

/demo/projects $ : ⚙️ Internals /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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-10 06:15 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-10 06:15 e1c1f982 code/run.sh 941 Defl:N 484 49% 2025-09-10 15:10 72980d26 meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 3e9f906f meta/manifest -------- ------- --- ------- 1962 1154 41% 4 files /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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-10 06:15 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-10 06:15 e1c1f982 code/run.sh 941 Defl:N 484 49% 2025-09-10 15:10 72980d26 meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 3e9f906f meta/manifest -------- ------- --- ------- 1962 1154 41% 4 files /demo/projects $ : end of demo
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+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-10 06:15 af1dd6c0 data/classified_sessions.csv 370 Defl:N 232 37% 2025-09-10 06:15 e1c1f982 code/run.sh 941 Defl:N 484 49% 2025-09-10 15:10 72980d26 meta/bead 470 Defl:N 299 36% 2025-09-10 15:10 3e9f906f meta/manifest -------- ------- --- ------- 1962 1154 41% 4 files /demo/projects $ : end of demo /demo/projects $
/demo/projects
└── session-themes.svg
/demo/bead-box
├── possible-tracks_20250910T151020873645+0000.zip
├── theme-aliases_20250910T150620911398+0000.zip
└── theme-aliases_20250910T151300589642+0000.zip

🧩 Similar ideas

🧩 Similar ideas2

🐙 Source

Case Study From Our Research Lab

Case Study From Our Research Lab

CEU MicroData and MACROMANAGERS.eu are economics research labs studying competitiveness, firm dynamics, trade and growth.

Variety of data: administrative registers, surveys, web-scraped data, commercial datasets. Typically not large, but complex.

Diverse and evolving team: 7 senior researchers, 4 research fellows, 20+ recent and 40+ past student affiliates.

How We Use bead

Used since 2017 internally and 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 nice to know we could.

Take It For a Spin

Website: bead.zip

Installation: bead.zip/install

GitHub: github.com/e3krisztian/bead

Slides: bead.zip/rsecon25

Acknowledgements