Skip to main content

whatsnewt

A TUI text adventure through what's new in Python 3.15.

You wake up in the Startup Foyer, somewhere inside the interpreter, and work your way to the Release Gate. Along the way there are eighteen puzzles, and every one of them is a real 3.15 feature you have to actually use. You're not just answering boring questions, you're actually writing and running code, in a Python 3.15 interpreter.

Some puzzles require a type checker, and in those cases, answers are verified by pyrefly, which is a dependency for exactly that reason, and the verdict quotes what it says back.

Here's an example of what the scoreboard looks like:

┌─ The Hall of Imports ──────────────────┬─ Progress ─────────────────────────┐
│ A hall the size of a cathedral, stacked│ Score    40 / 375                  │
│ to the vaulting with packages.  The    │ Puzzles  2 / 18                    │
│ moment anyone steps through the door,  │ Sigils   2 / 6                     │
│ every lid in the building flies open at│ Rooms    7 / 15                    │
│ once...                                ├─ Carrying ─────────────────────────┤
│                                        │ * the lazy lantern                 │
│ Puzzle: The packages that open         │ * the frozen seal                  │
│ themselves (PEP 810)                   ├─ Map ──────────────────────────────┤
│                                        │                ?                   │
│ > solve                                │   Crypt   -  Loop↓        ?        │
│                                        │                |                   │
│                                        │     ?       Gardens       ?        │
│                                        │                |                   │
│                                        │   Vault   ->Imports< -  Babel↑     │
│                                        │                |                   │
│                                        │              Foyer        ?        │
└────────────────────────────────────────┴────────────────────────────────────┘

Play the game

The easiest way to run it is directly from PyPI. Ensure you have uv installed and then run this:

$ uvx --python 3.15 whatsnewt

From a git clone there's a shim script which fetches CPython 3.15 if that version isn't installed on your path, creates all the necessary virtual environments, installs all the necessary dependencies, and runs the game as an editable install right where you are:

$ ./play

Useful flags, passed straight through by ./play:

Flag What it does
--text Play in a plain scrolling terminal instead of full screen
--load FILE Resume a saved game by name
--theme NAME textual-light, gruvbox, … — ctrl+p switches it while playing
--reset ROOM Unsolve a room so it can be played again — vault, the vault or Builtins, or all. Repeatable. Puts back the points and the reward too

Tab completes at the prompt: verbs first, then whatever the verb can take here -- ex<tab> gives examine, and examine st<tab> finds the staircase if this room has one. Ambiguous prefixes fill in as far as they agree and then show you the choice.

There are many clickable links sprinkled throughout, which can provide clues in the Python 3.15 documentation or various PEPs. Some of the puzzles are tricky or obscure, but you should have enough clues available to get you through the game.

The game works best in a 112x40 terminal or larger, but it adjusts and works in terminals down to 80x24.

