Skip to content
Brainlag

Projects

Lessons teach one idea at a time. Projects make you glue them together. Each one is a brief, a few milestones and a starter file.

Free briefs

Two small projects per track, started in the playground.

Character stat card

PythonSmall30 min4 milestones

Type a hero's name, class and level, and get their stat card: health, attack, speed, power and rank, worked out with maths, strings and if.

4 milestones
  1. 1The program reads three lines: the hero's name, their class and their level (a whole number). Start with a mage. A level 1 mage has HP 80, ATK 18 and SPD 8. Every level above 1 adds 12 HP, and every two levels above 1 add 1 ATK (so level 7 is 6 levels above 1: +72 HP, +3 ATK). SPD never changes. Power is ATK times SPD divided by 10, rounded to 1 decimal place. Print the card in four lines, exactly like this for Nyx, mage, 7: NYX the mage / Level 7 Rookie / HP 152 | ATK 21 | SPD 8 / Power: 16.8
  2. 2Two more classes, with their own level 1 stats. A warrior has HP 120, ATK 14, SPD 6. A rogue has HP 95, ATK 12, SPD 12. The level rules and the card are the same for every class.
  3. 3The word after the level is the rank: Rookie below level 20, Veteran from 20 to 39, Legend from 40. People type brick and WARRIOR, so ignore spaces at either end, show the name in capitals and the class in lower case.
  4. 4For a class the game does not have, print only Unknown class: bard (the class as cleaned up). For a level below 1 or above 50, print only Level must be 1 to 50. Check the class first.

Gig door checker

PythonSmall40 min4 milestones

Run the door at a 14+ gig: read each fan's age, ticket and arrival time, then decide who gets in, what they pay and which wristband they get.

4 milestones
  1. 1The program reads three lines: the fan's age (a whole number), their ticket (standard, vip or none) and the time they arrive, always written as two digits, a colon and two digits, like 18:35. Turn the time into minutes after midnight with slices and int(). Doors open at 19:00, so someone who arrives earlier gets Doors open at 19:00 (wait 25 min), with the real wait.
  2. 2Under 14s get Sorry, this gig is 14+, whatever time it is. Last entry is 22:30 exactly, so anyone arriving after it gets Sorry, last entry was 22:30. Check the age first, then the time.
  3. 3Everyone else gets in. A vip ticket gets VIP lane, enjoy the show and a standard one gets Welcome, enjoy the show. Anyone without a ticket buys one at the door for 28 pounds, half price for under 18s, and sees Door ticket: 28.00, enjoy the show with the price to two decimal places. Ignore capitals and spaces at either end of the ticket.
  4. 4Everyone who gets in also gets a second line: Wristband: green for 18 and over, Wristband: red, no bar for under 18s.

Band tour poster

WebSmall30 min5 milestones

A poster page for a band's tour: a heading, a photo, the dates in a row of boxes and a link to the tickets. HTML and CSS only.

5 milestones
  1. 1Inside .poster, add an h1 with the band's name, Glass Harbour, and a paragraph with the class tagline that reads Spring tour 2027.
  2. 2Add an image from /assets/noodle/celebrating.svg, 120 pixels wide, with alt text that says what it shows.
  3. 3Add a ul with the class dates holding at least four li, one per show, like 12 Apr Leeds. In the CSS, make .dates a flex row with a 16px gap, flex-wrap: wrap so it fits on a phone, and no bullets.
  4. 4Give every .dates li 12px of padding and a 2px solid border.
  5. 5Add a link with the text Get tickets that goes to https://example.com/glass-harbour. Then give .poster a background colour and a text colour of your choice, so it no longer looks like a plain page.

Game character card

WebSmall40 min5 milestones

A profile card for a game character: name, picture, a row of stats, a link to their story, and a power score worked out in JavaScript.

5 milestones
  1. 1Inside .card, add an h2 with your character's name and an image from /assets/noodle/ (any of the drawings there, like curious.svg), 96 pixels wide, with alt text.
  2. 2Add a ul with the class stats and three li: HP 120, Attack 35 and Speed 18. In the CSS, make .stats a flex row with justify-content: space-between and no bullets.
  3. 3Make .card 300px wide with 16px of padding and a 3px solid border in any colour.
  4. 4Add a link with the text Read the story that jumps to an element further down the card with the id story. Make that element a paragraph with a sentence or two about the character.
  5. 5In the script, store the character's name in hero, 35 in attack and 18 in speed. Let JavaScript work out power as attack times 2 plus speed, then make summary a template literal that reads like Pixel Fox has power 88, and log it.

Festival planner

SQLSmall40 min5 milestones

A three-day festival lineup in one table. Plan your weekend with WHERE, LIKE, DISTINCT and ORDER BY, and the checker tells you which answers are right.

5 milestones
  1. 1List every act playing the Main stage on Sat, in the order they go on. Save it as the view saturday_main with the columns name and start_time. Times are stored like 15:00, so they sort correctly as text.
  2. 2Your friend only remembers that the band had "moon" somewhere in its name, maybe at the start, maybe not. Save every act whose name contains moon as the view moon_acts with the columns name, stage and day. Watch the capitals: one act writes its name in all caps.
  3. 3Save the view genres: one column, genre, each genre once, in alphabetical order.
  4. 4On Sunday you want to skip the main stage but still hear pop, rock or punk. Save the view sunday_side with the columns name, stage and start_time: Sunday acts that are not on the Main stage and whose genre is one of those three, in the order they go on.
  5. 5Save the view long_sets with the columns name, minutes and hours: the three longest sets, longest first, and acts with the same length in alphabetical order. hours is the length in hours, so 90 minutes is 1.5, not 1.

