Left click the grid to strike it with force in the compass direction. Right click and drag to draw walls or sensors (or erase them, if toggled below). Place up to four pulsers to keep striking automatically.
Grid size
widthheight
Rectangular grid, default 200×200, each axis capped independently at 80% of your screen resolution (in dots). Applying a new size rebuilds the lattice from scratch — all forces, walls, sensors, and pulsers are cleared, and the border walls below are redrawn at the new dimensions.
Tick rate
Neighbor transfer rate
force / tick (default 0.25)
If this exceeds what a dot holds, it still sends the full amount — the dot goes negative and effectively "recoils," pushing the opposite way next tick.
% of held force / tick
When checked, the fixed rate above is ignored. Each dot sends this percentage of whatever force it currently holds — 100% empties it completely into its neighbor every tick; above 100% still overshoots into negative, same as the fixed-rate mode.
Step manually
Click & pulser strength
power (default 1)
radius, dots (default 4)
Applies to both left-click strikes and pulsers, including ones already placed.
Walls
Hold right click and drag across the grid to draw walls. The grid starts with walls all the way around its outer border — right click and drag over them with Erase mode on if you want to open the border up. A wall accepts force from any non-wall neighbor the same way an ordinary dot does; see Wall Reflect below for what happens to that force once it arrives, and note a wall never hands force to a neighboring wall cell. Toggle Erase mode below to make right click remove walls (or sensors) instead of drawing them — this also removes border walls if you drag over them. Toggle Vertical wall below to make each right click (or drag) place — or, with Erase mode on, remove — a full vertical column of walls at the clicked x position, rather than just the one cell. Left click is always a force strike.
Sensors
A sensor is a placeable, removable point probe: right click and drag to place them (toggle Sensor mode below so right click drops sensors instead of walls), same Erase mode removes them either way. Unlike a wall, a sensor doesn't block force — it sits in the lattice like a normal dot, reads its own position and total force magnitude live below, and is exempt from the usual ±10 force cap, so its reading can run arbitrarily high.
Readings (0)
Music
A music pixel is placed and removed the same way as walls and sensors — right click and drag, with Music mode toggled on so the drag drops music pixels instead of walls or sensors, and Erase mode removing whichever is present. A music pixel never blocks or alters force propagation; it sits in the lattice exactly like an ordinary dot (or a sensor) and simply listens to its own force magnitude. Every live music pixel plays a continuous tone whose volume rises with how much force that atom currently holds, and goes silent when the atom is at rest. A pixel's pitch, by contrast, is fixed by where it sits in the grid: going left to right, pitch is split equidistantly between the Low and High frequency settings below (left-most column = Low, right-most column = High); going bottom to top, pitch is split logarithmically between the same two settings (bottom-most row = Low, top-most row = High). A pixel's tone is the sum of its left-right frequency and its bottom-top frequency. Pick a waveform below before (or while) placing pixels — sine for a pure tone, sawtooth and square for brighter, buzzier tones, triangle for something in between. Changing the waveform only affects newly placed pixels; use Erase and re-place to change an existing one.
Hz lowHz high
volume %
Off (default), a music pixel's volume is its own force divided by the fixed ±10 force cap — a pixel at the cap plays at full volume. On, volume is instead the pixel's force divided by whichever atom currently holds the largest force anywhere on the grid, so the loudest atom present always plays at full volume and everything else scales relative to it, same spirit as Dynamic Palette above.
Up to 32 music pixels can sound at once; placing more once that cap is reached is simply ignored until you erase some. Audio only starts after your first click or button press, per browser autoplay rules.
Playing (0)
Edge behavior
When enabled, every dot along the outer border of the grid loses this much off its force magnitude each tick (pulled toward zero, never past it) — a way to bleed off energy that piles up at the edges instead of continuing to propagate.
A wall accepts a force share arriving from any non-wall neighbor exactly as an ordinary dot would, and stores it as its own internal force — it just never hands anything to a neighboring wall cell. When Wall Reflect is on (default), that arriving share is multiplied by -1 before being added, so the wall builds up a reversed force and hands that reversal back out into the lattice over later ticks, like a bounce. When off, the same share is added without inverting it, so the wall simply absorbs and later re-emits force unchanged.
Lists the current force vector of every dot in the grid's right-most column, top to bottom, updated live.
Force color palette
Viridis stays readable for deuteranopia, protanopia, and tritanopia — recommended if color distinctions matter.
When enabled, every 100 ticks the palette rescales so that whichever atom currently holds the largest force magnitude anywhere on the grid becomes the new maximum-force color; everything else recolors relative to that. Off (default), the palette's maximum stays fixed at the ±10 force cap. Current max-force color set at: 10.00
Pulsers (0/4)
Fires immediately, then again every N ticks, in whatever direction the compass shows at the moment you place it.
Tick0StaterunningStored force (Σ|f|)0.00Net force (ΣFx, ΣFy)0.00, 0.00Active dots0Wall cells0Sensor cells0Music cells0
The Zero all forces and Reset grid buttons now live stacked in the bottom-left corner of the window, outside the grid — Zero all forces on top, Reset grid underneath. Zero all forces sets every dot's stored force to zero, leaving walls, pulsers, and tick count untouched.
How it behaves
Left click the grid to strike it with force, in whatever direction the
compass shows, applied to every dot within a radius (both power and
radius adjustable above, default 1 and 4). Click the dot in the
center of the compass to select no direction: instead of one
uniform push, each struck dot is shoved further away from the click,
in whichever cardinal direction it lies relative to the click's
center — dots north of the click get a northern push, east get
eastern, south get southern, and west get western. Right click and
drag instead to paint walls — the grid starts with walls all
the way around its outer border. A wall accepts a force share from a
non-wall neighbor the same way an ordinary dot would (see Wall
Reflect below for what happens to it once it arrives), but never
hands force to a neighboring wall cell; toggle Erase mode to make
right click remove walls instead of drawing them.
Every tick, a dot's horizontal force and vertical force are each
handed onward independently, and each spreads to all three
neighbors lying in that direction rather than just the one straight
ahead: a rightward force reaches the upper-right, right, and
lower-right neighbors; a downward force reaches the lower-left,
down, and lower-right neighbors; and so on for the other five
directions. The straight-ahead neighbor is genuinely closer (1 cell
away) than the two diagonal ones (√2 cells away), so it gets a
bigger cut — about 41% to the straight neighbor and
~29% to each diagonal — rather than splitting evenly three
ways. Because the two diagonal neighbors sit at a 45° angle rather
than straight ahead, each also picks up a small perpendicular
kick equal in magnitude to its share — e.g. an eastward transfer
gives its upper-right neighbor a touch of north as well as east,
and its lower-right neighbor a touch of south as well as east.
Nothing is taken from the sender to pay for this: the two kicks are
always equal and opposite, so they cancel to zero across the pair.
Negative and positive force behave as exact mirror images of
each other: a leftward or upward force spreads the same way, just
toward the opposite trio of neighbors. The total handed off each
tick is either a fixed rate (default 0.25, adjustable) or, in
percentage mode, a share of what the dot currently holds
(default 100%, meaning it empties out completely each tick), then
divided among the three neighbors by that same weighting. If a
neighbor is off the grid, its share simply stays behind in the
sending dot instead of being lost; a wall neighbor, by contrast,
actually receives the share (see Walls and Wall Reflect below for
what happens there) — except when the sending dot is itself a wall,
in which case a neighboring wall never receives anything and the
share stays behind, same as off-grid. Either way, if the amount
handed off exceeds what the dot holds, it still sends the full amount
and goes negative — recoiling and pushing the opposite way next
tick. Each dot's force is capped at ±10 magnitude. Color runs
along whichever palette is selected above, always with black
at exactly zero force, jumping onto the spectrum the instant a dot
holds any force at all, up to full saturation at the cap. Rainbow
(the default) runs red through orange, yellow, green and blue to
violet; Thermal and Ocean mimic heat-camera and deep-water gradients;
Viridis is a perceptually uniform purple-to-yellow scale built to
stay distinguishable for all common forms of color blindness. A
dot's position also drifts slightly in the direction of its force.
Walls render as a flat steel tile regardless of force or palette.
Vertical wall, when toggled on, changes what a right click
does: instead of placing (or, with Erase mode on, removing) just
the clicked cell, it places or removes an entire vertical column
of walls at that x position in one action — drag across several
columns to wall off (or open up) multiple at once.
Edge Decay, when
toggled on, pulls the force magnitude of every dot along the
outer border down by a fixed amount each tick (default 0.25,
adjustable) — note that with the default border walls in place,
this has nothing to act on unless you erase some of the border.
Wall Reflect, on by default, controls what a wall does with
a force share arriving from a non-wall neighbor: multiply it by -1
before storing it (on), or store it unchanged (off). Either way the
wall hands whatever it's holding back into the lattice over later
ticks exactly like any other dot, just never to a neighboring wall.
Show right-edge force values lists the live x, y, and
magnitude of every dot in the grid's right-most column in the
sidebar below.
Sensors are placed and removed the same way as walls —
right click and drag, with Sensor mode toggled on so the drag
drops sensors instead of walls, and Erase mode removing whichever
is present. Unlike a wall, a sensor doesn't block or zero out
force; it behaves like an ordinary dot, and its position and
current force magnitude are listed live in the sidebar. The one
difference from an ordinary dot is that a sensor's force is
never capped at ±10 — every other dot in the lattice is,
so a sensor is the one place you can watch force build up past
that ceiling.
Music pixels are placed and removed the same way as walls
and sensors — right click and drag, with Music mode toggled on
so the drag drops music pixels instead, and Erase mode removing
whichever is present. Like a sensor, a music pixel never blocks
or alters force propagation; it just listens. Each live music
pixel plays a continuous tone in the waveform (sine, sawtooth,
square, or triangle) selected at the moment it was placed, with
its volume rising and falling with that atom's own force
magnitude, and going silent while the atom is at rest. A
pixel's pitch is fixed by its position in the grid rather
than by force: the Low/High frequency settings are split
equidistantly from left to right and logarithmically from
bottom to top, and a pixel's tone is the sum of its left-right
frequency and its bottom-top frequency.