PiriGram
Puzzle game by PiriGramFree in the browser

PurrJar

A calm sorting puzzle with Piri the kitten. Balls of yarn sit mixed up in glass jars, and you move them one at a time until every jar holds a single colour.

Free in any modern browser, on a phone or a computer, in nine languages. No ads in the browser. The iPhone and Android apps are on their way.

An early level: six glass jars on wicker bases holding mixed balls of blue, red, yellow, pink and green yarn, one jar tied with a blue ribbon, and the Undo, Hint, Shuffle, Jar and Restart buttons below.
Early levels sit on wicker.
A level with two black balls marked with a question mark, hiding their colour until the ball above them moves away.
Black balls hide their colour.
Level 35: test tubes of three heights, and Piri explaining that a jar closes only when one colour fills it, three balls for a small jar and five for a tall one.
Some colours have three balls, some five.
A level of round bottles, two of them tied with ribbons that open when a jar of the ribbon's colour closes.
A ribbon opens when its colour closes.
A later level of tubes that bend, each holding a few balls of yarn.
Later, the tubes start to bend.

How to play

  • Tap a jar and its top ball lifts. Tap another jar to drop it there.
  • A ball lands only on a ball of its own colour or in an empty jar.
  • A jar closes when it is full and holds one colour. Most colours have four balls and most jars hold four. From level 35 some colours have three or five, and only a jar of the same size closes on them.
  • Close every jar to finish the level, and Piri celebrates.

New twists arrive one at a time, and Piri explains each one the first time it appears: a wide jar that takes every ball of one colour, a jar tied with a ribbon that opens when its colour closes, and black balls that hide their colour until the ball above them moves.

What is in the game today

  • A hundred levels that open one after another, from jars on wicker to bottles, test tubes, flasks and tubes that bend. A solver has checked every one, so every level can be finished.
  • Undo, Hint, Shuffle and an extra jar, paid for with treats you earn by playing. Restart is always free.
  • Piri’s daily gift, which grows over seven days in a row, badges, and a profile.
  • Nine languages. Progress stays on your device, and once the game has loaded it plays without a connection.

Having trouble? See PurrJar help.

Behind the build

One rule engine for the browser and the phones, and a solver behind every level

My role
Game design, product, architecture
Built with
Claude Code agents I direct
Stack
TypeScript, canvas, Capacitor
Runs on
Browser; iPhone and Android on the way
Server
None yet: it all runs on the device
Hosting
Azure Static Web Apps, GitHub Actions
Tests
109 unit tests, 12 browser tests
Levels
100, each checked by the solver

One rule engine

The rule, the solver and the hint live in one small TypeScript package. The page in the browser and the apps both run that same package, so a move means the same thing everywhere, and the tests that hold the rule hold every version of the game.

A solver behind every level

Before a level ships, the solver finds the shortest way to finish it, and the build checks that every one of the hundred levels can be finished and that its record matches. The same solver gives the hint on the phone, without a connection. When the rule grew to colours of three and five balls, all hundred levels were checked again under the new rule, and the shortest way through each older level stayed the same.

Built on PopSkip

PurrJar reuses what PopSkip had already proven: the app shell, the optional-video flow with its consent steps, and the way nine languages are written and checked. That is why it went from a first prototype to a working Android build in a few days.

Questions about how PurrJar is built are welcome through the contact form.