The Scaffolding Problem
About This Sketch
A visual meditation on productivity systems that outgrow their purpose. Watch as elaborate scaffolding structures grow faster and more complex than the buildings they're meant to support—a metaphor for task managers, note-taking systems, and creative workflows that consume more energy than the actual work.
Algorithm
This sketch visualizes the core problem: scaffolding grows faster and more elaborate than the actual structures it's meant to support. Four building projects animate simultaneously, each with a solid rectangular structure (the real work) and a lattice-style scaffold surrounding it.
The scaffolding grows at twice the speed of the actual structures and reaches greater heights. It's more visually complex—vertical poles, horizontal crossbars, diagonal supports—while the actual buildings are simple solid rectangles. This visual metaphor captures how productivity systems, note-taking frameworks, and creative workflows often become more elaborate than the work they support.
Each structure begins construction only after its scaffolding has already grown significantly, reflecting how we often spend substantial time building systems before doing any actual work. The scaffolding's transparency and lattice pattern suggest its temporary, supportive nature, yet its visual dominance shows how it overtakes the primary goal.
Pseudocode
INITIALIZE:
Create 4 structures at evenly spaced positions
Each structure has:
- Target height (random between 80-180)
- Build speed of 0.5 units/frame
Each scaffold has:
- Max height (random between 120-250, taller than structures)
- Grow speed of 2 units/frame (4x faster than structures)
- Collection of horizontal crossbars added randomly
ANIMATION LOOP:
Clear canvas with theme background
Draw ground line
For each structure/scaffold pair:
Update scaffold first:
- Grow height at fast speed
- Randomly add crossbars as it grows
Update structure (with delay):
- Grow height at slow speed
- Stop when reaching target
Display structure (solid rectangle)
Display scaffold (lattice framework on top)
VISUAL RESULT:
Scaffolding appears first, grows faster, reaches higher
Structures lag behind, grow slowly, stay simpler
Metaphor: The support system overshadows the supported work
Source Code
let sketch = function(p) {
let structures = [];
let scaffolds = [];
let time = 0;
class Structure {
constructor(x) {
this.x = x;
this.targetHeight = p.random(80, 180);
this.currentHeight = 0;
this.buildSpeed = 0.5;
this.complete = false;
}
update() {
if (this.currentHeight < this.targetHeight) {
this.currentHeight += this.buildSpeed;
} else {
this.complete = true;
}
}
display(colors) {
// The actual structure (solid building)
p.fill(...colors.accent2);
p.noStroke();
p.rect(this.x - 15, 300 - this.currentHeight, 30, this.currentHeight);
}
}
class Scaffold {
constructor(x) {
this.x = x;
this.height = 0;
this.maxHeight = p.random(120, 250);
this.growSpeed = 2; // Grows faster than structure
this.lines = [];
this.expanding = true;
}
update() {
if (this.expanding && this.height < this.maxHeight) {
this.height += this.growSpeed;
if (p.random() < 0.3) {
this.lines.push({
y: this.height,
length: p.random(20, 40)
});
}
}
}
display(colors) {
// Draw scaffolding as a lattice structure
p.stroke(...colors.accent1, 180);
p.strokeWeight(2);
p.noFill();
// Vertical poles
p.line(this.x - 25, 300, this.x - 25, 300 - this.height);
p.line(this.x + 25, 300, this.x + 25, 300 - this.height);
// Horizontal crossbars
for (let line of this.lines) {
p.line(this.x - 25, 300 - line.y, this.x + 25, 300 - line.y);
}
// Diagonal supports
for (let i = 0; i < this.lines.length - 1; i++) {
let y1 = 300 - this.lines[i].y;
let y2 = 300 - this.lines[i + 1].y;
p.line(this.x - 25, y1, this.x + 25, y2);
}
}
}
p.setup = function() {
p.createCanvas(400, 300);
// Create multiple structures with their scaffolding
for (let i = 0; i < 4; i++) {
let x = 80 + i * 80;
structures.push(new Structure(x));
scaffolds.push(new Scaffold(x));
}
};
p.draw = function() {
const colors = getThemeColors();
p.background(...colors.bg);
time += 0.01;
// Ground line
p.stroke(...colors.accent3);
p.strokeWeight(2);
p.line(0, 300, 400, 300);
// Update and display everything
for (let i = 0; i < structures.length; i++) {
// Scaffolds grow fast at first
if (time * 50 > i * 20) {
scaffolds[i].update();
}
// Structures grow slowly, but only after delay
if (time * 50 > i * 20 + 40) {
structures[i].update();
}
// Display order: structures first (behind), then scaffolding
structures[i].display(colors);
scaffolds[i].display(colors);
}
// Visual commentary: scaffolding outpaces building
// The scaffolding is more elaborate and faster-growing than the actual structures
};
};