Resources

(Content to follow; this section will be filled in later.)

October 30, 2026, 3:59 pm

Subsections of Resources

Free assets

Your game looks a lot more professional straight away with good sprites, sound effects and music, and it doesn’t have to cost you anything. Below you’ll find the best places to look for free assets, neatly sorted by category.

Sprites & tilesets

  • Kenney.nl: The absolute favourite. Kenney makes hundreds of sprite packs, tilesets and UI elements, all released as CC0 (public domain). You don’t need to credit anyone and you may use everything in commercial projects too. Start here.
  • OpenGameArt.org: Big community with sprites, tilesets and animations in all kinds of styles. Do check the licence per asset: some are CC0, others CC-BY or CC-BY-SA. Filter by licence so you don’t get surprises.
  • itch.io free game assets: Lots of indie artists put free packs on itch.io. Quality varies, but there are real gems in there. Always read the licence text on the maker’s page.

Sound effects

  • Freesound.org: Huge library of sound effects from all over the world. Filter the search results on “Creative Commons 0” to see only CC0 sounds, then you don’t have to credit anyone.
  • Kenney audio packs: Kenney also delivers ready-made CC0 packs for sound: retro sounds, UI clicks, explosions, everything in one download.
  • sfxr.me: Generate your own 8-bit sound effects in the browser. Click a category (laser, explosion, powerup…), adjust the sliders to your taste and download the .wav. No licence worries: you generate it yourself.

Music

  • Incompetech: Kevin MacLeod composed hundreds of tracks in all genres, from chiptune to orchestra. The music is free to use under CC-BY: you simply mention “Music by Kevin MacLeod (incompetech.com)” somewhere in your credits or README.
  • Pixabay music: Tracks released as CC0 or under their own free licence. You don’t have to credit anyone and you may use it in any project.

Fonts

  • Google Fonts: Thousands of open-source fonts you may download and use for free, in games too. Want a retro look? Search for “pixel” or “monospace” for fonts that work well in Pygame (pygame.font.Font).

Licences explained

Not all “free” assets are the same. These are the three licences you run into most often:

LicenceMay you use it?Attribution needed?Commercial use?
CC0YesNoYes
CC-BYYesYes, mention the authorYes
CC-BY-NCYesYesNo

Practical advice: If you’re in doubt, use CC0. You don’t need permission, you don’t have to credit anyone and you never risk breaking the rules by accident. Kenney.nl is your best friend.


See how we document assets in this project on the Asset licences page.

October 30, 2026, 3:59 pm

Asset licences (this project)

Most assets are CC0 (public domain). Exceptions are listed in the table with licence and required credit text.

Images

