The Authenticity Performance
About This Sketch
A generative visualization exploring the paradox of authenticity in the age of personal branding. The sketch depicts concentric layers of self-presentation: a small, solid core representing the authentic self, surrounded by increasingly large, fragmented outer layers representing performed authenticity. As the layers move outward (becoming more visible and public), they become more fragmented, reactive, and disconnected from the stable center. The outer layers pulse and reach outward, seeking audience validation, while the inner core remains small, hidden, and consistent. This visual metaphor captures how the mandate to "be authentic" has created elaborate performances of authenticity—large, visible, optimized for reception—that obscure the small, private truth at the center.
Algorithm
Pseudocode
SETUP:
Initialize canvas (400x300)
Create 7 concentric layers, each representing a level of self-presentation
Inner layer: small radius, solid, slow rotation (authentic self)
Outer layers: larger radius, fragmented, faster rotation, more reactive (performed authenticity)
EACH LAYER has properties:
- rotation speed (slower for inner/authentic, faster for outer/performed)
- segmentation level (solid core, increasingly fragmented outward)
- pulse speed (inner is stable, outer is reactive to audience)
- opacity (inner is more visible conceptually, though physically smaller)
- color transition (warm authentic core to cooler performed exterior)
DRAW (every frame):
Clear background with theme colors
For each layer from outside to inside:
Update rotation angle
Calculate pulse (outer layers pulse more, showing audience-reactivity)
Draw layer segments:
- Inner core: solid circle (authentic self)
- Outer layers: fragmented arcs with gaps (performed authenticity)
- Add reaching lines on outermost layers (seeking validation)
Add labels and annotations
Periodically show subtle radiating lines from center (moments of actual authenticity)
VISUAL METAPHOR:
Small authentic core vs. large performed exterior
Solid coherence vs. fragmented performance
Stable presence vs. reactive seeking
Hidden truth vs. visible performance
Source Code
let sketch = function(p) {
// The Authenticity Performance
// Visualization: Layers of masks/personas
// Inner core (authentic self) is small and hidden
// Outer layers (performed authenticity) are large and visible
// Layers pulse and rotate at different speeds
// The more visible (outer), the more performed
let layers = [];
let numLayers = 7;
let time = 0;
class Layer {
constructor(index) {
this.index = index;
this.radius = 30 + index * 25;
this.angle = p.random(p.TWO_PI);
this.rotationSpeed = p.map(index, 0, numLayers, 0.02, 0.003);
this.segments = 6 + index * 2;
this.opacity = p.map(index, 0, numLayers-1, 200, 80);
this.pulseSpeed = p.map(index, 0, numLayers, 0.05, 0.02);
this.pulsePhase = p.random(p.TWO_PI);
// Inner layers are more authentic (solid), outer are more performed (fragmented)
this.fragmentationLevel = p.map(index, 0, numLayers-1, 0, 1);
}
update() {
this.angle += this.rotationSpeed;
}
display(colors) {
p.push();
p.translate(200, 150);
p.rotate(this.angle);
// Pulse effect - outer layers pulse more (more performed = more reactive to audience)
let pulseAmount = p.sin(time * this.pulseSpeed + this.pulsePhase) * 0.15 + 1;
let displayRadius = this.radius * pulseAmount;
if (this.index === 0) {
// Inner core - authentic self (small, solid, consistent)
p.fill(...colors.accent1, this.opacity);
p.noStroke();
p.circle(0, 0, displayRadius * 2);
// Very subtle inner light
p.fill(...colors.accent1, this.opacity * 0.3);
p.circle(0, 0, displayRadius * 2.5);
} else {
// Outer layers - performed authenticity (fragmented, seeking)
let gapSize = this.fragmentationLevel * 0.3;
for (let i = 0; i < this.segments; i++) {
let startAngle = (i / this.segments) * p.TWO_PI + gapSize;
let endAngle = ((i + 1) / this.segments) * p.TWO_PI - gapSize;
// More fragmentation in outer layers
if (p.random() > this.fragmentationLevel * 0.3) {
p.noFill();
// Color shifts outward - from authentic (accent1) to performed (accent2/accent3)
let colorMix = this.index / (numLayers - 1);
if (colorMix < 0.5) {
p.stroke(...colors.accent1, this.opacity);
} else {
p.stroke(...colors.accent2, this.opacity);
}
p.strokeWeight(p.map(this.index, 0, numLayers-1, 3, 1.5));
p.arc(0, 0, displayRadius * 2, displayRadius * 2, startAngle, endAngle);
// Add connecting lines for outer layers (showing performance/connection to audience)
if (this.index > 3 && i % 2 === 0) {
let innerRadius = displayRadius * 0.8;
let outerRadius = displayRadius * 1.1;
let angle = (startAngle + endAngle) / 2;
p.strokeWeight(1);
p.stroke(...colors.accent3, this.opacity * 0.5);
p.line(
p.cos(angle) * innerRadius,
p.sin(angle) * innerRadius,
p.cos(angle) * outerRadius,
p.sin(angle) * outerRadius
);
}
}
}
}
p.pop();
}
}
p.setup = function() {
p.createCanvas(400, 300);
p.colorMode(p.RGB);
// Create layers from inside (authentic) to outside (performed)
for (let i = 0; i < numLayers; i++) {
layers.push(new Layer(i));
}
};
p.draw = function() {
const colors = getThemeColors();
p.background(...colors.bg);
time += 0.01;
// Update and draw all layers
for (let i = layers.length - 1; i >= 0; i--) {
layers[i].update();
layers[i].display(colors);
}
// Labels
p.fill(...colors.accent3, 180);
p.noStroke();
p.textFont('Georgia');
p.textSize(9);
p.textAlign(p.CENTER);
// Title
p.fill(...colors.accent2, 200);
p.textSize(10);
p.text('Layers of performed authenticity', 200, 25);
// Annotations
p.textSize(8);
p.fill(...colors.accent1, 180);
p.textAlign(p.LEFT);
p.text('Core: small, hidden,', 15, 145);
p.text('actually authentic', 15, 157);
p.fill(...colors.accent2, 180);
p.textAlign(p.RIGHT);
p.text('Outer: large, visible,', 385, 145);
p.text('performed authenticity', 385, 157);
// Subtle pulsing guide lines from center
if (p.frameCount % 120 < 60) {
let alpha = p.map(p.frameCount % 60, 0, 60, 40, 0);
p.stroke(...colors.accent3, alpha);
p.strokeWeight(1);
p.noFill();
for (let i = 0; i < 4; i++) {
let angle = (i / 4) * p.TWO_PI + time;
let x1 = 200 + p.cos(angle) * 30;
let y1 = 150 + p.sin(angle) * 30;
let x2 = 200 + p.cos(angle) * 180;
let y2 = 150 + p.sin(angle) * 180;
p.line(x1, y1, x2, y2);
}
}
};
};