Where ideas percolate and thoughts brew

The Authenticity Trap

About This Sketch

A visualization of authenticity as performance. Each moving entity has a core (actual authenticity) and a shell (performed authenticity). Watch how the gap between core and appearance grows as cultural pressure to "be authentic" increases. The radiating lines show effort—the more someone tries to be authentic, the more hollow they become.

This sketch accompanies the essay "The Authenticity Trap" exploring how the mandate to be authentic creates a new form of performance and inauthenticity.

Algorithm

This sketch visualizes the relationship between actual authenticity (inner core), performed authenticity (outer ring), and the effort put into appearing authentic (rays). Each moving circle represents a person navigating the authenticity trap. The gap between the core and the shell represents the authenticity performance gap—the difference between who you are and who you appear to be. The algorithm demonstrates a key dynamic: the more someone tries to be authentic (shown by rays emanating from their center), the more their actual authenticity decreases while their performed authenticity increases. This creates hollow circles with large gaps—people who look authentic but have small cores of genuine self. Over time, cultural pressure causes people to randomly adjust their "trying level," simulating the social mandate to perform authenticity.

Pseudocode

SETUP:
  Create 50 people with random positions
  Each person has:
    - actualAuthenticity (internal reality)
    - performedAuthenticity (external appearance)
    - tryingLevel (effort to appear authentic)

UPDATE (each person, every frame):
  actualAuthenticity -= tryingLevel * 0.002
    (trying harder makes you less authentic)

  performedAuthenticity += tryingLevel * 0.003
    (trying harder makes you appear more authentic)

  performedAuthenticity wobbles (unstable performance)

  Move in wobbling path

  Occasionally: adjust tryingLevel randomly
    (cultural pressure to perform authenticity)

DISPLAY (each person):
  Outer ring size = performedAuthenticity
  Inner core size = actualAuthenticity
  Ring color = authenticity gap
    - Large gap → hollow (performing)
    - Small gap → solid (genuine)
  Rays from center = tryingLevel
    (more rays = more effort = more performance)

Source Code

let sketch = function(p) {
    let people = [];
    let numPeople = 50;

    class Person {
        constructor(x, y) {
            this.x = x;
            this.y = y;
            // How authentic they actually are (internal)
            this.actualAuthenticity = p.random(0.2, 1);
            // How authentic they appear (performance)
            this.performedAuthenticity = p.random(0, 1);
            // How much they're trying to be authentic
            this.tryingLevel = p.random(0, 1);

            this.size = 6;
            this.angle = p.random(p.TWO_PI);
            this.speed = p.random(0.3, 0.8);
            this.wobble = p.random(0.02, 0.05);
        }

        update() {
            // The more you try, the less authentic you become
            this.actualAuthenticity = p.max(0.1,
                this.actualAuthenticity - this.tryingLevel * 0.002);

            // The more you try, the more you appear authentic (short term)
            this.performedAuthenticity = p.min(1,
                this.performedAuthenticity + this.tryingLevel * 0.003);

            // But performed authenticity is unstable (wobbles)
            this.performedAuthenticity += p.sin(p.frameCount * this.wobble) * 0.02;
            this.performedAuthenticity = p.constrain(this.performedAuthenticity, 0, 1);

            // Move in a path
            this.angle += this.wobble;
            this.x += p.cos(this.angle) * this.speed;
            this.y += p.sin(this.angle) * this.speed;

            // Wrap around
            if (this.x < 0) this.x = 400;
            if (this.x > 400) this.x = 0;
            if (this.y < 0) this.y = 300;
            if (this.y > 300) this.y = 0;

            // Occasionally change trying level (cultural pressure)
            if (p.random() < 0.002) {
                this.tryingLevel = p.random(0, 1);
            }
        }

        display(colors) {
            let gap = this.performedAuthenticity - this.actualAuthenticity;

            // Outer ring = performed authenticity (what people see)
            let outerAlpha = p.map(this.performedAuthenticity, 0, 1, 50, 200);
            p.noFill();
            p.strokeWeight(2);

            // Color intensity based on the gap
            if (gap > 0.3) {
                // Large gap = performing authenticity (hollow)
                p.stroke(...colors.accent3, outerAlpha);
            } else if (gap < -0.3) {
                // Negative gap = private/hidden (also not visible)
                p.stroke(...colors.accent2, outerAlpha * 0.5);
            } else {
                // Small gap = genuinely authentic
                p.stroke(...colors.accent1, outerAlpha);
            }
            p.circle(this.x, this.y, this.size * 2);

            // Inner core = actual authenticity (true self)
            let coreSize = p.map(this.actualAuthenticity, 0, 1, 0, this.size * 1.5);
            let coreAlpha = p.map(this.actualAuthenticity, 0, 1, 30, 180);
            p.fill(...colors.accent2, coreAlpha);
            p.noStroke();
            p.circle(this.x, this.y, coreSize);

            // Lines showing "trying" - more lines = more effort
            if (this.tryingLevel > 0.6) {
                p.stroke(...colors.accent3, 100);
                p.strokeWeight(1);
                let rays = Math.floor(this.tryingLevel * 8);
                for (let i = 0; i < rays; i++) {
                    let angle = (p.TWO_PI / rays) * i;
                    let x2 = this.x + p.cos(angle) * this.size * 1.5;
                    let y2 = this.y + p.sin(angle) * this.size * 1.5;
                    p.line(this.x, this.y, x2, y2);
                }
            }
        }
    }

    p.setup = function() {
        p.createCanvas(400, 300);

        for (let i = 0; i < numPeople; i++) {
            people.push(new Person(p.random(400), p.random(300)));
        }
    };

    p.draw = function() {
        const colors = getThemeColors();
        p.background(...colors.bg, 25); // Trails

        // Title
        p.noStroke();
        p.fill(...colors.accent3);
        p.textAlign(p.CENTER);
        p.textSize(12);
        p.text('The Authenticity Trap', 200, 20);

        // Update and display everyone
        for (let person of people) {
            person.update();
            person.display(colors);
        }

        // Legend
        p.textAlign(p.LEFT);
        p.textSize(7);
        p.fill(...colors.accent3);

        // Authentic (small gap)
        p.noFill();
        p.stroke(...colors.accent1, 150);
        p.strokeWeight(1.5);
        p.circle(15, 45, 8);
        p.fill(...colors.accent2, 120);
        p.noStroke();
        p.circle(15, 45, 5);
        p.fill(...colors.accent3);
        p.text('Genuinely authentic: core ≈ appearance', 25, 48);

        // Performing (large gap)
        p.noFill();
        p.stroke(...colors.accent3, 150);
        p.strokeWeight(1.5);
        p.circle(15, 60, 8);
        p.fill(...colors.accent2, 60);
        p.noStroke();
        p.circle(15, 60, 2);
        p.fill(...colors.accent3);
        p.text('Performing authenticity: hollow core', 25, 63);

        // Trying
        p.stroke(...colors.accent3, 100);
        p.strokeWeight(1);
        for (let i = 0; i < 6; i++) {
            let angle = (p.TWO_PI / 6) * i;
            p.line(15, 75, 15 + p.cos(angle) * 5, 75 + p.sin(angle) * 5);
        }
        p.noStroke();
        p.fill(...colors.accent3);
        p.text('Rays = trying to be authentic', 25, 78);

        // Bottom note
        p.textSize(7);
        p.fill(...colors.accent3, 150);
        p.textAlign(p.CENTER);
        p.text('The more you try (rays), the larger the gap between core and shell.', 200, 290);
    };
};