Blog

By Topic

academia anecdote aosa book-reviews career
community conferences data-science diversity education
ethics favorite fiction humanities-writing humor
management noticed open-source opinion personal
politics programming proposal research retro
software-carpentry software-engineering student-projects technical-writing workshops

By Year

2020 2021 2022 2023 2024 2025 2026
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
2004 2005 2006 2007 2008 2009

Recent

Iffy

I have started posting chapters from my YA novel Iffy to Wattpad. The first three are now available, and the rest will come out between now and September 26. If you enjoy it, I’d be grateful if you would share it with friends (particularly young ones). I’m also always grateful for feedback.

Looking for Work

A friend and I found out last week that our proposal for some government work wasn’t accepted, so I am once again looking for work. I’m open to both part-time and full-time positions, or long-term contracts, either in downtown Toronto or remote. My last few jobs have included managing software teams, education & training, community management, and programming (mostly Python and SQL). I’d like to help make the world a better place; if you’d like to chat, my details are https://third-bit.com/about/, and you can reach me by email.

Rebooting SDGC: Introduction

While I’m looking for work, I’m going to try writing this series of essays. Feedback is always appreciated.

My best friend died of cancer in 2018 at the age of 52. His death led to these essays in two ways:

  1. The particular kind of cancer he had was mesothelioma, which was almost certainly caused by exposure to asbestos when he was in his teens. Asbestos was widely used in construction for decades: it was cheap, easy to work with, a good insulator, and an excellent fire retardant. It took many years to recognize that it was also killing people, and many more years before victims got compensation, but it is now banned or tightly regulated in most countries.

  2. My friend wasn’t actually killed by his cancer—he was killed by a lethal injection administered by a doctor with his consent after many long discussions with his family. Doctors have probably been helping people end their lives with dignity for as long as there have been doctors, but the practice was illegal and the subject was taboo until quite recently. It is still controversial and tightly regulated, but I think we are all better off now that the conversation is happening in public.

Today, eight years later, some of the worst people in the world are using social media and AI in ways that undermine democracy and our mental health. I think the best way to think about these technologies and how we should manage them is in terms of cognitive pollution. I’m allowed to own and use chemicals like turpentine and acetone, but if I dump them in a stream or put them in your dinner, I expect to be fined or jailed for damaging your physical health. Similarly, if my recommendation algorithm amplifies your eating disorder, or my chatbot teaches you that “no” actually means “make me”, I should be held liable for harming your mental health.

This is a simple argument, but also a dangerous one. A lot of people think that talking about gay or transgender rights is harmful to children. I think they’re wrong, but what gives me the right to draw the line? And just as no single cigarette causes lung cancer, no single meme radicalizes someone, so how do we decide who is liable for what? Finally, even if we agree, how do we get society to change?

I started thinking about these questions in 2017. The UK had begun its long, slow stumble out of Europe, Donald Trump had been inaugurated as president, and the government of Myanmar was using Facebook to incite genocide. Somehow, the Internet had gone from being a way to bring people closer together to being a slow social poison—or rather, we had finally realized that it was both at once, and didn’t know what to do about it.

These essays have taken almost a decade to put together for two reasons. The first is that life happens: between COVID, other projects, and being laid off a couple of times, I never ~found~ made time to focus on it. The more important reason is impostor syndrome. Some of the people I will cite have spent decades thinking about these issues, only to reach the conclusion that, “It’s complicated”. I’m just a tourist, and an impatient one at that: I skim rather than reading deeply, and prefer simple explanations to accurate ones.

After years of searching, though, I haven’t found anything that talks about these issues in a way that will appeal to young programmers who haven’t ever taken a course on politics or sociology but don’t like being made to feel ignorant. I don’t understand everything I’ve read, but I think I understand you. I want you to understand the world so that you can make it better, because that’s the greatest adventure of all time.

