A terminal joke can be understood in one visit. A daily challenge gives someone another reason to return: a concrete broken workflow, a few plausible commands, and an explanation of what the right choice does.

cli.fail puts those pieces together with a deliberately limited system. Its authored challenge bank covers Git, npm, Docker, and shell tools. Each scenario states the relevant environment and offers four choices, followed by an explanation and an official reference.

Make the question carry its context

A command can be right in one situation and wrong in another. A Git question needs to distinguish staged changes from working files. A shell question needs to account for when wildcard expansion happens. Putting those constraints in the scenario makes the answer follow from information the visitor can actually see.

The content is separate from the interaction logic. A new challenge can be reviewed as a question, choices, an answer, and an explanation. Commands are displayed as text; the browser does not run them in a shell.

Give the day a clear boundary

The daily selection follows UTC and a versioned challenge bank. Local results belong to that date and version. Practice remains available separately, so the daily attempt does not have to carry every reason someone might want to use the site.

A result is a personal record in the browser. Sharing leaves out the answer, allowing another person to take the same challenge. Those choices support a complete return visit without requiring an account or a global ranking.

The interesting scope decision is how much useful behavior fits within that boundary: a shared prompt, a fair explanation, a saved result, and another chance to learn in practice.

Explore the cli.fail case study or try the daily challenge.

Follow the work by RSS ↗

Explore the projects ↗