Is code art? Autology is a study of not only how we interpret art, but also how art can interpret itself. Each piece has its source code embedded imperceptibly within the image itself. Hence the source code is literally part of the artwork. With a little sleuthing, one can derive the source code from the image and vice versa in infinite recursion.
Autology is a series of 1,024 pieces of long-form generative art, minted on artblocks.io. The project was a labor of love for over 6 months. Autology, which means "the study of oneself," was exactly that in many ways. Reflecting back, I've self-validated that the process of creation is my main driving factor, and I will share some of the process with you in this article. The art pieces/outputs reflect upon themselves in a few ways. The steganographic source code provides a bit of social commentary on blockchain, on-chain art, and data resiliency. At times, reflection is noted in a visually literal way, as in the case of symmetry. There is also a purposeful Rorschach quality, suggestive of the classic Rorschach studies that were "designed to reflect unconscious parts of the personality that project into the visual stimuli generated."[1]
I hope that the visuals, as well as the hidden meanings, will resonate with some collectors. The entire creation process has been challenging in all the best ways and entirely rewarding.
The following is a little background on the inspiration for the project, details regarding how it all came to be, and the features within the algorithm.
THE PATH TO GENERATIVE ART AND STEGANOGRAPHY
One of my earliest influences in computer security came in the early 2000s. I encountered a TV show called "The Screen Savers" while I was acquiring my B.S. in Computer Science. My favorite segment was entitled "Dark Tips," which was hosted by none other than Kevin Rose. His "hacks" guided me into a whole new realm of computers and focused my interests in computer security. This led me to take courses in ethical hacking, encryption, and steganography—where I first learned how to hide messages within images. I found the concept of steganography so intriguing, and for my final class project, I demoed hiding a copy of my team's source code within the image.
I searched for opportunities related to computer security after college. But, I was discouraged to learn that the positions available at the time were either severely underpaid, or they simply required clicking buttons within a suite of pre-built tools and reading the generated reports. There was nothing to learn and no challenge. I gave up the pursuit for a security related job and instead had a successful programming career. My personal interest in security, ethical hacking, and encryption held strong over the years and popped up in my side projects and hobbies. Though, up until I discovered generative art, I didn't think steganography, while extremely cool, would be useful in my honest civilian life.
I started learning about NFTs in early 2021 and discovered Art Blocks a few weeks later. I devoted my time to research, absorbing as much as I could. Generative artists, such as Manolo Camboa Naon (aka manoloide) and Jared Tarbell, in particular drew me in and I plunged into their code to explore more. Art Blocks made me understand the significance of generative art and how it melded so perfectly with crypto. I was inventively inspired, and I realized that creating a project for the Art Blocks platform would be a new personal long term goal.
Almost immediately, I had the vision that steganography and on-chain art were made for each other. To my knowledge, I am the first generative artist to incorporate steganography. My aspiration was: if code could generate a unique piece of art, then the capability of art to generate its source code is an art form in itself.
The majority of my generative art works, thus far, include LSB (Least Significant Bit) steganography, in the form of hidden messages. Special tools are required to see those messages, and I think that is part of the fun. If you are a coder, like me, you can treat some of my art as a puzzle—a puzzle that is solvable with a little persistence.
I want to push the boundaries of what technology can do for art. Using LSB steganography to embed the entire, compressed source code for each output was something I reserved for Autology. And I have other projects currently underway that use different variants of steganography for future release.
A BRIEF INTRO TO LSB STEGANOGRAPHY
LSB steganography hides binary data within RGB channels of an image. Below is a little tutorial for decoding your first steganographic image. You don’t have to be a computer programmer to follow along.
As you might know, a pixel in an image is the combination of three channels: red, green, and blue. Each of those channels range from values 0–255. If, for example, we were to change a red value from 255 to 254, it would be nearly impossible for the naked eye to discern. Taking that into account, we could make all the RGB numbers even and then hide 3 bits of information (one for each of red, green, and blue) per pixel. This could be done by strategically replacing some of those even numbers with odd ones.
Let’s pretend we have zoomed in on an image, and we’ve been told that this 3x3 pixel grid contains a hidden message and the data is encoded top to bottom, and left to right. This instance can be decoded with a simple paint program. Use the eyedropper tool and note the exact RGB values for each of the 9 “pixels.” Then note which are even and which are odd. Write a zero beside the evens and one beside the odds.
3x3 "pixel" grid with hidden message
Noting evens and odds
Concatenate the 0’s and 1’s from top to bottom, then left to right. This is the binary encoded data. You should have “011001110110111000101110000.” ASCII is a common text encoding scheme that can be represented by numbers 0–255 and which may be represented by 8 bits. Since we think that this is a text message, we are going to split that string of characters into groups of 8. Start from the left of your data, and add a space after every 8 characters. In this instance, we’ll ignore the final group which is shorter than 8. You should now have “01100111 01101110 00101110."
Now all you need to do is convert binary to ASCII. You can use a site such as www.rapidtables.com and paste in your data. You’ve decoded your first piece of LSB steganography!
This process is reversible if you’d like to encode data into an image as well.
AUTOLOGY PROJECT: an evolution
When I began building a long-form generative art project for Art Blocks, I had two main starting blocks. First, I wanted the code to be a focal point by embedding the full source code with LSB steganography. Second, I was zeroed in on naming the project "Recursion"—and due to the nature of the name, I had something entirely different in mind compared to what the final Autology project evolved into.
Steganography was the first piece of the project's custom algorithm that I developed, to ensure that my vision would work. I wrote JavaScript code to read in the canvas pixel by pixel and rewrite those pixels with hidden binary encoded data. I also developed a decoder for collectors.
I used a trick with the JavaScript eval function where the code could write itself out into a variable. I later learned that this is considered an "Eval quine." This trick is quite elegant and wraps the entire JavaScript code in a block which can execute itself.
var _s=`
var _i=\`
...ORIGINAL CODE...
\`;
eval(_i);`;
eval(_s)
With this format, the variable "_s" is available in the original code so you can push the exact code you started with into a string:
console.log("var _s=`" + _s + "`;eval(_s)") // would output the above
The significance of the name Recursion has a through line to the final concept and name, Autology. However, Recursion had some implications.
Recursion is the process a procedure goes through when one of the steps of the procedure involves invoking the procedure itself.
# example
doSomething(i):
if i == 10:
return
else
doSomething(i+1)
In order to honor the project name, and especially since the code itself was a focal point, I wanted to implement source code that was mostly recursive calls. That is risky when trying to support multiple browsers because each browser has their own limits on stack size (i.e. max number of recursive calls). In addition, I wanted to implement visuals that looked recursive—like looking at your reflection in a room with mirrors both in front of and behind you.
After a lot of exploration, I couldn't get the aesthetic to my liking for a long-form implementation. So, I abandoned that path for the project; and instead, I created a Foundation 1/1 that used this early algorithm and an LSB steganographic message hidden within (not the source code, of course). I may create a few more like this in the future.
Meanwhile, I took a step back from the main project at hand and refocused my energies on my generative art history education. As I researched many great artists, I returned to one of my initial influences, manoloide. My engineering and analytical mind is geared to first reverse-engineer how other generative art is made. It's like a mental quiz, and if I can quickly figure out methods just by looking at the output, I might lose interest in the art fairly quickly. Manoloide is one of the artists that keeps me guessing. While browsing his outputs one night I was drawn in by an output that initially looked fairly simple, but after examining it further, I couldn't figure out how it was accomplished until I analyzed the code. This was my introduction to the beauty of Delaunay Triangulation: a technique for creating a mesh of contiguous, nonoverlapping triangles from a dataset of points.
I experimented with ideas to incorporate Delauney Triangulation in my project. But, ultimately, I couldn't find a way to generate enough variation for a long-form usage. I dug a little deeper and discovered the muse I was looking for: an emotive and thought-provoking dual graph of Delauney Triangulation, another mathematical technique known as Voronoi tessellations (or Voronoi diagrams, or Dirichlet tessellation).
A tessellation is an arrangement of shapes fitted together, especially of polygons, in a repeated pattern without gaps or overlapping. Voronoi tessllations generate polygons around plotted points on an Euclidean plane, so that each polygon only contains one point. The polygons are called Voronoi cells. The cells consist of all the locations closer to the cell's point than to any of the other points on the plane.
A Voronoi tessellation emerges from points outward, by radial growth.[3]
Once I realized how ubiquitous Voronoi tessellations are in our lives, it surprised me that I was not familiar with the term. An easy usage example is that of public schools, where students are eligible to attend the nearest school to where they live (as measured by a straight-line distance from house to school). The schools are the points. The school zones are the cells. And the map of all school zones and schools is a Voronoi tessellation.
There are applications of Voronoi tessellations in aviation, architecture, urban planning, mining, robotics, networking, computer graphics, epidemiology, natural sciences, etc. And they are even found in nature, like the spots on a giraffe, dragonfly wings, and a honeycomb (the honeycomb points are plotted in a regular pattern).
Voronoi tessellations had great potential of visual imagery for my long-form generative art project. And, I found that incorporating a structured organization of the plotted points proved to be more interesting than any outputs with strictly randomized points on a Voronoi algorithm.
I played around with adding depth to each polygon and thought I might achieve a more recursive look if I repeated smaller polygons within each polygon. The project was moving in a hopeful direction. And then, as I made a bugfix, I accidentally dropped the outermost polygon. Essentially, the tessellation was broken, as there were now spaces between each polygon in the image. It was a beautiful mistake and became the basis for the whole aesthetic of Autology.
I had a ton of fun in the months to follow, exploring, experimenting, and testing out my ideas.
I envisioned the implicit ways that Voronoi cells could be manipulated and resized. And there were opportunities to include variations of symmetry that naturally promote the eye to draw out faces and fill in gaps, or asymmetry to embrace the use of negative space.
I hoped the outputs would evoke conversation, introspection, and some mystery about the magic of generative art.
EXPERIMENTATION
Since I always find it intriguing to see the progression of a project, I will share a few early Voronoi tessellation outputs that demonstrate some of the evolution to the final algorithm:
no color palettes yet, points are placed in circular formation with repeating points in a circular formation surrounding some of those points
sine wave among randomness, experimenting with glitch, increasing cell spacing/negative space
mirror symmetry, introducing color flow maze and palettes (Aurora)
specific facial experimentation methods (not used in the final algorithm)
incorporating glitch, point formation rotations, noise
A bit of other information within the final algorithm that isn't determined by token features:
Points are plotted inside each grid block in formations like spirals, bezier curves, and more. Points in formations are generally contained in each grid block, however, sometimes they are allowed to overlap a bit. Tying in the early roots of the project's recursive nature, some point formations may contain other point formations 80% of the time. Circle and spiral point formations discernibly resemble eyes when that recursion is triggered. Point formations are randomly rotated, allowing each grid block to interact to the neighboring grid blocks differently and create unique combinations.
The noise, or graininess, is intentional for texture. It is created by subtracting a random value 0-15 from each RGB channel in every pixel. Even though the LSB steganography is difficult to detect with the human eye, randomizing the pixel values a bit prior to the steganography makes it blend in even more since the neighboring pixels are varied.
I developed a color flow maze to determine how the polygons/cells are colored. First, the original connected Voronoi tessellation is used, a random grid block is chosen, and a cell in the grid block is assigned a color from the palette. From there, a maze is generated as the first color flows through to connecting polygons. Whenever the flow reaches a cell that has already been colored, another color is chosen randomly from the palette and a new maze path is created from the last unexplored connected cell. The flow of color is easier to visualize if you study the denser Autology pieces like the ones below. You can also see that color is not included in the symmetry—though, that's not to say that symmetrical color couldn't occur randomly.
Autology #507
Autology #271
The final Autology code is fully on-chain with no external dependencies. A third-party Voronoi Library was also put on-chain specifically for this project. In finalizing the project, I made the tough decision to compress the full source code. Compression saved nearly 50Kb of overhead (which is very significant in blockchain terms), and it also made the code less understandable if you attempt to decode it. Think of it as another step in the fun of decoding Autology.
The embedded code allows collectors to forever have the ability to recover and regenerate their image from a locally saved file, regardless of the status of the block-chain or internet connection. Another benefit is the potential to generate any desired resolution size for print, without dependence on the Art Blocks generator.
FEATURES
PALETTES
Autology has 11 palettes: Sandstorm, Purple Ice, Speedboat, Calico, Aurora, Kitchen Sink, Monochrome, Folkore, Noble, Jazzercise, Capture the Flag. Deciding on color palettes was a lengthy, fastidious adventure. So, I won't elaborate on my process or inspiration for each one. Every palette has between 3 and 8 colors. In general, I am initially influenced by real life objects, nature, and memories.
Some of the palettes were formed as an indirect influence from the art itself. After looking at thousands of test outputs, I was struck by a connection between some of the imagery and indigenous art and artifacts. I leaned into that anthropological influence (an easy interpretation of the study of oneself) and I found color inspiration from indigenous cultures.
Aztec turquoise and a recent experience traveling in the New Mexico, USA desert inspired the colors in Sandstorm.
Folklore was heavily influenced by the late Burton Pete. Burton spent over 40 years creating a variety of art pieces unique to Native American culture. His intricate beaded portraits and landscapes are considered to be his greatest folk art accomplishments. These masterpieces were made in tight single rows, sometimes with over 75,000 beads—like the millions of pixels in an image. I drew inspiration from Burton's work. His colors and the slightly imperfect lines of color that the beads create aligned nicely with Autology's aesthetic.
Pictorial beadwork by Burton Pete
I find that Autology pieces without the glitch feature oftentimes have a vibe of native artifacts. Noble seemed like a natural progression—while not directly from indigenous cultures, this palette was a sample of coins and precious metals. Gold, Copper, Bronze and Silver were all influences here, along the theme of hidden treasure.
Walmatjarri Aboriginal artist Jimmy Pike was the inspiration for Kitchen Sink, which has eight colors. I was drawn to the vivid colors of Pike's many works. The near tessellation in his "Rainbow Serpent" painting particularly caught my eye. As I dug more into Aboriginal Australian culture and mythology, I learned that the Rainbow Serpent is a mythical creature that represents the great and powerful forces of nature and spirit.
Jimmy Pike's "Rainbow Serpent"
Folklore - Autology #329
Folklore - Autology #306
Kitchen Sink - Autology #636
Kitchen Sink - Autology #585
Noble - Autology #442
Noble - Autology #393
Sandstorm - Autology #133
Sandstorm - Autology #600
Jazzercise - Autology #969
Jazzercise - Autology #158
Monochrome - Autology #797
Monochrome - Autology #232
Speedboat - Autology #609
Speedboat - Autology #417
Capture the Flag - Autology #906
Capture the Flag - Autology #065
Purple Ice - Autology #131
Purple Ice - Autology #498
Aurora - Autology #433
Aurora - Autology #282
Calico - Autology #342
Calico - Autology #986
GRID WIDTH and GRID HEIGHT
Structured organization for the tessellation points begin with a grid. The width varies between 1 and 6 grid blocks, and height varies between 1 and 5 grid blocks.
SYMMETRY
Symmetry determines whether a piece is horizontally symmetrical (mirror), sections of the grid are symmetrical (sectional), or if there is no intentional symmetry (random).
Mirror - Autology #745
Sectional - Autology #911
Random - Autology #463
GLITCH
No glitch means each polygon/cell is reduced to 60% of its original size, while keeping the point center.
Minor glitch alters each polygon size to either 40% or 80% of its original size in a 50/50 distribution.
Major glitch changes every polygon to a random size between 20% and 100% of its original size.
The absence of glitch in #565 produces organic outlines and curves, whereas #838 (minor glitch) and #564 (major glitch) are respectively more blocky and chaotic.
No glitch - Autology #565
Minor glitch - Autology #838
Major glitch - Autology #564
ROCKY ROAD
Rocky road creates imperfect organization of certain types of point formations, such as bezier curves. The result is a wider variety of polygon shapes within those curves. Whereas the smooth default generally aligns those polygons more evenly.
Rocky Road - Autology #184
Smooth - Autology #772
MARGIN
No margin allows polygons to extend off the frame. A margin maintains a border of negative space, and any polygons that touch or overlap the edge are filtered out. This clipping is most obvious in pieces such as #857 where just a few polygons are shown in the upper corners.
If you own an Autology, you can decode it as follows
Navigate to the live view of your Autology token and click 's' to save it locally.
Then come back here and open the file by clicking "Choose a file..." and select that image.
The embedded data will be shown below.
NOTE: Only the live view will work. Art Blocks, OpenSea, and others use lossy compression for their static images which removes LSB steganography.
Embedded source
FAQ
How is the source encoded into the artwork in the "Autology" project?
The source is encoded within the original generated images using a "Least Significant Bit" or LSB encoding scheme which is a variant of steganography. The source code is first broken down into a binary representation. Each bit is then encoded into the RGB values such that each pixel contains 3 bits of data (i.e. one for each of red, green, blue). Since the pixels are only lightly modified, it is very difficult to see any visible change in the image.
What is steganography?
Wikipedia defines steganography as "the practice of concealing a message within another message or a physical object. In computing/electronic contexts, a computer file, message, image, or video is concealed within another file, message, image, or video."
How can steganography be art?
The "Autology" project displays how the source code of a generative art piece may be embedded directly and imperceptibly in the artwork itself. You may derive the source from the art and vice versa in infinite recursion. The code which generates the art is literally part of the artwork.
Are you the first to do this?
Steganography has been around in many forms for generations. However, to my knowledge this is the first long-form generative art project to make use of it.
THANK YOU
Thank you to all the collectors—it is you who make the art world go-round. Thank you to the curious collectors who are exploring the steganography and implementing their own decoder in other programming languages. Thank you to everyone who has shared an image online, posted their interpretations of the art, or named their Autology piece. The feedback has been phenomenal. I am humbled, and I sincerely thank you.
I'd also like to thank:
The amazing team at Art Blocks, and the community.
Cyphr and members of the gmDAO for promoting my work when I had a small following and for simply being good/helpful humans.
ApelyShilling for apprising me of an unintentional bug in my code that I was able to fix before the release.
Kevin Rose for planting a seed for this project before he probably even realized he was an influencer.
The full Autology collection may be viewed on Art Blocks - Project 209, and pieces are available for purchase on a secondary market such as OpenSea.
Join me in my Art Blocks Discord channel to talk about Autology and/or to try out the Artbot filters (check pinned messages for details).