Open-source project
cs341-illinois/coursebook avatar
cs341-illinois/coursebook

cs341-illinois/coursebook: the Illinois systems programming textbook and how to build it in LaTeX

Open Source Introductory Systems Programming Textbook for the University of Illinois

3,310 stars286 forksTeXLicense varies

At a glance

What is it?
The coursebook is the LaTeX source of the CS 341 systems programming textbook at the University of Illinois Urbana-Champaign, with PDF, HTML, EPUB and wiki exports generated from one tree. It is a book, not a library, and that shapes every adoption decision.
Who is it for?
Adopt it if you teach or study introductory systems programming in C and want a citable, open textbook you can fork: the LaTeX source, the Makefile targets and the pandoc EPUB pipeline are all in the tree, and the last push was on 2026-09-26. Do not adopt it as a general programming primer, as a drop-in textbook for a language other than C, or as a software package with a versioned release cadence; the newest release is fa19 from 2019-08-18.
Can I use it commercially?
Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly TeX, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What the coursebook is, and who it is written for

This is a textbook repository, not a tool. The README describes it as a "high-quality, open-source introductory systems programming textbook" used by CS 341: System Programming at the University of Illinois Urbana-Champaign, and it states the prerequisites plainly: readers should have taken a programming language course and be familiar with assembly instructions. All code and instruction is in C, which the README justifies by calling C the de-facto language of the Linux Kernel.

The stated audience is therefore narrow and honest about it. This is not a first programming book. It is also not a Linux administration guide. The chapter directories in the repository root show the actual scope: processes, threads, synchronization, deadlock, scheduling, ipc, signals, filesystems, networking, security, malloc, background, honors and appendix. That list is a systems course syllabus in directory form.

The README also frames the project as a successor. It says the coursebook is "an aim to standardize and build upon Angrave's original wikibook experiment", and the goals section lists improving quality and rigour while maintaining openness, improving factualness through citations, footnotes, extended reading and a glossary, and producing pdf, markdown and html exports. If you are evaluating it for a course, that lineage matters: the material began as a community wiki and is being reworked into a citable book, and the repository still carries a wiki-deploy.enc file alongside the LaTeX sources.

How the LaTeX source becomes a PDF, an EPUB and a wiki

One tree, several outputs. main.tex is the book source; main_wrapper.tex is the file the Makefile actually compiles, and the Makefile notes that main.tex \input's a generated order.tex. That generated file comes from order.yaml through _scripts/gen_order.py, so chapter order is data, not hand-maintained LaTeX. If you want to reorder or drop a chapter, order.yaml is the file you edit and order.tex is regenerated for you.

The Makefile finds every .tex file one directory down, and it also builds per-chapter PDFs. The chapter rule writes a small temporary wrapper containing \includeonly for that chapter and then runs latexmk, which is what makes single-chapter iteration practical instead of a full-book compile. The default target, make all, builds pdf and epub and then cleans auxiliary files with latexmk -c plus a series of rm commands for aux, bbl, glg, glo, gls, ist, latexmk and fls files, including the nested-directory variants.

The EPUB path is separate and goes through pandoc rather than LaTeX tooling. The Makefile invokes pandoc with --toc, -f latex -t epub, two filters (pandoc-citeproc and _scripts/pandoc_epub_filter.py), link-citations, an EPUB cover image from _images/cover.png, and an author metadata string of "B. Venkatesh, L. Angrave, et Al.". Python dependencies live in requirements.txt: panflute==1.12.5, PyYAML>=4.2b1, Jinja2>=2.10.1, requests==2.33.0 and python-dateutil==2.7.5. Panflute is the pandoc filter library, which is consistent with the custom EPUB filter in _scripts/.

