Refract
A laser-reflection puzzle on an 8x6 grid: rotate mirrors and mix red, green and blue into the exact colour each receiver demands.
A laser-reflection puzzle on an 8x6 grid: rotate mirrors and mix red, green and blue into the exact colour each receiver demands.

An 8x6 grid holding emitters, receivers, mirrors, splitters, glass, portals and blockers. You can only touch a few cells, and you have to bend the light into the receivers — each one demands an exact colour, whether a primary or a mix. Thirty levels, each tracking your fewest moves.
Released 2026-11-07 · Version 1.0.0 · Updated 2026-11-07



Scattering mirrors at random and hoping a solution exists is how this genre usually breaks. Here the order is reversed. A fixed seed first builds a complete light path that is known to work, then computes which cells each beam crosses and what colour accumulates in each. Receivers are placed only on cells the solution actually lights, and each demands exactly the colour found there.
With a verified answer in hand, the hiding starts: one to seven lit mirrors are picked, half removed so you must place them, half turned 90 degrees so you must turn them back. Every other mirror stays correct and locked. Because receivers do not block light, adding them to the solved layout cannot change the trace — so reconstructing that layout must win. Solvability is constructed, not searched for.
A mirror has only two slopes — forward slash and backslash — so although it stores four orientations it has two real states, and two clicks return it to how it looked. A splitter divides one beam into three: straight on, plus one to each side. It is the only component that lets a single path light several receivers at once. Glass does not bend anything; it shifts colour — red to green, green to blue, blue to red — which changes hue without changing route. Portals come in pairs and re-emit a beam from the partner along the same direction. Blockers, like the border, simply end a beam.
The rules are short, but the space they open is wide: light passes through receivers and carries on, passes through other beams without interacting, and each branch after a splitter is judged independently. A cell accumulates colour, so a cell crossed by red and green is yellow.
Every beam carries a three-bit mask: bit 0 red, bit 1 green, bit 2 blue. Crossing a cell ORs the colour in, so red plus green is naturally yellow, red plus blue magenta, green plus blue cyan, and all three white. A receiver demands one specific mask value, and the test is that the accumulated colour equals it exactly — not that it contains it.
That exact-match rule is why splitters matter. To light a receiver that wants yellow, either red and green must meet on that cell, or a piece of glass must turn red into green and route it back. The first is route planning; the second is understanding which way the shift runs.
Every rotation or placement costs a move, and an undo refunds it — a misjudgement should not be charged to your record, so turning something just to watch where the light goes and then undoing is free. Each level keeps its own best and never overwrites it with a worse replay. A single level shows its own record; the overview shows the total across all thirty.
Saving moves is usually about order rather than economy. Try a cell, watch where the light goes, then decide which slope it should stay on. The hint button names the first editable cell that is still wrong and highlights it for 2.4 seconds without saying which way to turn — it moves you from "I cannot find it" to "it is this one", and leaves the reading of the beam to you.
A single beam is capped at 64 segments and the board at 256 beams. Those limits are not performance tuning — they are hard stops against infinite loops. Splitters multiply beam count, and portals can send a beam back through cells it has already crossed; without caps, one click could hang the page.
Each beam also carries its own set of visited (cell, direction, colour) states and terminates on a repeat. A beam circling a closed loop stops itself rather than reflecting forever. What you see is light ending somewhere; what the engine did was notice it had already been in that exact state.
Can a level be unsolvable?
No. Levels are built from a solved layout and then partially hidden, so an answer exists before anything is concealed. Generation also checks whether the starting board is already solved and rebuilds if so.
Why does a mirror return to its original look after two clicks?
It has only two slopes. The code stores 0 to 3, but the reflection table reads just the lowest bit, so opposite orientations are equivalent — four clicks make a full turn, two clicks look identical.
Does a mixed colour count?
Yes, as long as it is exactly the colour the receiver wants. The test is equality, not inclusion, so yellow requires yellow; red plus blue will not do.
Do move records sync?
No. Cleared levels and fewest-move records for all thirty levels live only in this browser.
Start with the first beam — Runs on its own subdomain · 30 levels, 48 cells · records stay on this device
Since the first version on 2026-11-07, this page records what changed in each version of this game.