# The AIMA exercises site is a Jekyll build with a pull-request inbox for student answers

> aima-exercises is the online exercise companion for Artificial Intelligence: A Modern Approach, and it is worth understanding as an infrastructure project rather than a content one: a Jekyll 3 site on Ruby 2.5 whose most interesting moving part is Staticman turning a student form submission into a GitHub pull request. The content is nearly complete and the toolchain is nearly twenty years in.

**aimacode/aima-exercises** — Exercises for the book Artificial Intelligence: A Modern Approach

- Repository: https://github.com/aimacode/aima-exercises
- Stars: 1,100 · Forks: 655
- Language: HTML
- License: NOASSERTION
- Published: 2026-09-30 · Updated: 2026-09-30 · Language: en
- Canonical page: https://hysenlabs.com/projects/aimacode-aima-exercises

## Why the book's exercises moved off the page

The premise is stated plainly in the readme and it is unusual. In the fourth edition of Artificial Intelligence: A Modern Approach the exercises will not appear in the book at all; they will be online only, on this platform, which the project presents as a public home for the exercises and as a place for students and teachers to add new ones. That decision changes what this repository is for. A conventional solutions repository is something you clone and read; this is a website you host, with a chapter-by-chapter table tracking which exercises are implemented, a LaTeX file per chapter, a Markdown folder per chapter, and a figures folder carrying the illustrations. The pairing of LaTeX and Markdown is worth pausing on, because it implies a pipeline in which the typeset source and the web source are maintained together for the same exercise, and that duplication is the main maintenance tax in the repository. The table in the readme walks from chapter 1 Introduction through agents, search, adversarial search, constraint satisfaction and logical agents with an Implemented status on each, so the early chapters are done and the pattern is established even where later coverage is thinner.

## Staticman is the load-bearing part, and it explains the site design

A static site has no backend, so a form on it cannot write to a database. The answer this project uses is a staticman.yml configuration file, described as the configuration for sending automated pull requests whenever a user submits an answer, and the include directory holds staticman_comments.html, which the readme names as the form used for submitting answers. Follow that thread and several other design choices stop being arbitrary. The exercises are stored as files in a git repository, because files in a repository are what a pull request can change. The js directory contains a list of feature scripts, among them answer.js, forms.js, bookmark.js, search.js and commsol.js, so submitting, bookmarking, searching and the Comsol integration are all client-side behaviours that only need a place to post. The cost of this design is the cost of the pattern itself: every answer is a proposed change to a public repository, moderation happens through review, and the availability of the submission path depends on a hosted comment service continuing to accept requests. The readme does not describe what happens to a submission that a maintainer declines, nor whether there is a rate limit or an account requirement, and those are the questions to ask before promising students that they can submit.

## Lunr search, a generated index, and a page that says 404

Search is a separate subsystem rather than a page filter. A search directory holds an index file for rendering results, and search_data.json is described as the search data used by lunr.js, generated by a script that takes into account all the exercises, which means the index is a build artifact and can go stale if the generator is not rerun. The 404.html file exists as an ordinary Jekyll output, and the layouts include an answer-submitted layout, which is a useful detail: the confirmation a student sees after submitting is a rendered page like any other, so the submission flow is visible to the site rather than handled in a popup. The figures and latex directories are the bulk of the content and they are not Jekyll partials, so they are copied rather than processed, which keeps the build simple at the cost of any templating inside the exercise text. The crossref.json file at the repository root is not described in the readme, and it is the kind of cross-reference data that usually drives linked problem statements, so its role is inferable but not documented. For anyone extending the site, the practical order is: add the exercise in Markdown, add the figure, regenerate the search data, and let Staticman create the answers folder entry when a student submits.

## Running it locally: bundler, a Gemfile.lock, and a _site you must not edit

The local instructions are a numbered list that assumes you already have a Ruby development environment, and the two commands that matter are at the end. Installing the gems is done through bundler so the versions come from the checked-in Gemfile.lock, which the readme explains in terms of getting the same versions on another machine rather than the most recent ones:

```bash
gem install Jekyll bundler 
```

```bash
bundle exec Jekyll serve
```

After that the site is served locally and you can submit an answer form against your own checkout, which is the fastest way to check that the Staticman configuration is reachable. Two warnings in the readme deserve to be read as rules rather than as advice. The _site directory is generated output, and the readme says not to change files there because GitHub Pages is compatible with Jekyll and the folder is updated every time the root directory changes, so an edit inside _site will be silently overwritten on the next build and never reach production. The .jekyll-metadata file exists for incremental regeneration, tracking file modification times and inter-document dependencies to shorten build times. It is a build cache committed to the repository, and the practical consequence is that a contributor who changes an include or a layout on one machine and builds on another can get a build that skipped a page it should have rebuilt, so when a change does not appear, delete that file and rebuild before assuming the problem is in the content. The .sass-cache directory at the root is the same idea for stylesheets.