Deployment is not described in the README beyond badges. The badges point at an Actions workflow in .github/workflows/deploy.yaml, a pdf_deploy branch holding main.pdf, an epub_deploy branch holding main.epub, a wiki, and an HTML build at cs341.cs.illinois.edu. The repository also contains site-deploy.enc and wiki-deploy.enc, which by name are encrypted deployment credentials. The README does not explain how those are decrypted, so treat the publish step as something you would have to reconstruct from the workflow file rather than from the documentation.

Building the coursebook locally: a first real use

The README does not list install commands. It says only to read CONTRIBUTING.md for contributing, building and structure. What follows is derived from the Makefile and requirements.txt in the repository, which is the closest thing to documented build steps available here.

You need a TeX distribution providing latexmk and pdflatex, plus Python 3 with pandoc for the EPUB target. The Python dependencies are pinned in requirements.txt, so install them from that file rather than by guessing versions:

bash
python3 -m pip install -r requirements.txt

With those in place, the default target builds the PDF and the EPUB and then cleans up after itself. Run it from the repository root:

bash
make all

The output is main.pdf for the book and main.epub for the EPUB. Because the recipe ends with cleanup commands, do not expect intermediate .aux or .bbl files to survive a successful run; if you are debugging a LaTeX error, use the debug or per-chapter targets instead.

For iterating on one chapter, the Makefile builds individual chapter PDFs named after each .tex file listed in order.yaml. A target such as make processes.pdf compiles only that chapter, using \includeonly inside a generated wrapper, which is much faster than the full book. The epub target can also be run on its own:

bash
make epub

That path is where the Python dependencies matter, since it runs pandoc with the custom filter in _scripts/pandoc_epub_filter.py. If pandoc or the filter fails, the PDF target is unaffected. The README does not document a troubleshooting procedure for either target.

Where the coursebook breaks down as a dependency

The releases tell you most of what you need to know about versioning. There are two: sp19.0, labelled "First version of the coursebook!" and dated 2019-02-02, and fa19, labelled "Coursebook Fall 2019" and dated 2019-08-18. Nothing since. The repository is not archived and the last push was on 2026-09-26, so work continues on master, but there is no tagged artifact a downstream course can pin to. If you need a frozen edition for a semester, you are pinning a commit, not a release.

The EPUB pipeline is the fragile part. It depends on pandoc-citeproc, a filter that has been superseded in the pandoc ecosystem, and on panflute pinned at 1.12.5, a version from the same era as the releases. The Makefile also writes order.tex with a redirect and relies on shell tools like find and sed. None of this is wrong, but it means the EPUB target is the one most likely to need attention on a modern machine, and the README does not document a fallback.

The licence is a real gap. The repository has a LICENSE/ directory, but the licence identifier is not stated in the README and is not given in the metadata available here. For a textbook that other institutions might want to reuse or remix, that is the first thing to resolve, and it cannot be resolved from the README alone. Check LICENSE/ directly.

Finally, the prerequisites are a genuine boundary rather than a caveat. The book assumes prior exposure to assembly and to a programming language course. Handing it to a student who has only written Python will not work, and the book does not pretend otherwise.

Coursebook compared with the wikibook it grew out of

The obvious alternative is the source this project credits: Angrave's SystemProgramming wiki, which the README calls the "original wikibook experiment" that the coursebook aims to standardize and build upon. The difference is in the medium and what each medium optimizes for.

A GitHub wiki is edited in place. Anyone with write access changes the live page, the history is per-page, and there is no build step. That makes it fast to correct a sentence and impossible to cite a stable edition. The coursebook moves the same subject matter into a LaTeX tree with a Makefile, which buys you a compiled PDF with page numbers, a table of contents, a glossary.tex, footnotes and citations, plus an EPUB and HTML export from the same source. The stated goals name exactly this: citations, footnotes, extended reading and a glossary, and exports in pdf, markdown and html.

