Hi Justine, my colleagues and I ran an eDNA workshop in November and used JupyterHub, which is installed on the national server here in New Zealand. However, we primarily used the command line (through a Hub terminal) to run Qiime commands, as it is easier for beginners than running through Jupyter. We did use notebooks for documentation, example commands, images, and creating plots (mostly in R). In Jupyter we could place the documentation notebook side by side with the terminal. I am running another workshop next month and will try to incorporate some Qiime commands in the notebook. We also teach other methods (e.g Unoise, IdTaxa), some of which run in R and some bash, so it is tough to get a balance of all things, without overwhelming the student.
I definitely see your point about students learning to document their code; one option is to use the bash magic (%%bash) in Jupyter cells to run any commands through the terminal and maintain a record of it. For my own coding, I often send commands from a text document to the terminal using extensions in Visual Studio Code or Sublime Text. However, these extras can be a bit much for students new to coding.
Here we run our basic lessons (basic bash, R, Python) using Software Carpentries methodology, which emphasizes ‘live coding’ (students follow along as you type out commands) as opposed to copy and paste. This works very well for the basics, and I even start them off in Qiime2 coding as you go, however, for longer, more complex commands, this is not practical and they need to write it out on a text editor and then paste into the terminal (or %%bash, etc.). For those we start them out with example commands but assign them the task of putting later commands together with the right inputs.
Sorry for the long response. I am keen to hear what others have done. Every time is a learning experience for me.