In the year I was born most of the world’s people suffered under totalitarian rule, judges could and did order electroshock therapy to “cure” homosexuals, people could legally be denied jobs because of their skin color, and women couldn’t open bank accounts without their husband’s permission. Yes, a lot of things are bad and getting worse, but look at how far we’ve come. Look at how many more choices you have than your grandparents did. Look at how many more things you can know, and be, and enjoy. And most importantly, look at how many other people can too.

That didn’t happen by chance. Every time you buy one brand of t-shirt rather than another or take a minutes to vote you are choosing one future over another. Every time you help someone do something they couldn’t do before, you are giving them more more control over their own life. The world doesn’t get better on its own. It gets better because we make it better: penny by penny, vote by vote, and one lesson at a time.

The climate crisis, mass extinction, surveillance capitalism, inequality on a scale we haven’t seen in a century, the re-emergence of racist nationalism: my generation could have prevented them, but decided that quarterly earnings were more important. The bills for our cowardice, lethargy, and greed are now coming due; as they do, we have left you no easy solutions to these problems.

That doesn’t mean there are no solutions at all, though. The essays that follow will explore a few things I wish I had known earlier: where power comes from, how it is used, how its use is hidden, and how people have held the powerful accountable and made the world a fairer place. I’m not going to try to be comprehensive or even-handed, but I hope you’ll find it informative, entertaining, and inspiring. If you do, or if you have suggestions for improving it, I’d enjoy hearing from you.

ACM Certificate

This arrived out of the blue in today’s mail:

photograph of ACM SIGSOFT certificate

As I wrote when I received the original award, I am very honored, but wish I’d had more impact on how software engineering is taught and how software engineering researchers interact with practitioners. Having just finished packing my daughter’s belongings into a truck so that she can move back to university, I’m going to spend the evening thinking about roads not taken…

Summer Projects Revisited

So how did I do?

  1. Teach Organizational Change in Manchester in July: check.

  2. Teach shutting projects down for the first time: check.

  3. Teach How to Not Be Wrong About AI: no one was interested enough to host it, which surprised me.

  4. Revise and deliver Managing Research Software Projects: revised, but haven’t delivered.

  5. Finish writing Sex and Drugs and Guns and Code: check, for some value of “finished”.

  6. Write Lean for Python Programmers: I abandoned this one and Gleam for Python Programmers; no-one seemed interested in either.

  7. Finish writing The Cloudherd and the Tiger’s Boy: nope. I did finish The Makers Return and Eimin in Medef, though.

  8. Get an agent: nope. This is my biggest disappointment: without an agent, my chances of selling any of my fiction are essentially nil.

  9. Find a job of some kind: I’m still waiting to hear back on a part-time gig with the Canadian government, but nothing else has materialized.

Outline for an SDGC Workshop

This one-day workshop introduces a few ideas that someone with a background in computer science (or tech more generally) needs to know in order to think clearly about the harms of social media and AI, and about how they should be regulated. I would be very grateful for feedback; in particular, I know I’m trying to cram in far too much, and many of my references are probably out of date.

What Else Should I Read?

I would be very grateful for pointers to other recent empirical studies of the impact of AI on programming education that are more rigorous than the gushing slop being tossed around on LinkedIn. I’d be particularly grateful for studies that show negative or neutral results.

download the .bib file

