computational creative direction
PULSE
Slime-mold optimization identity for a mobility and logistics network
PULSE
Volume IX — A mobility and logistics network
Computational Creative Direction — Slime Mold Optimization
The research question
What if a brand behaved according to one computational law — the one a brainless slime mold uses to rebuild the Tokyo rail map overnight?
PULSE routes things through cities: people, packages, power. Its whole product is finding the efficient path through a shifting network — which is precisely what Physarum polycephalum, the slime mold, does without a brain. Given food sources, it grows a web, then reinforces the tubes carrying the most flow and starves the rest, converging on a network that rivals human-engineered transit systems. PULSE’s identity runs that same algorithm live: it is a network that thickens where it’s used and fades where it isn’t.
The computational principle
Slime-mold (Physarum) optimization is agent-based path-finding. Thousands of simple agents deposit a chemical trail as they move and steer toward stronger trails — a positive feedback loop. Paths that get traffic get reinforced; paths that don’t evaporate. Out of that emerges a transport network that balances efficiency against resilience, the same trade-off every logistics planner fights. It’s decentralized intelligence: no agent plans the network, yet the network is planned.
The behavior engine
One agent field drives the mark, the type, and the live route maps. Agents lay trail; trail evaporates; the surviving veins are the brand.
// Physarum agents + trail field — the entire PULSE engine
class Pulse {
constructor(w, h, count = 4000) {
this.w = w; this.h = h;
this.trail = new Float32Array(w * h); // pheromone map
this.agents = Array.from({ length: count }, () => ({
x: Math.random() * w, y: Math.random() * h,
a: Math.random() * Math.PI * 2
}));
}
sample(x, y) { // read trail, wrapping edges
const w = this.w, h = this.h;
const ix = ((x | 0) % w + w) % w, iy = ((y | 0) % h + h) % h;
return this.trail[ix + iy * w];
}
step({ speed = 1, sensorAngle = 0.5, sensorDist = 9,
turn = 0.4, evaporate = 0.96, deposit = 5 } = {}) {
const w = this.w, h = this.h;
for (const ag of this.agents) {
// sense trail ahead, left, and right
const f = this.sample(ag.x + Math.cos(ag.a) * sensorDist,
ag.y + Math.sin(ag.a) * sensorDist);
const l = this.sample(ag.x + Math.cos(ag.a - sensorAngle) * sensorDist,
ag.y + Math.sin(ag.a - sensorAngle) * sensorDist);
const r = this.sample(ag.x + Math.cos(ag.a + sensorAngle) * sensorDist,
ag.y + Math.sin(ag.a + sensorAngle) * sensorDist);
if (f < l && f < r) ag.a += (Math.random() < 0.5 ? -turn : turn);
else if (l > r) ag.a -= turn;
else if (r > l) ag.a += turn; // steer toward strongest trail
ag.x = (ag.x + Math.cos(ag.a) * speed + w) % w;
ag.y = (ag.y + Math.sin(ag.a) * speed + h) % h;
this.trail[(ag.x | 0) + (ag.y | 0) * w] += deposit; // lay pheromone
}
for (let i = 0; i < this.trail.length; i++) this.trail[i] *= evaporate; // fade
}
feed(x, y, amount = 200) { this.trail[(x | 0) + (y | 0) * this.w] += amount; }
}
feed() places attractors — cities, depots, demand — and the veins grow between them on their own. The evaporation rate is PULSE’s master dial: high evaporation gives a lean, efficient network; low evaporation gives a redundant, resilient one.
The visual language
Every PULSE surface is a vein network — glowing pathways that thicken with traffic and thin toward the edges. The mark is the emergent web between a fixed set of nodes; because the agents re-solve it every session, the exact routing differs, but the topology reads as PULSE — a living circulatory system. The aesthetic is anatomical and electric: dark ground, bright filaments, the look of a nervous system or a lit-up transit map.
Living typography
Letters are destinations the network connects. Each glyph’s key points are seeded as food sources; agents grow veins between them, and the letterform emerges as the reinforced path. Heavily “trafficked” letters — a brand name, a headline — grow thick, confident strokes; incidental text stays thin and capillary. Type looks routed rather than drawn, and it pulses with the flow along it.
Motion rules
- Use thickens, disuse fades. The identity continuously reinforces active paths and evaporates idle ones — it’s never finished optimizing.
- Live demand reshapes it. Real network load feeds attractors, so the brand’s veins swell exactly where the real network is busy.
- Pulse. Flow travels the veins as rhythmic pulses of light, tempo tied to throughput.
- Reroute on obstruction. Block a path (an outage, a cursor) and the agents find a new route in seconds, visibly.
Interactive website
The site is a circulatory system you travel through. Sections are nodes; moving between them sends a pulse of agents that reinforces the vein you took, so the paths you use most literally grow thicker on your personal map. A live network-status view uses the same engine as the logo — brand and operational dashboard are one system at two scales.
Physical applications
- Transit & logistics maps: real routes rendered as a live Physarum network — the map optimizes in front of the viewer.
- Operations centers: wall-scale vein displays of the live network, pulsing with actual throughput.
- Print: captured at a solved state, each unique to its demand snapshot.
- Station wayfinding: signage that shows the network breathing, not a frozen diagram.
The brand system
Guidelines define network states: named regimes (Seek, Reinforce, Optimize, Resilient, Reroute) each specifying evaporation, deposit, and legibility. “On-brand” means the network is running in a state matched to context — a stable service map runs Optimize (lean, resolved); an incident view runs Reroute (searching, redundant).
Color: near-black ground, vein amber, flow cyan, hot coral for congestion, dim slate for evaporating paths. Trail strength maps to hue — the busiest veins burn coral, the fading ones cool to slate.
Open-source behavioral library
Shipped as pulse.js, an eight-verb API over the agent field:
const net = new Pulse(canvas, { agents: 4000 });
net.Feed(point, amount); // place demand — veins grow toward it
net.Reinforce(path); // pump flow along a route — it thickens
net.Evaporate(rate); // set decay — leaner or more redundant network
net.Sense(angle, dist); // tune agent perception — smoother or sharper webs
net.Reroute(obstacle); // block a path — the network finds another
net.Pulse(bpm); // send rhythmic flow down the veins
net.Prune(); // let unused paths fully fade
net.Solve(nodes); // grow the optimal network between a set of nodes
Reflection
PULSE was about an identity that is never done. Most logos are solved once and locked; this one re-optimizes every time it runs, because the network it depicts is always changing. That meant designing a process with a recognizable signature rather than a fixed image — tuning the agents so the web always looks like PULSE even though it’s technically different every second.
The lasting idea: slime mold is proof that intelligence can be decentralized and emergent, which is exactly the promise a modern logistics network makes. PULSE’s identity doesn’t claim to be smart — it demonstrates it, re-solving its own routing in front of you, thickening where you travel and letting the rest fade.