Bit printer

CSmall40 min3 milestones

Print any number in binary using shifts and masks. Once you can see the bits, overflow stops being magic.

3 milestones
  1. 1Write void print_bits(unsigned char x) that prints the 8 bits of x, highest bit first, then a newline.
  2. 2Loop i from 7 down to 0 and print (x >> i) & 1 each time.
  3. 3Run it on 5, 255 and what 255 + 1 becomes in an unsigned char, then on every number in the Input box.

Bigger builds

For when a track's lessons are behind you. A few hours each, with milestones, checks and a starter file, opened in the playground with the brief beside it.

Number guesser

PythonSmall45 min3 milestonesCode

The computer picks a number, you guess, it says higher or lower. Loops, functions and try/except in one small game, built so every part can be checked.

Grade report

PythonSmall40 min4 milestonesCode

Turn a pile of test scores into a tidy report: everyone's mark and grade, the class average and who came top.

Bill splitter

WebSmall45 min3 milestonesCode

Two inputs, one button, one answer. Read values from a form, do some maths, show the result on the page.

One-question quiz

WebSmall40 min3 milestonesCode

A question, three buttons, and a page that tells you if you got it right. Clicks, classList and a bit of CSS.

Playlist stats

SQLTiny30 min3 milestonesCode

Answer questions about a 15-song playlist: top artists, total minutes, the longest song. GROUP BY gets a workout, and the checker tells you which answers are right.

Tuck shop sales

SQLSmall35 min3 milestonesCode

A week of tuck shop sales in two tables. Find the best seller, the busiest day and the snack nobody bought. JOIN, GROUP BY and a LEFT JOIN that earns its keep.

Reverse a string in place

CSmall40 min3 milestonesCode

No library help: find the end of a string yourself, then swap characters from both ends until they meet. The best pointer practice there is.

Text adventure engine

PythonBuild3 hours6 milestonesCode

Rooms as dictionaries, an inventory as a list, and a command handler that moves the player. Build the engine, then write your own story.

To-do list with filters

WebBuild3 hours6 milestonesCode

Add, tick off and delete tasks, filter them and show how many are left. State in one array, the page drawn from it.

Design a school database

SQLBuild2 hours6 milestonesCode

Design tables for students, classes and grades from scratch, then answer the questions a timetable office asks. The checker works on your own design and data.

Write your own malloc

CCapstone4 hours6 milestonesCode

Carve a big byte array into blocks, track what is free, and hand out memory yourself. The best way to understand the heap is to be the heap.

Five-question quiz game

WebBuild2 hours5 milestonesCode

A real quiz: questions drawn from an array, one answer per question, feedback, a running score, a results screen and Play again.

Flashcards that learn with you

WebBuild2 hours5 milestonesCode

A Spanish vocab deck you can flip, browse with the keyboard and sort into "know it" and "again" until every card is learned.

Film night picker

WebCapstone4 hours6 milestonesCode

A whole app on top of a real-shaped API: load films, filter by genre, open details, vote, remember your votes, and keep working when a request fails.

Snake on a canvas

WebBuild3 hours6 milestonesCode

The classic game, built properly: game state in plain objects, a step function you can test, drawing on a canvas, arrow keys and a game loop.

Listening stats dashboard

WebBuild3 hours5 milestonesCode

A dashboard for a week of music plays: pure functions for the numbers, stat tiles, a top five table, a bar chart drawn from data and a week switcher.

Quiz engine

PythonBuild2 hours4 milestonesCode

Questions live in a JSON file, answers come from input(), and the engine marks them, forgives capitals and spaces, and scores you topic by topic.

Streaming data analyser

PythonBuild3 hours5 milestonesCode

A week of real-looking listening data from a music app, typos and all. Clean it, count it, rank it, and write a report another program can read.

Command-line expense tracker

PythonBuild3 hours5 milestonesCode

A small tool you drive with typed commands, like a real terminal program: add spending, list it, total it by category, undo mistakes and save to a JSON file.

Five-a-side league manager

PythonCapstone5 hours5 milestonesCode

Run a five-a-side league from the command line: players inside teams inside a league, typed commands, a live table, top scorers and a save file. You design the classes; the checks only test what they can see from outside.

Build a music database

SQLBuild2.5 hours6 milestonesCode

A streaming service exported its library as one flat table. Normalise it into artists, albums and tracks, then build the views and the index its app needs.

Game library

SQLBuild2.5 hours6 milestonesCode

The game launcher wants a library: which player owns which game, what they spent, who never plays what they bought, and the champion of every genre.

Shop analytics dashboard

SQLCapstone4 hours8 milestonesCode

Six months of an online shop's orders and one request from its owner: a dashboard she can trust. You decide how to build it; the checks tell you when each panel is right.

Playlist as a linked list

CBuild2 hours5 milestonesCode

A music queue built from heap nodes and next pointers: add songs, play one next, remove, reverse and free the lot without a single leak.

Word counter with a hash table

CBuild2.5 hours5 milestonesCode

Count every word of a short story in a hash table you build yourself: buckets, chains, a top ten with qsort, and stats that show how well the hash spreads.

A mini shell

CCapstone4 hours5 milestonesCode

Build the part of a shell that reads a command line: split it into words, look commands up in a table of function pointers, expand variables, keep history and walk directories.