Key takeaways
- Each D-pad press sails every free boat until the shore, a rock or another boat stops it.
- Par is the true minimum, found by breadth-first search over every position the boats can reach.
- Undone gusts and gusts before a restart still count, so three stars needs a clean run.
- Par rises from 4 or 5 on Monday, with two boats, to 10 to 12 on Sunday, with four.
- The result card shows one square per gust and never the harbor, so sharing it spoils nothing.
Paper Harbor is a daily puzzle game for iPhone and iPad inside Bitfold, our retro console app, which is free on the App Store. A new harbor opens at midnight, the same for everyone, and each press of the D-pad is a gust that sails every free paper boat until it bumps into the shore, a rock or another boat. You dock each boat at its own pier in as few gusts as you can. Par is the true minimum, found by a breadth-first search before the puzzle shipped, and every gust counts, even the ones you undo. Hitting par on a Paper Harbor puzzle takes a clean run, planned before the first gust.
Paper Harbor is the eleventh of the twelve Bitfold Originals, the games we wrote for Bitfold, and it arrived in Bitfold 1.1 on 6 November 2026. The app has no ads or accounts. Paper Harbor plays only in the app, though the free browser player runs three other Originals for five minutes a day if you’d like to try Bitfold first.
This guide covers the rules, par and stars, the weekly difficulty curve, a worked example and tips, then how the puzzles are made and checked. It ends with a checklist.
How the Paper Harbor puzzle works
The harbor is 8 × 7 cells of open water, rocks and reeds inside a sandy shore. Two to four paper boats sit on the water, each with its own pier. A boat and its pier share a colour and a symbol (a red heart, a yellow sun, a blue moon or a green leaf), so they read on monochrome original hardware and without colour vision. The rules, from the game’s code:
- A gust blows every boat that isn’t moored in its direction, and each sails until the next cell is the shore, a rock or another boat.
- Boats move front first, so a boat behind stops right behind the one ahead.
- A boat that sails onto its own pier moors there for good, even mid-sail, and other boats bump into it from then on.
- Other boats sail straight over a free pier.
- A boat that sails into reeds stops in them, and the next gust takes it out.
- A gust that moves nothing doesn’t count. Every other gust does, including the ones you undo and the ones before a restart.
B undoes the last gust, up to 60 back but never past a restart. Start pauses the game, and the pause menu can start the harbor again.
Paper Harbor par, stars and why undo still counts
Par is the fewest gusts that dock every boat, and it’s exact, because every harbor was solved by exhaustive search before it shipped. Three stars are for docking at par. Two are for docking within par plus the larger of 3 and half of par, rounded down, so up to 7 gusts at par 4, 12 at par 8 and 18 at par 12. One star is for docking at all. Above the harbor, a star goes out as your count passes par and another as it passes the two-star limit.
Undo and restart add no gusts and give none back, so the count on your card is every gust you blew, across every try. Three stars needs a run with no wasted gust from the first press, so it pays to work the whole line out before you touch the D-pad.
How the harbors get harder from Monday to Sunday
Today’s harbor follows your local date. Each weekday has its own set of 104 harbors, two years of weeks, and its own settings in the puzzle generator. The table lists them, with the two-star limits from the star rule.
| Day | Boats | Rocks | Reeds | Par | Two stars up to | Extra checks |
|---|---|---|---|---|---|---|
| Monday | 2 | 5 to 9 | 0 | 4 or 5 | 7 or 8 gusts | None |
| Tuesday | 2 or 3 | 6 to 10 | 0 or 1 | 5 or 6 | 8 or 9 | A dead end |
| Wednesday | 3 | 6 to 11 | 0 or 1 | 6 or 7 | 9 or 10 | A dead end |
| Thursday | 3 | 7 to 12 | 1 or 2 | 7 or 8 | 10 or 12 | A dead end |
| Friday | 3 | 8 to 13 | 0 to 2 | 8 or 9 | 12 or 13 | A dead end and a stopper |
| Saturday | 3 or 4 | 8 to 13 | 0 to 2 | 9 or 10 | 13 or 15 | A dead end and a stopper |
| Sunday | 4 | 8 to 14 | 0 to 3 | 10 to 12 | 15 to 18 | A dead end, a stopper and one good first gust |
A dead end is a position you can reach from which the harbor can’t be finished, so you have to undo or restart out of it. Every harbor from Tuesday on has one, and so do 59 of the 104 Monday harbors. A stopper means some boat can’t reach its pier alone and needs another boat to stop it. On Sunday only one opening gust starts a shortest solution, where other days allow two.
The positions climb steeply as boats are added. The median Monday harbor has about 64 that the boats can reach, the median Sunday harbor about 9,400 and the largest 48,622. Sunday’s par is 10 in 39 of its harbors, 11 in 43 and 12 in 22. Harbors are numbered from 1 January 2026, so 6 November 2026, the day Bitfold 1.1 came out, brings No. 310, a Friday harbor.
A worked example from the second lesson
The game’s three lessons start by themselves the first time you play and stay on How to Play after that. Below is the second, taken from the generator’s source and checked with the game’s solver. Dots are water, # is a rock, capitals are boats, lower-case letters their piers and * a moored boat. A is the red heart boat and B the yellow sun boat, and the hint reads “Boats bump into boats. Use the sun!”
Start Gust right Gust down
........ ........ ........
A....B#. ....AB#. ......#.
........ ........ ........
........ ........ ........
........ ........ ........
....a... ....a... ....*...
.....b.. .....b.. .....*..
Par is 2. On the right gust B moves first, being in front, but the rock holds it, so A sails until it bumps into B and stops directly above its pier. The down gust moors both. Blowing down first takes three gusts.
Gust down Gust right Gust up
........ ........ ........
......#. ......#. ......#.
........ ........ ........
........ ........ ........
........ ........ ........
....a... ....a... ....*...
A....*.. ....A*.. .....*..
B moors at once and A runs to the bottom-left corner. The right gust takes A along the bottom row until it bumps into the moored B, one cell below its pier, and the up gust moors it. Both lines use the sun boat as A’s stopper, first while the rock holds it and then once it has moored.
The third lesson is about undo. One boat starts on the left edge, level with a patch of reeds four cells away, and its pier is two cells below the reeds. Right, then down, docks it in two. Up or down first sends it into a corner it can never sail home from, and 11 of the 16 positions it can reach are dead ends like that.
Paper Harbor tips for docking at par
Each of these follows from the rules or from the generator’s checks.
- Start from the piers. A boat moors as soon as it sails onto its pier, so it only has to stop somewhere in the pier’s row or column, with open water between, then be blown toward it. Look along each pier’s lines for cells where a boat could stop.
- Find the stopper. If a boat can’t stop in any of its pier’s lines alone, another boat has to stop it, as the sun boat does in the second lesson. Every harbor from Friday on has a boat like that.
- Follow every boat. The gust you blow for one boat moves all the others, so trace each one before you press.
- Treat a moored boat as a rock. Mooring one early gives the others something to stop against, and leaving it free keeps its lanes open.
- Line boats up on purpose. Boats blown the same way along one line end up nose to tail, so the second stops one cell short of the first.
- Get the first gust right. No first gust docks two boats, at most two start a shortest solution, and on Sunday only one does. In 69 of the 728 harbors, one of the possible first gusts leads straight into a dead end.
- Undo the moment you’re stuck. Undo costs nothing, and every gust blown from a dead end is wasted.
- Don’t tap ahead. A press during a sail is blown as soon as the boats stop.
The result card, the streak and the stamp book
When the last boat moors, the result card shows the harbor’s number and date, your gusts, par and stars, with “Perfect!” for three, “Shipshape!” for two and “Safe harbor” for one. Each gust is a square, filled when it docked a boat and crossed out when you undid it, with a new row after each restart. Below them are your streak, the time you spent sailing and a countdown to the next harbor. A harbor docked after its day says “Docked late”.
The card never shows the harbor, so sharing it spoils nothing. In Bitfold, open the menu with the menu button on the console, tap Photo, then Share. The card stays on the title menu all day, and a docked harbor opens its card instead of letting you sail it again.
Your streak counts harbors docked on their own day in a row, up to today, or to yesterday while today’s is still waiting, and the game keeps your best. A harbor started late in the evening still counts for its own day if you dock it before the next day ends, as long as you stay in it until it’s docked. After midnight, Today’s harbor on the menu opens the new day’s.
The stamp book is a calendar, a month to a page. A harbor docked on its day gets a gold, silver or bronze seal by its stars, one docked later a hollow seal and a missed one a dot. You can sail any missed harbor from the book, back to 1 January 2026, so a new player on 6 November 2026 has 309 waiting, though they don’t count toward the streak.
How the solver finds par
Par comes from a breadth-first search, run once when the puzzles were made. A position is where every boat is, and each position has at most four moves, one per gust direction. A gust that moves nothing isn’t a move, which is why the game doesn’t count it either. Breadth-first search visits positions in order of how many gusts they take, so the first time it reaches the solved position, its count is the minimum.
from collections import deque
def par(start, is_solved, gust):
"""Fewest gusts from start to a solved position, or None if there is none."""
gusts = {start: 0}
queue = deque([start])
while queue:
here = queue.popleft()
if is_solved(here):
return gusts[here]
for direction in "URDL":
there = gust(here, direction)
if there != here and there not in gusts: # a gust that moves nothing isn't a move
gusts[there] = gusts[here] + 1
queue.append(there)
return None
The game’s solver, harbor_solver.py, goes further. It finds every reachable position, then walks the moves backwards from the solved one to give each its distance to the finish. Par is the start’s distance, positions with no distance are the dead ends, and counting routes through the distances gives the number of shortest solutions. The generator drops any candidate with more than 150,000 reachable positions, so exploring everything stays cheap.
The cartridge never searches. It stores each harbor’s par, and its C code applies the same rules as the solver’s Python, even breaking a tie between two boats equally far ahead the way Python’s stable sort does, by boat order.
The checks a harbor passes before it ships
The generator, make_puzzles.py, builds candidates from fixed seeds. Rocks go down in clusters of one to four cells, making little islands and spits off the shore, and then reeds, piers and boats go on free water. A candidate is kept only if it passes these checks, in this order.
- All the open water is connected.
- No first gust docks more than one boat.
- From Friday on, some boat needs another as its stopper.
- It’s solvable within 150,000 positions, with par in the day’s range.
- It has at most 10 shortest solutions, 8 on Wednesday and Thursday and 6 from Friday.
- Along one shortest solution, at least 40% of the steps have only one best gust, 45% on Wednesday and Thursday and 50% from Friday.
- At most two first gusts start a shortest solution, and on Sunday only one.
- From Tuesday on, at least one reachable position is a dead end.
Mirror images count as one harbor. Each weekday keeps the first 104 candidates to pass, shuffles them with a fixed seed and solves every one again after packing, stopping if a par doesn’t match. The table shows what the checks did to each weekday’s first 3,000 seeds, the batch all 104 came from.
| Day | Seeds needed for 104 harbors | Passed, of the first 3,000 | Most common rejection |
|---|---|---|---|
| Monday | 385 | 790 | Par outside 4 to 5 (1,351) |
| Tuesday | 756 | 376 | Par outside 5 to 6 (1,590) |
| Wednesday | 671 | 473 | Par outside 6 to 7 (1,536) |
| Thursday | 811 | 418 | Par outside 7 to 8 (1,570) |
| Friday | 1,841 | 177 | No boat needs a stopper (1,226) |
| Saturday | 1,464 | 210 | No boat needs a stopper (1,073) |
| Sunday | 1,337 | 243 | No boat needs a stopper (1,035) |
About one random layout in six has walled-off water, and 1,922 more of the 21,000 can’t be solved at all.
Each harbor packs into 20 bytes, so all 728 take 14,560 bytes in one bank of the 64 KiB MBC3 cartridge. Our post on making 8-bit games with GBDK-2020 covers banking and the build.
The date alone picks the harbor, with the weekday choosing the set and the week number the harbor in it. Every 104 weeks the layouts come back mirrored, with the boats’ colours turned round, so a layout repeats exactly only after 416 weeks, about eight years. The cartridge’s clock keeps the day in a 9-bit counter that runs from 0 to 511,1 so the game reads the full date from a window around the last day it saw. Bitfold sets that clock from the device’s local time whenever the game or a save loads, and nothing goes over the network. So the harbors can never be regenerated or reordered after release, or players on different versions would see different ones.
What the numbers in this post are
The rules, checks and settings come from Paper Harbor’s source as of 29 October 2026, the cartridge in Bitfold 1.1. For this post we decoded the 728 shipped harbors, ran the game’s solver on each and replayed the generator’s checks over the first 3,000 seeds of each weekday, the batch every shipped harbor came from. Every stored par matched, and regenerating from the seeds reproduced the shipped puzzle table byte for byte. None of it measures how people play.
A checklist before your first gust
- Find each pier’s row and column, and where a boat could stop in them.
- Mark the boats that can’t stop there alone, and pick their stoppers.
- Decide which boats moor first, since each one becomes a rock.
- Trace the first gust for every boat.
- On Sunday, find the one first gust that works before anything else.
- Count your line. If it’s longer than par, a shorter one exists.
- Press once per gust, and wait for the boats to stop.
- If you’re stuck, undo straight away.
Paper Harbor arrived with Bitfold 1.1, and the guide to all twelve Bitfold Originals covers the other eleven games.
-
Pan Docs, “MBC3”, https://gbdev.io/pandocs/MBC3.html ↩
Frequently asked questions
How do you play Paper Harbor?
Each press of the D-pad is a gust of wind. Every boat that isn’t moored sails that way until the next cell is the shore, a rock or another boat. Sail each boat onto the pier with its own colour and symbol, in as few gusts as you can.
What is par in Paper Harbor?
Par is the fewest gusts that dock every boat, found by a breadth-first search when the puzzles were made. Docking at par earns three stars, docking within par plus the larger of 3 and half of par earns two, and docking at all earns one.
Does undo count in Paper Harbor?
Yes. An undone gust stays on your count, and so do the gusts before a restart, though undo and restart add nothing themselves. A gust that moves no boat doesn’t count at all.
Why is Sunday’s Paper Harbor so hard?
Sunday harbors have four boats and par 10 to 12. At least one boat needs another to stop it, and only one first gust starts a shortest solution. The median Sunday harbor has about 9,400 reachable positions, against about 64 on Monday.
Can you play a missed Paper Harbor?
Yes. The stamp book lets you sail any harbor you missed, back to 1 January 2026. It gets a hollow seal and doesn’t count toward your streak, which only harbors docked on their own day keep going.
Can I play Paper Harbor on iPhone or in a browser?
Paper Harbor is in Bitfold, free on the App Store for iPhone and iPad with iOS 17 or later. It doesn’t play in the browser. Bitfold’s free browser player runs three other Originals.
Building something like this?
9io is a small team of senior engineers with a fractional CTO. We work by the hour, and plans start at $5,000. Send us a note about your product. The reply comes from the person who'd do the work.