@article{Abdulla2024,
  title = {Using ChatGPT in Teaching Computer Programming and Studying its Impact on Students Performance},
  volume = {22},
  ISSN = {1479-4403},
  url = {http://dx.doi.org/10.34190/ejel.22.6.3380},
  DOI = {10.34190/ejel.22.6.3380},
  number = {6},
  journal = {Electronic Journal of e-Learning},
  publisher = {Academic Conferences and Publishing International Ltd},
  author = {Abdulla, Shubair and Ismail, Sameh and Fawzy, Yasser and Elhag, Abdelrahman},
  year = {2024},
  month = Oct,
  pages = {66–81}
}

@article{Abouelenein2025,
  title = {The R5E pattern: can artificial intelligence enhance programming skills development?},
  volume = {30},
  ISSN = {1573-7608},
  url = {http://dx.doi.org/10.1007/s10639-025-13616-3},
  DOI = {10.1007/s10639-025-13616-3},
  number = {15},
  journal = {Education and Information Technologies},
  publisher = {Springer Science and Business Media LLC},
  author = {Abouelenein, Yousri Attia Mohamed and Ghazala, Ayat Fawzy Ahmed and Mahdy, Eman Mahdy Mohamed and Khalaf, Mohamed Hassan Ragab},
  year = {2025},
  month = June,
  pages = {22177–22205}
}

@inproceedings{Adeeb2025,
  title = {How Do Novice Programmers Solve Code-Tracing Problems When ChatGPT Is Available? A Qualitative Analysis},
  author = {Adeeb, Elmira and Muldner, Kasia},
  booktitle = {Proceedings of the 2025 ACM Conference on International Computing Education Research V.1},
  publisher = {ACM},
  year = {2025},
  month = Aug,
  pages = {421–434},
  DOI = {10.1145/3702652.3744207},
  url = {https://doi.org/10.1145/3702652.3744207}
}

@article{Akapnar2024,
  title = {AI chatbots in programming education: guiding success or encouraging plagiarism},
  volume = {4},
  ISSN = {2731-0809},
  url = {http://dx.doi.org/10.1007/s44163-024-00203-7},
  DOI = {10.1007/s44163-024-00203-7},
  number = {1},
  journal = {Discover Artificial Intelligence},
  publisher = {Springer Science and Business Media LLC},
  author = {Akçapınar, Gökhan and Sidan, Elif},
  year = {2024},
  month = Nov 
}

@article{Alanazi2025a,
  title = {PyChatAI: Enhancing Python Programming Skills—An Empirical Study of a Smart Learning System},
  volume = {14},
  ISSN = {2073-431X},
  url = {http://dx.doi.org/10.3390/computers14050158},
  DOI = {10.3390/computers14050158},
  number = {5},
  journal = {Computers},
  publisher = {MDPI AG},
  author = {Alanazi, Manal and Soh, Ben and Samra, Halima and Li, Alice},
  year = {2025},
  month = Apr,
  pages = {158}
}

@article{Alanazi2025b,
  title = {Examining the Influence of AI on Python Programming Education: An Empirical Study and Analysis of Student Acceptance Through TAM3},
  volume = {14},
  ISSN = {2073-431X},
  url = {http://dx.doi.org/10.3390/computers14100411},
  DOI = {10.3390/computers14100411},
  number = {10},
  journal = {Computers},
  publisher = {MDPI AG},
  author = {Alanazi, Manal and Li, Alice and Samra, Halima and Soh, Ben},
  year = {2025},
  month = Sept,
  pages = {411}
}

@inproceedings{Azaiz2024,
  title = {Feedback-Generation for Programming Exercises With GPT-4},
  author = {Azaiz, Imen and Kiesler, Natalie and Strickroth, Sven},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {31–37},
  DOI = {10.1145/3649217.3653594},
  url = {https://doi.org/10.1145/3649217.3653594}
}

@inproceedings{Benario2025,
  title = {Unlocking Potential with Generative AI Instruction: Investigating Mid-level Software Development Student Perceptions, Behavior, and Adoption},
  author = {Benario, Jamie Gorson and Marroquin, Jenn and Chan, Monica M. and Holmes, Ernest D.V. and Mejia, Daniel},
  booktitle = {Proceedings of the 56th ACM Technical Symposium on Computer Science Education V. 1},
  publisher = {ACM},
  year = {2025},
  month = Feb,
  pages = {395–401},
  DOI = {10.1145/3641554.3701859},
  url = {https://doi.org/10.1145/3641554.3701859}
}

@article{Haindl2024,
  title = {Does ChatGPT Help Novice Programmers Write Better Code? Results From Static Code Analysis},
  volume = {12},
  ISSN = {2169-3536},
  url = {http://dx.doi.org/10.1109/ACCESS.2024.3445432},
  DOI = {10.1109/access.2024.3445432},
  journal = {IEEE Access},
  publisher = {Institute of Electrical and Electronics Engineers (IEEE)},
  author = {Haindl, Philipp and Weinberger, Gerald},
  year = {2024},
  pages = {114146–114156}
}

@article{Jing2024,
  title = {What factors will affect the effectiveness of using ChatGPT to solve programming problems? A quasi-experimental study},
  volume = {11},
  ISSN = {2662-9992},
  url = {http://dx.doi.org/10.1057/s41599-024-02751-w},
  DOI = {10.1057/s41599-024-02751-w},
  number = {1},
  journal = {Humanities and Social Sciences Communications},
  publisher = {Springer Science and Business Media LLC},
  author = {Jing, Yuhui and Wang, Haoming and Chen, Xiaojiao and Wang, Chengliang},
  year = {2024},
  month = Feb 
}

@article{Jost2024,
  title = {The Impact of Large Language Models on Programming Education and Student Learning Outcomes},
  volume = {14},
  ISSN = {2076-3417},
  url = {http://dx.doi.org/10.3390/app14104115},
  DOI = {10.3390/app14104115},
  number = {10},
  journal = {Applied Sciences},
  publisher = {MDPI AG},
  author = {Jošt, Gregor and Taneski, Viktor and Karakatič, Sašo},
  year = {2024},
  month = May,
  pages = {4115}
}

@inproceedings{Kazemitabaar2024,
  series = {CHI’24},
  title = {CodeAid: Evaluating a Classroom Deployment of an LLM-based Programming Assistant that Balances Student and Educator Needs},
  url = {http://dx.doi.org/10.1145/3613904.3642773},
  DOI = {10.1145/3613904.3642773},
  booktitle = {Proceedings of the CHI Conference on Human Factors in Computing Systems},
  publisher = {ACM},
  author = {Kazemitabaar, Majeed and Ye, Runlong and Wang, Xiaoning and Henley, Austin Zachary and Denny, Paul and Craig, Michelle and Grossman, Tovi},
  year = {2024},
  month = May,
  pages = {1–20},
  collection = {CHI ’24}
}

@article{Kosar2024,
  title = {Computer Science Education in ChatGPT Era: Experiences from an Experiment in a Programming Course for Novice Programmers},
  volume = {12},
  ISSN = {2227-7390},
  url = {http://dx.doi.org/10.3390/math12050629},
  DOI = {10.3390/math12050629},
  number = {5},
  journal = {Mathematics},
  publisher = {MDPI AG},
  author = {Kosar, Tomaž and Ostojić, Dragana and Liu, Yu David and Mernik, Marjan},
  year = {2024},
  month = Feb,
  pages = {629}
}

@inproceedings{Koutcheme2024,
  title = {Open Source Language Models Can Provide Feedback: Evaluating LLMs' Ability to Help Students Using GPT-4-As-A-Judge},
  author = {Koutcheme, Charles and Dainese, Nicola and Sarsa, Sami and Hellas, Arto and Leinonen, Juho and Denny, Paul},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {52–58},
  DOI = {10.1145/3649217.3653612},
  url = {https://doi.org/10.1145/3649217.3653612}
}

@inproceedings{Liu2024,
  title = {Can Small Language Models With Retrieval-Augmented Generation Replace Large Language Models When Learning Computer Science?},
  author = {Liu, Suqing and Yu, Zezhu and Huang, Feiran and Bulbulia, Yousef and Bergen, Andreas and Liut, Michael},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {388–393},
  DOI = {10.1145/3649217.3653554},
  url = {https://doi.org/10.1145/3649217.3653554}
}

@inbook{Ma2024,
  title = {Enhancing Programming Education with ChatGPT: A Case Study on Student Perceptions and Interactions in a Python Course},
  ISBN = {9783031643156},
  ISSN = {1865-0937},
  url = {http://dx.doi.org/10.1007/978-3-031-64315-6_9},
  DOI = {10.1007/978-3-031-64315-6_9},
  booktitle = {Artificial Intelligence in Education. Posters and Late Breaking Results, Workshops and Tutorials, Industry and Innovation Tracks, Practitioners, Doctoral Consortium and Blue Sky},
  publisher = {Springer Nature Switzerland},
  author = {Ma, Boxuan and Chen, Li and Konomi, Shin’ichi},
  year = {2024},
  pages = {113–126}
}

@inproceedings{Padurean2026,
  title = {Interleaving Natural Language Prompting with Code Editing for Solving Programming Tasks with Generative AI Models},
  author = {Pădurean, Victor-Alexandru and Gotovos, Alkis and Ghosh, Ahana and Denny, Paul and Leinonen, Juho and Luxton-Reilly, Andrew and Prather, James and Singla, Adish},
  booktitle = {Proceedings of the 31st ACM Conference on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2026},
  month = July,
  pages = {273–279},
  DOI = {10.1145/3803400.3809312},
  url = {https://doi.org/10.1145/3803400.3809312}
}

@inproceedings{Pankiewicz2024,
  series = {ITiCSE'24},
  title = {Navigating Compiler Errors with AI Assistance - A Study of GPT Hints in an Introductory Programming Course},
  url = {http://dx.doi.org/10.1145/3649217.3653608},
  DOI = {10.1145/3649217.3653608},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  author = {Pankiewicz, Maciej and Baker, Ryan S.},
  year = {2024},
  month = July,
  pages = {94–100},
  collection = {ITiCSE 2024}
}

@article{Park2025,
  title = {Code suggestions and explanations in programming learning: Use of ChatGPT and performance},
  volume = {23},
  ISSN = {1472-8117},
  url = {http://dx.doi.org/10.1016/j.ijme.2024.101119},
  DOI = {10.1016/j.ijme.2024.101119},
  number = {2},
  journal = {The International Journal of Management Education},
  publisher = {Elsevier BV},
  author = {Park, Arum and Kim, Taekyung},
  year = {2025},
  month = July,
  pages = {101119}
}

@inproceedings{Prather2024,
  title = {The Widening Gap: The Benefits and Harms of Generative AI for Novice Programmers},
  author = {Prather, James and Reeves, Brent N. and Leinonen, Juho and MacNeil, Stephen and Randrianasolo, Arisoa S. and Becker, Brett A. and Kimmel, Bailey and Wright, Jared and Briggs, Ben},
  booktitle = {Proceedings of the 2024 ACM Conference on International Computing Education Research - Volume 1},
  publisher = {ACM},
  year = {2024},
  month = Aug,
  pages = {469–486},
  DOI = {10.1145/3632620.3671116},
  url = {https://doi.org/10.1145/3632620.3671116}
}

@inproceedings{Sheese2024,
  series = {ACE'24},
  title = {Patterns of Student Help-Seeking When Using a Large Language Model-Powered Programming Assistant},
  url = {http://dx.doi.org/10.1145/3636243.3636249},
  DOI = {10.1145/3636243.3636249},
  booktitle = {Proceedings of the 26th Australasian Computing Education Conference},
  publisher = {ACM},
  author = {Sheese, Brad and Liffiton, Mark and Savelka, Jaromir and Denny, Paul},
  year = {2024},
  month = Jan,
  pages = {49–57},
  collection = {ACE 2024}
}

@inproceedings{Shihab2025,
  title = {The Effects of GitHub Copilot on Computing Students' Programming Effectiveness, Efficiency, and Processes in Brownfield Coding Tasks},
  author = {Shihab, Md Istiak Hossain and Hundhausen, Christopher and Tariq, Ahsun and Haque, Summit and Qiao, Yunhan and Mulanda, Brian Wise},
  booktitle = {Proceedings of the 2025 ACM Conference on International Computing Education Research V.1},
  publisher = {ACM},
  year = {2025},
  month = Aug,
  pages = {407–420},
  DOI = {10.1145/3702652.3744219},
  url = {https://doi.org/10.1145/3702652.3744219}
}

@article{Sun2024,
  title = {Would ChatGPT-facilitated programming mode impact college students’ programming behaviors, performances, and perceptions? An empirical study},
  volume = {21},
  ISSN = {2365-9440},
  url = {http://dx.doi.org/10.1186/s41239-024-00446-5},
  DOI = {10.1186/s41239-024-00446-5},
  number = {1},
  journal = {International Journal of Educational Technology in Higher Education},
  publisher = {Springer Science and Business Media LLC},
  author = {Sun, Dan and Boudouaia, Azzeddine and Zhu, Chengcong and Li, Yan},
  year = {2024},
  month = Feb 
}

@article{Ye2025,
  title = {Improving students’ programming performance: an integrated mind mapping and generative AI chatbot learning approach},
  volume = {12},
  ISSN = {2662-9992},
  url = {http://dx.doi.org/10.1057/s41599-025-04846-4},
  DOI = {10.1057/s41599-025-04846-4},
  number = {1},
  journal = {Humanities and Social Sciences Communications},
  publisher = {Springer Science and Business Media LLC},
  author = {Ye, Xindong and Zhang, Wenyu and Zhou, Yuxin and Li, Xiaozhi and Zhou, Qiang},
  year = {2025},
  month = Apr 
}

@article{Li2025,
  title = {Generative artificial intelligence-supported programming education: Effects on learning performance, self-efficacy and processes},
  ISSN = {1449-3098},
  url = {http://dx.doi.org/10.14742/ajet.9932},
  DOI = {10.14742/ajet.9932},
  journal = {Australasian Journal of Educational Technology},
  publisher = {Australasian Society for Computers in Learning in Tertiary Education},
  author = {Li, Siran and Liu, Jiangyue and Dong, Qianyan},
  year = {2025},
  month = May 
}

@inproceedings{Ramachandra2026,
  title = {Detecting AI-Generated Code in Introductory Programming Courses},
  author = {Ramachandra, Aryan and Chaudhary, Suhani and Tran, Justin and Desai, Riti and Pang, Ashley and Salloum, Mariam},
  booktitle = {Proceedings of the 57th ACM Technical Symposium on Computer Science Education V.1},
  publisher = {ACM},
  year = {2026},
  month = Feb,
  pages = {894–900},
  DOI = {10.1145/3770762.3772522},
  url = {https://doi.org/10.1145/3770762.3772522}
}

@article{Wang2025,
  title = {ChatGPT-enhanced self-regulated learning in programming education: impacts on motivation, self-efficacy, and learning outcomes},
  volume = {34},
  ISSN = {1744-5191},
  url = {http://dx.doi.org/10.1080/10494820.2025.2559919},
  DOI = {10.1080/10494820.2025.2559919},
  number = {5},
  journal = {Interactive Learning Environments},
  publisher = {Informa UK Limited},
  author = {Wang, Zilin and Zou, Di and Zhang, Ruofei and Lee, Lap-Kei and Xie, Haoran and Wang, Fu Lee},
  year = {2025},
  month = Oct,
  pages = {3041–3066}
}

@inproceedings{Yang2024,
  title = {Debugging with an AI Tutor: Investigating Novice Help-seeking Behaviors and Perceived Learning},
  author = {Yang, Stephanie and Zhao, Hanzhang and Xu, Yudian and Brennan, Karen and Schneider, Bertrand},
  booktitle = {Proceedings of the 2024 ACM Conference on International Computing Education Research - Volume 1},
  publisher = {ACM},
  year = {2024},
  month = Aug,
  pages = {84–94},
  DOI = {10.1145/3632620.3671092},
  url = {https://doi.org/10.1145/3632620.3671092}
}

@article{Yang2025,
  title = {The effectiveness of ChatGPT in assisting high school students in programming learning: evidence from a quasi-experimental research},
  volume = {33},
  ISSN = {1744-5191},
  url = {http://dx.doi.org/10.1080/10494820.2025.2450659},
  DOI = {10.1080/10494820.2025.2450659},
  number = {6},
  journal = {Interactive Learning Environments},
  publisher = {Informa UK Limited},
  author = {Yang, Tzu-Chi and Hsu, Yi-Chuan and Wu, Jiun-Yu},
  year = {2025},
  month = Jan,
  pages = {3726–3743}
}

A Quarto Question (or Six)

I am converting the notes for “Managing Research Software Projects” from McCole to Quarto. Most of the changes have gone smoothly, but I’m stuck on a few things and would appreciate guidance. For reference, the materials are in this repository and you can view the rendered version here.

  1. The landing page shows the contents of index.qmd (which is good) but that page shows up as entry #1 in the table of contents (which is bad). I have tried using a # Title heading in index.qmd instead of a title field in the YAML frontmatter, and/or adding.unnumbered, .toc-ignore, and other classes to that H1 heading, but those don’t achieve what I want.
    The closest I can get to what I want is to give ./index.qmd an H1 title Overview and add {.unnumbered} to it. It’s clumsy, in that it still creates an entry in the table of contents, but it’ll do for now.

  2. Each page that has bibliographic citations lists references at the bottom of that page (see for example the Project Health page). I don’t want this: I want all citations to link to the appropriate entry in the bibliography page (e.g., this page in the example project).
    Add link-citations: true under format > html in _quarto.yml, then put :::{#refs}\n::: in bibliography/index.qmd.

  3. Each chapter in the tutorial is in a subdirectory of the root, e.g., ./intro/index.qmd is rendered as ./docs/intro/index.html. I want to have a slide deck alongside each chapter so that (for example) ./intro/slides.qmd would generate ./docs/intro/slides.html. (Each subdirectory is going to contain images, code fragments, and other artefacts that will be included in both the index.qmd prose and the slides.qmd slides. I find it easier to manage these if the two Markdown files are siblings.) I’ve tried setting this up a couple of different ways, but nothing has worked. What do I add to the frontmatter of slides.qmd to tell Quarto “these are slides”, where do I put a custom template for those slides, and what do I add to the _quarto.yml file to create a “Slides” section in the table of contents with links to these files? Or am I going about this in completely the wrong way?
    After a lot of frustration I have concluded that issue 1433 is still accurate: there’s no simple way to do what I want. I’m therefore generating slides by calling pandoc directly. This means the styling isn’t consistent with the main pages, but it’ll do for now.

  4. When Quarto renders the tutorial, it create a 1.1Mbyte directory called ./docs/site_libs with various supporting files (JavaScript, CSS, fonts, etc.). Can I configure Quarto to (a) stop it from creating this directory and (b) have HTML files refer to some absolute URL to find those files instead? I want to do this because I’m going to put the generated files here in the Third Bit site, and want to share one copy of the supporting files rather than have one per workshop. (I’m likely to have seven or eight workshops served from Third Bit once I’m done converting, and 8Mbyte of redundant files makes me squeamish.)
    There doesn’t appear to be a way to configure Quarto to put site_libs where I want it, so I’ve written a little Lua script to replace all references to it in the generated HTML with references to ../quarto/site_libs (with as many ..’s as needed to reach the root of the documents directory). It’s a hack, but it’ll work for now.

  5. I don’t like the way Quarto’s default CSS lays out description lists; for accessibility reasons I’d like notes to be rendered at the same size as main text, and there are probably several other small changes to layout that I’m going to want as well. What’s the best way to manage custom CSS given that I’m going to generate HTML separately for several different projects, but then serve them all from one site as siblings as described above? (I’m less worried about duplication here because the custom CSS will only be a few kilobytes, so this is much less urgent than the site_libs issue.)
    Put css: assets/mccole.css under format>html in _quarto.yml, then create assets/mccole.css and start overriding things there. I’m also modifying links to the assets directory to be ../quarto/assets when I deploy for the reasons discussed in the previous point.

  6. Finally, the glossary for the workshop is in ./glossary/index.qmd, and I use a little bit of custom Lua in ./bin/g.lua to handle the rendering. I’d like to store the glossary in Glosario format instead, and generate HTML from that. I think I know how to do this, but if anyone has already built what I’m after, I’d be grateful for a pointer.

If you have solutions to any of these problems, please give me a shout; thanks in advance for your help.