FileSourceLicenceAuthorDate downloaded
basket.pngKenney Space Shooter ReduxCC0Kenney (kenney.nl)2026-05-11
star.pngKenney Space Shooter ReduxCC0Kenney (kenney.nl)2026-05-11
ship.pngKenney Space Shooter ReduxCC0Kenney (kenney.nl)2026-05-11
challenges/01-snake/fruits/*.png (9 items)Kenney Food KitCC0Kenney (kenney.nl)2026-05-24

Files live in static/_shared/images/ and are available on the published URL path /_shared/images/<filename>.

Sounds

FileSourceLicenceAuthorDate downloaded
shoot.wavCC02026-05-11
hit.wavCC02026-05-11
explosion.wavCC02026-05-11
pickup.wavCC02026-05-11
jump.wavCC02026-05-11
music.oggincompetech.comCC-BY 4.0Kevin MacLeod2026-05-17

Required credit for music.ogg

“Ethereal Relaxation” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 4.0
creativecommons.org/licenses/by/4.0

How to add assets

  1. Download from a CC0 source (kenney.nl, freesound.org filter Creative Commons 0).
  2. Put it in static/_shared/images/ or static/_shared/sounds/.
  3. Update a row in the table above with source, licence, author, date.
  4. For non-CC0 (e.g. CC-BY): put the credit text under the table.
October 30, 2026, 3:59 pm

Publishing with pygbag

You’ve built a cool game and now you want to share it with the rest of the world. With pygbag you turn your Pygame game into a web page that anyone can play in the browser. No setup, no fuss. Just send a link and you’re done!

What is pygbag?

Pygbag compiles your Python code to WebAssembly and packs it with a small Pygame runtime that runs in the browser. The player doesn’t have to install anything: just open the page and play. That makes it perfect for sharing your game with friends, family or on itch.io.

Limitations

Pygbag does not work with Pgzero (the simplified library from the first sessions). You need real Pygame, so this is available from session 4 onwards.

On top of that, a few things don’t work in the browser:

  • No disk access: you can’t read or write files from inside the game.
  • No threads: don’t use threading or multiprocessing.
  • No blocking calls: everything has to run asynchronously (see below).

Installing

In a uv project:

uv add pygbag

Or in Thonny through the package manager:

pip install pygbag

Getting the project ready

Pygbag requires your main loop to be asynchronous. That means: your main function becomes async def main(), and in every frame iteration you add await asyncio.sleep(0). That one line gives the browser the chance to breathe between frames.

Below you’ll find a ready-made basic structure: Pygbag-ready structure for main.py:

import asyncio
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

async def main():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((30, 30, 60))
        pygame.display.flip()
        clock.tick(60)
        await asyncio.sleep(0)  # required for pygbag

asyncio.run(main())

Adapt your own game code so everything sits inside async def main(), and don’t forget await asyncio.sleep(0) at the bottom of the while loop.

Building

In your terminal, go to the folder with main.py and run:

uv run python -m pygbag --build main.py

The output appears in the build/web/ folder. That folder contains everything you need to host your game.

Testing locally

Want to see whether it works before you publish? Use the same command without --build:

uv run python -m pygbag main.py

Pygbag starts a local web server on http://localhost:8000. Open that link in your browser and you play your own game, exactly the way others will see it.

Publishing

Once everything works, there are two ways to share your game:

  1. Through your coach: zip the build/web/ folder and give the zip file to your coach. They take care of the hosting.
  2. Through itch.io: make a free account on itch.io, create a new project as an HTML game, and upload the zip of build/web/. Within a few minutes your game has its own page that anyone can visit!

Congratulations! You’ve just published a real web game. 🎮

October 30, 2026, 3:59 pm

Translation guide

This site exists in Dutch, French and English. This page explains how the translations fit together, so you can maintain them without breaking the structure.

How the languages are stored

Every page has one file per language, in the same folder:

content/sessions/python/01-catch-the-stars/_index.md      ← Dutch (default language)
content/sessions/python/01-catch-the-stars/_index.en.md   ← English
content/sessions/python/01-catch-the-stars/_index.fr.md   ← French
  • Dutch lives on the root (/sessions/...), French and English under /fr/ and /en/ with the same path.
  • If a translation is missing, the language switcher still shows that language, but takes you to the home page of that language. So there is never a dead link.
  • Adding a new page? Create the three files straight away. title, weight, hidden and description belong in every language; weight and hidden stay identical.

What you don’t translate

  • Code identifiers (basket, star, ship, score) stay English, because they live in the Python file.
  • File names (star.png, boom.wav, starter.zip) stay language-neutral.
  • Product names: Pygame, Pgzéro/Pgzero, Thonny, PyCharm, VS Code, uv, Python, Git, GitHub, pygbag.
  • Dojo terms we use as loanwords: ninja, coach, dojo, cheatsheet, cliffhanger, starter, checkpoint, Dojo Defender.

What you do translate

  • All prose text, headings, titles and description fields.
  • Comments and docstrings in code blocks; identifiers and strings the program really needs stay as they are.
  • Labels of the interactive demos (sliders, canvas texts).
  • Coach notes and the “take it home” suggestions.

Fixed terms

DutchEnglishFrench
sessiesessionsession
uitdagingchallengedéfi
werkbladworksheetfiche de travail
oplossingsolutionsolution
bronnenresourcesressources
installerensetupinstallation
coach-notitiescoach notesnotes du coach
Wat je vandaag leertWhat you’ll learn todayCe que tu vas apprendre aujourd’hui
Neem mee naar huisTake it homeÀ emporter chez toi
Vastgelopen?Stuck?Bloqué ?
Tot de volgende keer!See you next time!À la prochaine !

Tone: Dutch uses “je”, English uses “you”, French uses “tu” (tutoiement) — the texts are for ninjas between 10 and 17 years old.

  • Links to other pages use {{% relref "/sessions/python/01-catch-the-stars" %}}, so they automatically follow the right language.
  • Links to files in static/ (images, demo JS, ZIPs) are absolute and language-neutral.
  • ZIPs with code exist per language: starter.zip (Dutch), starter.en.zip and starter.fr.zip. Every language page links to its own ZIP. Asset packs without code (images.zip, fruits.zip) have no language variant.

Code per language

The source code lives in code/. Comments are Dutch; the translations sit as main.en.py and main.fr.py next to the original. When the ZIPs are built, <naam>.<taal>.py is renamed to <naam>.py and the variants of the other languages are dropped. make zips takes care of that.

Interactive demos

Every demo JS in static/sessions/ has a STRINGS table at the top with Dutch, English and French. The language comes from the lang attribute of the page; without a table or with an unknown language the demo falls back to Dutch.

Check before you push

make build

The build fails on a broken relref. Then go through the three languages of the changed page: title, headings, links and downloads have to work the same in all three.