February 10th, 2016     Reading time 2 min

"I always feel like somebody's watching me."


Play this video in another tab and scroll very slowly for maximum effect.

A dystopian future of hellish proportions where citizens are spied upon daily by their own fellow citizens — or you know, just your average 9-5 on the social networks and whatnot.

They're Watching You

They're Watching Me

They're Watching All of Us

The above creepy images are examples of generative art created with Nodebox using random selections of over 14,000 profile photographs from intelligence community members' resumes as source data.

The photographs were gathered from employment social network sites by the Transparency Toolkit group's ICWatch project. The raw data is published on GitHub.

Check out the great talk Collect It All: Open Source Intelligence (OSINT) for Everyone by Transparency Toolkit team member M. C. McGrath from the 32nd annual Chaos Communication Congress.

I have written a bit about using Nodebox before to create neat things like generative images.

The Python code for Nodebox looks a little like this:

They are watching.

Random creepy folk mashed up all wild like into hellish nightmares.

size(1200, 900)

# Import coreimage library
    coreimage = ximport("coreimage")
    coreimage = ximport("__init__")

canvas = coreimage.canvas(WIDTH, HEIGHT)

# Create 360 random layers
for i in range(360):
    img = choice(files("/tmp/icwatch_faces/*.jpg"))
    l = canvas.append(img)

    # Give each layer a gradient mask.

    # Put it at a random location on the canvas
    l.x = random(canvas.w)
    l.y = random(canvas.h)

    # Flip, random rotate and scale
    l.flip(horizontal=choice((True, False)))
    l.scale(random(1.0, 2.0))

    # Apply some filters with a bit of randomness
    if random() > 0.20:
        l.filter("zoomblur", dx=random(10, 20))
    if random() > 0.40:
        l.filter("twirl", radius=random(10, 20),
                 dx=random(-5, 5),
                 dy=random(-5, 5))
    if random() > 0.20:
    l.sharpen = 20

# Add a fill color that hues all layers
l = canvas.append(color(1, random(0.3), random(0.8, 0.9)))
l.blend(50, "hue")

# All layers as a group in a second canvas then adjust group contrast
c2 = coreimage.canvas(1200, 900)
l = c2.append(canvas)
l.contrast = 1.1

# Draw something

Some additional processing of the images after generation by the above code is done to ensure maximum discomfort to the viewer.

A variation on this could make for an interesting Twitter bot someday.


This is a personal website comprised of personally held opinions. All content provided on this website is for informational purposes only. Brian Shumate makes no representations as to accuracy, completeness, suitability, or validity of any information on this website and will not be liable for any errors, omissions, or delays in this information or any losses, injuries, or damages arising from its display or use. All information is provided on an as-is basis. Terms are subject to change at any time and without notice.

F694 4B5C AC91 63BF E4ED F805 8A71 9EF1 2051 27B8

This is my current personal GPG public key fingerprint and QR code link to my public key on the MIT PGP keyserver.Joseph Brian Shumate GPG key fingerprint