On Windows, the puzzle editor shows plain text instead of highlighted code. The highlighting comes from tree-sitter, which has no Windows wheel for Python 3.15 yet, and building it from source needs a C++ compiler (GL#6). If you have one, such as Visual Studio's C++ build tools, you can ask for the highlighting yourself:

> uvx --python 3.15 --with "textual[syntax]" whatsnewt

or, if you installed whatsnewt into a virtual environment, run python -m pip install "textual[syntax]" in that environment.

Yes, there are easter eggs!

It needs Python 3.15

Since almost every puzzle is checked by running your answer against the feature the room explores, you actually need Python 3.15. Pre-release versions are acceptable, but stick to betas or release candidates so you're testing post feature-freeze.

Note that reading your source is part of how answers are checked: most of these puzzles have a boring answer that produces the right value, so the checker looks at how you got there as well as what you got. For example, a nested for loop that flattens correctly is still not what PEP 798 is for.

Commands

There are many commands, which help can explain, but in brief:

  • Navigation through the map: north, south, east, west, up, and down
  • Interacting with things: look, examine <thing>, take, drop
  • Checking status: inventory, map, score
  • Game play: save, load, quit
  • Puzzlin': solve, hint (cost points!)
  • Who made it, and where to report a bug: about

I'll neither confirm nor deny any rumors of easter eggs!

Keys follow Emacs where Emacs has an opinion: ctrl+g aborts whatever puzzle is open, ctrl+h is help, ctrl+l re-shows the room, ctrl+r opens a puzzle — and checks your answer once you are inside it. The function keys still work, and every one of them is a command you can type instead.

Inside the code editor: ctrl+r checks your answer, ctrl+h buys a hint for a point, ctrl+o hands the draft to $EDITOR and takes back whatever you save, and ctrl+g closes the window, keeping your draft for next time.

ctrl+o only suspends the game for editors that need the terminal. If yours opens a window of its own — emacsclient, code --wait, subl -w — the game stays up while you type, and takes the draft back when you save. Set WHATSNEWT_EDITOR_WINDOWED=1 (or =0) if the guess is wrong for yours.

Saving

The game saves itself after anything that changes it, so quitting, closing the terminal or losing the window costs you nothing — including whatever you had half-written in a puzzle editor. It writes to $XDG_STATE_HOME/whatsnewt/, falling back to ~/.local/state/whatsnewt/, rather than the working directory, since ./play deliberately runs from anywhere.

Start it again and it offers to resume your game. Declining doesn't throw it away: the old game is moved to previous-game.json beside it, so a mis-click is recoverable. save <file> and --load FILE still work for games you want to keep by name.

What it covers

Spoiler alert — expand to see which feature each room is about.
Room Feature
The Startup Foyer PEP 829 — package startup configuration files
The Hall of Imports PEP 810 — explicit lazy imports
The Builtins Vault PEP 814 frozendict, PEP 661 sentinel
The Encoding Tower of Babel PEP 686 — UTF-8 as the default encoding
The Scriptorium Unicode 17.0.0 and unicodedata.iter_graphemes
The Threading Weir threading.serialize_iterator and friends
The Comprehension Gardens PEP 798 — unpacking in comprehensions
The Typing Sanctum PEP 728 TypedDict, PEP 747 TypeForm, PEP 800 disjoint_base
The Forge the upgraded JIT, mimalloc, bytearray.take_bytes
The Numerarium PEP 791 — math.integer
The Observatory PEP 799 — Tachyon, and PEP 831 frame pointers
The Deprecation Crypt what 3.15 removed
The Great Loop rather more color than there used to be
The Error Oracle improved error messages, re.prefixmatch
The Release Gate all of it, at once

There are souvenirs lying around the place which cover other topics not puzzled: abi3t, unicodedata.block(), slice[int], zlib.crc32_combine, the colored REPL completer.

Development

The project is managed by Hatch. You can

$ hatch run all

to run the test suite and static analysis checks.

Everything the game teaches is answerable from Doc/whatsnew/3.15.rst.

Feedback is greatly appreciated, especially if you find bugs or inaccuracies in what the game teaches.

Author

whatsnewt is Copyright (C) 2026 Barry Warsaw barry@python.org

Licensed under the terms of the Apache License Version 2.0. See the LICENSE file for details.

The game was largely co-written with Claude, so maybe Barry should be considered a Director or Producer in the music and film sense of the word. The game has been test run by Barry and several prominent Pythonistas.

Project details

Metadata

Release files for whatsnewt 3.15.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for whatsnewt 3.15.1
File Size Uploaded
whatsnewt-3.15.1.tar.gz 131.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for whatsnewt 3.15.1
File Interpreter ABI Platform
whatsnewt-3.15.1-py3-none-any.whl Python 3 none any Details

Total release size: 222.3 kB

Release files / whatsnewt-3.15.1.tar.gz

Download URL whatsnewt-3.15.1.tar.gz
Size 131.0 kB
Tags Source
SHA-256 checksum
How to use checksums
b726be3f4b92013d890520703543de0c1c7ecd68657453b1c6194fb32f993f44
BLAKE2b-256 checksum
How to use checksums
8adc647471ae206bebd295e73d5b313b7933a7fafd5907d3048c9942a16b5ba9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / whatsnewt-3.15.1-py3-none-any.whl

Download URL whatsnewt-3.15.1-py3-none-any.whl
Size 91.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
51b4e2e310482852df05c3684b47bccbcc0435e6dbe22f4656ee219ab52b5682
BLAKE2b-256 checksum
How to use checksums
db1024cc9b65bd7859683f054f6bb309e2d7d4e7d4377fc71cd12f5baccab221
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

3.15.4

2 release files

3.15.3

2 release files

This release

3.15.1 This release

2 release files

3.15.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page