The cost is the toolchain. A wiki needs a browser. This repository needs a TeX distribution, latexmk, Python 3, pandoc and the pinned packages in requirements.txt before a contributor sees a rendered page. That is the trade the project made deliberately, and it is the right one for a textbook that wants to be cited and assigned, and the wrong one for a page that wants to be fixed in thirty seconds.

A third option, worth naming because it is the default for many courses, is assigning a commercial systems programming textbook and keeping your own notes in a private repository. You get editorial stability and no build pipeline. You give up the ability to fork the text, correct an error in the edition your students are reading, or publish an HTML version alongside the print one. The coursebook exists because that trade was unacceptable to its authors.

Maintenance, licensing and the cost of keeping a fork current

The repository is not archived and the last push was on 2026-09-26, so the master branch is being touched. That is not the same as a release cadence. The two releases are from 2019, and the README's own goal list ("automagically build so writers can focus on writing") describes an editorial workflow rather than a versioned product. If you fork it for your own course, plan to track master and to re-read diffs, because there is no changelog-driven upgrade path. There is a CHANGELOG.md in the tree, but the README does not describe how releases are cut from it.

Upgrade cost concentrates in three places. First, the TeX toolchain: latexmk and pdflatex versions change, and a book this size will surface package conflicts eventually. Second, the EPUB path, which pins panflute==1.12.5 and calls pandoc-citeproc. Third, the Python scripts in _scripts/, which depend on PyYAML, Jinja2, requests and python-dateutil at the versions in requirements.txt. A fork that only needs the PDF can ignore most of the second and third categories, which is worth knowing before you decide the maintenance burden is too high.

On licensing: the repository contains a LICENSE/ directory, and the README does not state which licence applies. The project's stated goal is to maintain openness, and the README credits image and style inspirations from external sources including tex.stackexchange.com and pixabay.com. Those credits suggest the authors care about provenance, but they are not a licence statement. If you intend to redistribute the PDF, remix chapters, or sell printed copies, read LICENSE/ and the individual credits before you do. This is not legal advice; it is a pointer to the file that answers the question.

Editorial conclusion

Adopt it if you teach or study introductory systems programming in C and want a citable, open textbook you can fork: the LaTeX source, the Makefile targets and the pandoc EPUB pipeline are all in the tree, and the last push was on 2026-09-26. Do not adopt it as a general programming primer, as a drop-in textbook for a language other than C, or as a software package with a versioned release cadence; the newest release is fa19 from 2019-08-18. Verify three things before committing: what LICENSE/ contains, which TeX distribution and Python version the build expects (requirements.txt pins panflute==1.12.5 and requests==2.33.0), and whether make epub still runs in your environment given the pandoc-citeproc filter in the Makefile.

Frequently asked questions

What is the cs341-illinois/coursebook?

It is the LaTeX source of an open-source introductory systems programming textbook used by CS 341: System Programming at the University of Illinois Urbana-Champaign. The README states it assumes a prior programming language course and familiarity with assembly, and that all code and instruction is in C.

How do I build the coursebook PDF?

From the repository root, run make all, which builds both the PDF and the EPUB and then cleans auxiliary files. The Makefile compiles main_wrapper.tex with latexmk and produces main.pdf. The README itself points to CONTRIBUTING.md for build instructions rather than listing them.

Is the coursebook the same as Angrave's SystemProgramming wikibook?

No. The README describes the coursebook as an aim to standardize and build upon Angrave's original wikibook experiment, with goals of improving rigour and factualness through citations, footnotes, extended reading and a glossary. The wikibook is edited in place; the coursebook is a LaTeX tree with a build step.

Does the coursebook have a licence?

The repository contains a LICENSE/ directory, but neither the README nor the available metadata states which licence applies. The README does credit external sources for image and style inspiration. Check LICENSE/ directly before redistributing or remixing the text.

Official sources

  1. cs341-illinois/coursebook on GitHub
  2. Issues
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/cs341-illinois-coursebook.svg)](https://hysenlabs.com/projects/cs341-illinois-coursebook)