Instructor Notes
Lesson Overview
This lesson teaches researchers how to make software citable and discoverable. The core arc is:
Sharing → License → CITATION.cff → Release/DOI → Metadata
The environment management episode (pixi) is optional and sits after the release/DOI episode in the default lesson order. Decide before your workshop which track you are running.
Presentation Slides
A conference-style slide deck of this material exists as a separate artifact from the hands-on lesson. It was delivered at UC Love Data Week 2026 and is the right starting point for a short, talk-based version of this content.
- Slides (PDF, view/print): 2026-UCLDW-sharing-software.pdf
- Slides (PowerPoint, editable source): 2026-UCLDW-sharing-software.pptx
The deck and this lesson are maintained independently. The slides are
the canonical delivery artifact (designed in PowerPoint); the
episodes are the canonical hands-on workbook. Earlier draft
slide material (Marp, scripts, asset captures) is archived under
dev/slide_assets/ (kept out of the built site) and is not
maintained.
Reading the Room: Researchers vs. Support Staff
This lesson serves two overlapping audiences: people who write research software, and the library / OSPO / research-support staff who advise them. In practice your room will often be a mix, and sometimes it will be mostly researchers even when the workshop was billed for librarians. Plan to flex the framing live rather than committing to one persona.
The hands-on body is audience-neutral. The keystrokes to add a
license, a CITATION.cff, or a Zenodo DOI are the same no
matter who runs them. The audience-specific layer lives in two
places:
- “Supporting others” callouts in each episode are learner-facing asides that recast the technical step as advising and consultation work. If your room is mostly support staff, slow down and discuss these: ask “who on your campus owns this step, and when would you refer it out?” If your room is mostly researchers, read past them quickly or skip them.
- These instructor notes are the meta layer for you.
Prompts that work well with a support-staff audience:
- After the license episode: “A faculty member asks ‘can I just put MIT on this?’ What do you check before answering?” (Who owns the code, any third-party dependencies, and whether this is a referral to tech transfer.)
- After the CITATION.cff episode: “Would you author this file for them, or coach them to do it? Where is the line?”
- After the release/DOI episode: “Which DOI goes in their methods section, the version DOI or the concept DOI?”
If your audience is purely researchers, treat the “Supporting others” boxes as optional enrichment and keep the focus on their own repositories.
Two objectives per episode
Each episode lists a Supporting others objective alongside the hands-on one. The hands-on objective is “can you do this step”; the supporting objective is “can you advise, teach, or triage it for someone else.” With a support-staff audience, hold learners to the second objective too, not just task completion. The “Build your campus playbook” challenge in the wrap-up is where that second objective gets produced as a take-home artifact, so leave time for it.
Predict-then-reveal
Seeded Predict challenges (e.g., “what will GitHub
do when you commit CITATION.cff?”, “what happens when you
publish a release to a connected Zenodo?”) ask learners to commit to an
answer before the reveal. This is the cheapest way to keep
active-learning value when you are short on time or running a
slide-based version: even without hands-on doing, a prediction plus a
reveal keeps learners engaged. In slide mode, turn each demo step into a
prediction first. Aim for one every 5 to 10 minutes.
Choosing a Track
Episode timings sum to about 3.25 hours for the
citation-focused track and 3.75 hours for the full
track. These are content minutes (teaching + exercises); add breaks,
setup, and Q&A to get wall-clock time, so budget a half
day either way. The per-episode
teaching/exercises values are a starting point
calibrated against mature Carpentries lessons; adjust them after your
first run.
Set up: teach from your own fork
The whole lesson runs in the browser on a fork of
UC-OSPO-Network/software-demo. Set yourself up exactly the
way learners do, so you and the room share the same starting state and
the same clicks.
Before the workshop:
- Fork
UC-OSPO-Network/software-demoto your own account (or a throwaway teaching account). Themain-only default is fine. - Confirm your fork’s
mainis the bare starting state:README.md,requirements.txt, andsrc/analysis.py, with no license, citation, release, or metadata. - Have the upstream repo open in a second browser tab so you can show
the
after-*reference branches on demand. - If you’re teaching the full (pixi) track, also clone your fork
locally and confirm
pixi --version.
During the workshop, demonstrate each step live in
your fork and let learners mirror it in theirs. Everyone commits to
their own main. Because you forked the same starting state,
your screen and theirs stay in sync.
Use a fresh fork for each teaching. Delete and re-fork (or reset) between workshops so you always start from the bare state, not last session’s finished repo.
The reference branches
The upstream repository keeps view-only reference branches showing the target state after each episode. Learners never build on them; they’re an answer key and a catch-up aid.
| Reference branch | State it shows |
|---|---|
main |
starting state (what everyone forks) |
after-license |
after Episode 2 (license added) |
after-citation |
after Episode 3 (CITATION.cff added) |
after-release |
after Episode 4 (release + DOI) |
after-metadata |
after Episode 5 (full metadata, the finished repo) |
optional-pixi |
the optional pixi episode (branches off
after-metadata) |
Why there’s no per-episode “check out this branch” step
anymore. In the old command-line version, learners
git checkouted a branch to teleport their working state
forward when they fell behind. The web workflow has no equivalent, and
it doesn’t need one: each episode adds an independent
file (license, then citation, then release, then metadata), so a learner
who misses one is never blocked, just less complete. To catch
up, they open the relevant reference branch upstream and copy the one
file they’re missing into their own main. Point this out
once, early, then let the reference branches sit in the background.
Pixi is out of the main chain. Unlike the old demo
repo, the after-* branches contain no pixi
files. Pixi lives only on optional-pixi, which branches off
after-metadata. So learners on the citation-focused track
never see stray pixi.toml/pixi.lock files, and
there’s nothing to explain away.
Common Sticking Points
GitHub “Cite this repository” button not appearing
Learners need to commit the CITATION.cff file to the
default branch and refresh. GitHub may take a minute to parse it. If it
doesn’t appear, check that the file is in the root of the repository and
named exactly CITATION.cff.
Zenodo Sandbox login Use
sandbox.zenodo.org, not the real zenodo.org.
Learners who accidentally create records on the live site cannot delete
them. Warn the group before this step.
YAML indentation errors in CITATION.cff Direct learners to the cffinit web tool (https://citation-file-format.github.io/cffinit/) rather than hand-editing YAML. This eliminates most formatting errors.
Pixi not installed Pixi is optional and learners do not need it installed to complete the citation-focused track. If running the full track, verify pixi installation during setup. The pixi episode callout already marks it optional so learners who skip it can rejoin cleanly.
Introduction: Software as a Citable Research Output
Instructor Note
Why this framing works with researchers: they do not adopt these practices because they are virtuous. They adopt them because journals are starting to require citable code deposits, because funders ask, and because a DOI turns invisible labor into a countable, citable output for their CV. Lead with that: this is credit they are currently leaving on the table.
Instructor Note
Most librarians and support staff in the room will not have hit this exact error themselves, so don’t lean on it as a shared war story. Frame it instead as the barrier researchers describe when code “doesn’t work,” and flag that the mechanics live in the optional pixi episode, so a citation-focused workshop can acknowledge the problem and move on.
Keep FAIR4RS light here
Treat this as a preview, not a lecture. Learners will understand Findable, Accessible, Interoperable, and Reusable much better after they create the license, citation metadata, DOI, and README metadata. Name the four principles, point ahead to where each gets built, and move on.
Choosing an Open-Source License
Instructor Note
Why this episode matters to researchers: licensing is where reuse and credit actually begin. An unlicensed repo cannot be legally built on, which means it will not accumulate the users, forks, and citations that make software count as a scholarly contribution. This is also the one episode with a hard referral boundary: you can explain categories and point to the campus default, but ownership questions go to Tech Transfer. Knowing where that line sits is itself the expertise.
Instructor Note
The decision guide below and the license references in this episode center UC policy and the UC OSPO guidance. For a non-UC workshop, swap in your own institution’s license guidance and name the local office that answers ownership questions (usually a technology transfer or research office) in place of the UC pointers.
Timebox the license discussion. The teaching target is not license philosophy; it is recognizing no-license risk, choosing a low-risk default for the demo, and knowing when to refer ownership or policy questions to Tech Transfer or the local equivalent. If the room starts debating MIT vs BSD, name the campus default and move on.
Expected UI state: the license template chooser
When the filename is LICENSE, GitHub should offer a
license template chooser (“Choose a license template”). If learners do
not see it, check the filename, that they are creating the file in the
repository root, and a browser refresh before troubleshooting anything
more complex.
Adding a CITATION.cff File
Instructor Note
Show learners what the citation panel looks like on a GitHub
repository that already has a CITATION.cff file. This gives
them a clear target and reduces cognitive load.
Reassure learners that a tiny file is fine. They can refine it later as their software matures.
Why this episode matters to researchers: this is the single highest-return step in the lesson. One small file, committed once, and every future citation of the software is correct, complete, and countable. It is also the step where a scholcomm professional can sit beside a researcher as the expert, because the hard part is metadata judgment, not code.
Common stall: perfecting authorship
Learners may try to perfect authorship, contributor roles, or author order. For the demo, use the provided values and keep moving. For real projects, authorship order is a PI/team decision; the consultant can explain the fields and options but should not decide credit. If someone asks “who counts as an author?”, flag it as a team conversation, not a metadata fix.
YAML recovery path
If more than a few learners hit YAML indentation errors, switch the whole room to cffinit rather than debugging individual whitespace mistakes. The goal is citation metadata, not YAML mastery. cffinit validates as they type and produces a file they can paste.
Predict, then reveal
Before learners refresh GitHub after committing
CITATION.cff, ask them to predict what GitHub will add.
Then reveal the “Cite this repository” panel. This keeps GitHub’s helper
behavior visible as a platform pattern rather than a surprise, and sets
up the “GitHub recognizes certain filenames” idea later.
Making Your Software Citable
Instructor Note
Some learners may feel anxious about creating a DOI.
Reassure them that:
- a DOI is not required for citability
- Zenodo is free and widely used
- they can watch the demo and complete the steps later
Why this episode matters to researchers: this is where journal and funder requirements actually bite. “The journal wants a citable code deposit” means, concretely, a tagged release with a DOI, and after this episode you can say that sentence and demonstrate the twenty-minute path to compliance. The DOI is also the moment their software starts accruing countable citations, the currency their review committees already understand.
Say this out loud before you screen share
Use sandbox.zenodo.org, not production Zenodo. Real
Zenodo records and DOIs are persistent and cannot be deleted, so they
are not appropriate for practice. Say it before you share your screen,
and have helpers watch for learners who land on zenodo.org
by habit.
Do not rush the snapshot idea
This point is subtle and important, so slow down. Say: “GitHub is the live working copy; Zenodo archived what existed at release time.” Then ask a learner to restate, in their own words, the difference between a post-release GitHub edit and the already-archived release snapshot. If they can restate it, they have the key mental model of the episode.
Debrief prompt for support-staff learners
Once the DOI appears, ask: “Which DOI would you tell the researcher to put in the methods section, the version DOI or the concept DOI, and why?” Expected answer: the version DOI for exact reproducibility (the state that produced the results); the concept DOI to refer to the project in general. This turns the mechanic into an advising decision they will actually be asked to make.
Improving Metadata and Discoverability
Pacing: what is hands-on if you are short on time
Make README improvements and GitHub topics the
hands-on work here. Treat .zenodo.json, Software Heritage,
CONTRIBUTING.md, and CODE_OF_CONDUCT.md as
instructor demo or optional reading. In a half-day workshop, do not make
every extension a hands-on task; it is the fastest way to run out of
time before the wrap-up.
Instructor Note
Encourage learners to compare well-described repositories with sparse
ones.
Highlight how even small metadata additions increase visibility in
GitHub search, Zenodo indexing, and DataCite services.
Why this episode matters: this is where a librarian in the room can visibly outperform the researchers, which matters for how the campus sees the service. Researchers usually treat metadata as a form to rush through; a scholcomm professional treats it as the mechanism of discovery. The pitch to the researcher is blunt: the work is finished, and five minutes of description determines whether anyone ever finds it.
Frame .zenodo.json as advanced
Do not present .zenodo.json as required for all
projects. Frame it as an advanced override, used only when Zenodo
metadata needs more control than CITATION.cff provides.
Most learners should leave with CITATION.cff as their one
citation file.
Managing Reproducible Environments with pixi
Take a hard fork here
Citation-focused learners are done with the core lesson after the metadata episode; send them off or into a break. Only full-track learners continue, and they need a local clone and pixi installed. Do not make the whole room troubleshoot installations. State clearly who this episode is for before anyone opens a terminal.
Teaching this optional episode
This episode is last in the lesson order and is the only one that leaves the browser: it needs pixi and a terminal on the learner’s own machine, plus a local clone of their fork. Because the rest of the lesson is browser-only, confirm during setup which learners are prepared for the full track. Anyone who only wants their code cited can stop after the metadata episode with a complete, citable repository.
The optional-pixi
reference branch builds on after-metadata,
so it shows pixi added to an already-finished project. Have learners
view it in the browser for the target pixi.toml and
lockfile, then work along in their local clone. Nothing in the main
project chain depends on pixi, so skipping this episode leaves no loose
ends in anyone’s repository.
Pixi not installed? Learners can follow the concepts without a working pixi installation. The key idea is that a lockfile pins exact dependency versions. That’s the transferable lesson, not the tool itself.
If you skip the hands-on entirely, keep the concept in the room: the R in FAIR quietly depends on this. A deposit that cannot be executed is preserved the way a locked diary is preserved. The question “is there a record of what this needs to run” belongs in the consultation checklist even if the mechanics get referred to research computing.
Assign a helper to install issues
If you are teaching the full track, assign one helper to pixi install and PATH problems. The lead instructor should keep moving with the concept demo and not stop the main room for individual terminal errors. Installation issues are the single most likely time-sink in this episode.
Wrap-Up and Reflection
Instructor Note
Give learners a few minutes of quiet reflection, then facilitate a group discussion. Invite volunteers to share a step they plan to take next.
Closing pitch worth saying out loud: for instructors, the deliverable is not the demo repo, it is a service, a consultation format and a referral map usable the week you get home. For researchers, it is a repeatable habit that costs under an hour per project: every future paper’s code can either be a dead URL in five years or a citable, findable output on your record, and the difference is the checklist you now hold.
Make it a local service map
Have each support-staff learner write down one campus referral they still need to identify after the workshop: Tech Transfer, research computing, the data repository, information security, the grants office, or scholarly communications. Naming a real gap turns the demo into a local service map they can actually use on Monday.