25 September 2025
teleport
GitHub ActionGitHub actions are a way to run code automatically in response to events on GitHub. Triggers include:
In EBS many of us are managing all our teaching materials in GitHub repos.
The slides and tutorials obviously need to be public, but assignment solutions should not
When I started at EBS, we had a version of option 3 using the copycat
action. Sadly this action is no longer maintained.
teleport
My first draft of this was a manual implementation which effectively:
rsync
to copy files from one repo to a specific directory in anothersteps:
- name: Checkout source repo
uses: actions/checkout@v4
with:
repository: ${{ github.repository }}
path: source
- name: Checkout target repo
uses: actions/checkout@v4
with:
repository: spectrum-spark/courses
path: target-repo
token: ${{ secrets.PERSONAL_TOKEN }} # Personal Access Token with repo write perms
- name: Copy files
run: |
mkdir -p target-repo/courses/intro-mathematical-modelling
rsync -av --delete source/student_materials/ target-repo/courses/intro-mathematical-modelling
- name: Commit & push changes
working-directory: target-repo
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "Sync directory from source repo" || echo "No changes to commit"
git push
teleport
Bundled into an action, you can now just add this to your workflow:
The token needs the following scopes:
There are also some semantics about trailing /
in paths, see the README for details.
See the action online: MikeLydeamore/teleport
Now deployed in:
And one dayTM it’s how I will deploy my slides.
unilur
quarto filterOne of the principles of reproducibility is to reduce duplication
If you use a variable more than once, define it once and refer to it
My repo looked something like this:
tutorials
├── 01-questions.qmd
├── 01-solutions.qmd
And the content in questions
and solutions
was almost identical, except for the answers.
unilur
In the world of RMarkdown, an output format called unilur
exists koncina/unilur
unilur
quarto filterAurélien Ginolhac has ported this to Quarto as a filter: ginolhac/unilur, and I have added support for various output formats:
unilur
quarto filter::: {.solution}
#| solution: true
You can also use unilur-comment
to add comments that only appear in solutions such as marking guides
git
.qmd
files is not very user friendlyOne approach: Use HTML comments (which never render in any format) to give feedback.
Problem: Finding these comments again!
MikeLydeamore/code-comment-viewer-extension
You can hover and click on comments to jump your document to them.
ggplot
battlesCode golf is a game where the aim is to solve a problem as quickly, and often in as few characters of code as possible.
In my opinion few characters is a poor metric, but speed, and accuracy are interesting.
See for example CSSBattle
I built ggplot
battles to gamify learning ggplot2
.
Available at: https://www.ggplotbattles.dev
This involved:
webr
working in pure javascriptggplot
s, which is way harder than it soundsresemble.js
More challenges = more good
Instructions are on GitHub, but if you can write a qmd
you can write these.
The build system is entirely custom, and will likely break, but for now I remain the gatekeeper of all things ggplot
battles.
I’m rolling this out in my communication unit. You are welcome to do the same, or try on your own.
Currently, there is no leaderboard or unified scoring system, but maybe it will come.
Why spend time doing this?
Credit to Fonti Kar
Comment Viewer Positron Extension
How good are tracked changes though?