## The real limitation is the runtime, not the exercises

The readme states that the present version uses Jekyll 3 and Ruby 2.5. That single line contains the project's most consequential constraint, because both of those are old enough that a current workstation will not provide them by default, and a hosted static site platform will either pin an old build image or refuse to run them. The instruction to install a full Ruby development environment with platform-specific guides for macOS, Ubuntu and Windows is honest about the effort but does not address the version question, and a developer following it today is likely to end up with a newer Ruby and a bundler resolution that differs from the lock file. This is the failure mode to plan for: not that the site is hard to build, but that it builds differently from the machine it was authored on. The content is unaffected, since the exercises are plain Markdown, LaTeX and images, so the recovery path is straightforward. Clone the repository, copy the Markdown out, and serve it with whatever current static site generator you prefer. The exercise content is a decade of work and does not depend on Jekyll 3; only the site around it does. Anyone planning to rely on the fourth-edition exercises for a course should make that copy before the runtime becomes a blocker rather than after.

## What the exercise status table does and does not tell you

The chapter table is the only progress signal in the repository, and its shape tells you how the project is organised. Each row pairs a chapter name with a LaTeX file in the latex directory and a Markdown file under markdown, plus a status. The readme shows Implemented for the first six chapters, which is the entire first block of the book, so if you are teaching the introductory material the coverage is there. The table is truncated in the readme, which means the later-chapter status is not something the readme itself documents, and the honest reading is that earlier chapters are certainly done and later ones may be partial. A second signal sits in the repository layout: the markdown folder description says each exercise has its own answers folder, and the presence of an answers directory for a given exercise is the concrete evidence that a student has submitted there, which is a more reliable indicator than any badge or count. The distinction between exercises that exist and exercises that have peer answers to compare against matters pedagogically, and this project makes the second category visible as a side effect of its submission mechanism rather than as a curated feature.

## Conclusion

Use aima-exercises if you teach from Artificial Intelligence: A Modern Approach and want the fourth-edition exercises in a form students can submit into, since the chapter table in the readme marks the early chapters as implemented and the answer pipeline already works. Do not adopt it as a starting point for a new static site, because the stack is pinned to Jekyll 3 on Ruby 2.5 and there is no release history to upgrade against, only a last push on 2026-06-23 and whatever fixes the maintainers happen to make. Before you rely on it, confirm three things: which Ruby version your deployment environment actually provides, since the readme names 2.5 and the bundler steps in the instructions assume a matching gem toolchain; where submitted answers are stored, because the Staticman configuration is what routes them and a bot-backed comment service is a dependency you do not control; and the licence, because the repository classification is a custom one while the readme describes the file as MIT, and that discrepancy is worth resolving before you redistribute anything derived from it. The fourth edition's exercises exist only here, which is the strongest argument for mirroring the site yourself if your course depends on it.

## FAQ

### How do I run aima-exercises locally?

Install a Ruby development environment, then install Jekyll and bundler, clone the repository, and run bundle exec Jekyll serve from the project directory. The readme names Jekyll 3 and Ruby 2.5 as the versions this version uses, and links installation guides for macOS, Ubuntu and Windows.

### How are student answers submitted and stored?

A staticman.yml configuration sends an automated pull request whenever a user submits an answer, using a form in the includes directory. Each exercise has its own answers folder under markdown, and the layouts include an answer-submitted layout for the confirmation page.

### What licence is aima-exercises released under?

The repository licence is listed as a custom licence that GitHub cannot classify, while the readme describes LICENSE.md as released under the standard MIT License. That discrepancy is worth resolving before you redistribute anything derived from the exercises.

### Why should I not edit the _site directory?

The readme states that _site is where Jekyll puts the generated site and that it should not be changed while contributing, because GitHub Pages is compatible with Jekyll and the folder is updated every time the root directory folders change. Any edit there is overwritten by the next build.

### Which chapters of the book have implemented exercises?

The readme's chapter table marks the first six chapters as Implemented, from Introduction through Intelligent Agents, Solving Problems By Searching, Beyond Classical Search, Adversarial Search and Constraint Satisfaction Problems. The table is truncated in the readme, so later-chapter status is not documented there.

## Sources

- [aimacode/aima-exercises on GitHub](https://github.com/aimacode/aima-exercises)
- [Issues](https://github.com/aimacode/aima-exercises/issues)
- [README](https://github.com/aimacode/aima-exercises/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/aimacode-aima-exercises
