Summer, 2025. Details forthcoming.
An open-form collection.
[view on
fxhash ↗︎]
Inner Forms is a psychic successor to The Self Trilogy.
Where
that explored Freud's theories on the id, ego and superego, this
explores Jung's ideas around archetypes and the collective unconscious.
"Who looks outside dreams; who looks inside awakes."
—
C.G. Jung
FX(hash) just invented open-form and this project is
using it.
Open-form collections allow for direct relationships between
specific pieces in the collection.
How does it (basically) work?
- You mint a random piece.
- Hate it? Re-roll it until you like it. (Or, burn it.)
- Satisfied? Mint another based on it.
- The descendant evolves in some way from its parent. (See below.)
- Then that descendant can be burned, re-rolled or spawn descendants.
- You can make a whole family tree.
Here is an example of how evolution is used in
Inner Forms with a lineage of 4 generations, starting
from scratch.
Hopefully it's clear that each descendant builds on its ancestors; each generation has the potential to
build (or hide) complexity through adding new elements and altering composition.
What might not be clear above is that each generation gets a little bit taller, in terms of aspect
ratio.
It's a little more apparent with the sample below, as this jumps 50 or so generations down.
We have limits, for now. The algorithm will only pay attention to the most recent 256 generations in
the
lineage even if somehow you minted one at the 1000th generation.
I had to draw the line somewhere. (It was breaking my browser, so there's that. There's a chance yours
may
break earlier.)
One last thing, open-form allows you to update the algorithm as well... so as tech evolves, more
Inner
Forms at deeper depths may be possible. Stay tuned.
C.G. Jung felt dreams were our
unconscious trying to communicate with our conscious mind.
Dreams aren't literal and are often symbolic, but where do these symbols come from?
What Jung—and others—found was that some symbols or situations that dreams conjured would convey roles,
ideas or images that
the dreamer had no experience with in their waking life.
This was common across folks from different places and walks of life.
Jung called these symbols
archetypes or
primordial images. Freud called them
archaic
remnants.
Some examples include: the trickster, the hero, the flood, the shadow, the maiden and the anima/animus.
There are many more, and often they could appear in various combinations in a dream, in subtle or obvious
ways.
Jung believed we are born with these programmed into us,
and that they evolve over time, just as a species or society may evolve. He rejected the
tabula rasa
theory
of psychological development, where people are blanks slates, formed only by their personal experience.
He also felt that this
collective unconscious was the reason why there are similarities in our
various mythologies.
This project abstracts these inherited symbols/
archetypes as patterns passed down between each piece
in the collection.
They may not manifest the same way each time, but so is the case with our individual psyches or our
unconscious mind's use of these collective images.
Pieces that share a lineage may share elements, but each will be drawn slightly different or may
be masked by another element, partially or completely.
The final composition does not represent an archetype directly, but rather abstracts the liminal space
between the
unconscious and conscious, where these symbols are combined in an individual way, echoing how Jung
felt these collective symbols manifest to each person uniquely.
Ultimately, each composition is constructed of layers of patterns that have been cropped and composed in
individual ways. The patterns persist through generations, but the cropping and compositions vary and
evolve. Some layers may dominate others while some may be hidden completely.
There will be repeating motifs throughout the collection as well—even if there is no shared lineage—due to
the nature in how each pattern is drawn.
There's a bit over a dozen of main composition types. Some have variants. Not all are available from the
start.
A few are represented in the samples on this page, but some will be surprises that reveal at certain
generations.
3 basic ones are available from the start, and 3 more appear for the 2nd generation. A few more at 3rd, 4th
and 5th. Then we skip until 10th, 15th, 25th and 50th generations before anything new is added.
The final type added at the 50th generation creates combinations of the other compositions.
Since the aspect ratio
keeps growing, at a certain point, images get very tall so this photo-booth style allows for various
permutations.
At 50
generations, you can have 2 composition types in 1 piece, 3 once you hit 100 generations, and finally 4 at
200
generations.
Full list will appear here before collection release.
Press "I" to toggle the info card.
Press "G" to save a GIF.
Press "B" to save a bigger GIF. (If you specified a custom height, etc.)
Press "J" to save a JPG at current size.
Press "R" to render high-resolution JPG.
Press "P" to show the parent.
Press "D" to render a random descendant.
Press "Q" to render a random sibling.
Press "A" to generate a random piece with no ancestor.
Press "Z" to generate a random piece at a random generation.
Add some combination of these to the url to customize the outputs. Some combinations cancel others and who
knows, could break the output. Use your best judgement.
&static=true : Only render one frame (useful for rendering large images for prints)
&height=X : draw images at X height (width will be calculated)
&aspect=X : override the aspect ratio (width / height; 0.5 will be twice as tall)
&square=true : aspect ratio of composition remains the same, but full image will be padded out so the
image is a square
&saveframes=true : Save each frame of GIF locally as it renders
&gframes=X : Render GIF with X frames (default: 5)
&gdelay=X : Render GIF with X milliseconds between frames (default: 100)
&gheight=X : Render GIF with X height (default: 2000)
&grain=X : grain level (default: 1, higher is more grain, 0 is none)
&ff=true : "force fabric" — Safari was slow rendering the texture, so by default it doesn't get all
the texture rendered in Chrome, use this to override.
First, you need a high resolution static image.
To get one, you can append this to the url:
&static=true&height=5000
Want it taller? Increase the number. The higher the number, the longer it takes to render. Chrome seems
to be faster than Safari.
If you want it to be square, add this too:
&square=true
Square images at high generation counts can take a while, as well.
Once it renders, tap "J" to save the JPG.
Papers, printers, frames, etc:
You want an acid-free archival paper, preferably textured, so make sure that whatever printer you choose
has a good selection.
Personally, I made prints using Hahnemühle William Turner (310
gsm)
but there
a number of papers from Hahnemühle that will work, like German Etching (310 gsm) or Museum Etching (350
gsm). Lower gsms are fine but have a flimsier feel. Up to you.
If you have a local printer/framer that you like, please support them.
If not, I recommend
Whitewall for ease, expediency and a
high quality print. Choose their "Fine Art Print" (which uses the Giclée process) and then make sure to
select the
William Turner paper. They'll also frame it for you which is the real treat. No second trips to the
frame-shop.
Tribeca
Printworks
is another option, they have German Etching paper and while I haven't
personally used them, they are well regarded.
Inner Forms is written in vanilla Javascript, composed as SVG and then rendered to a 2d canvas. It is then
processed a little bit.
There might be slight differences in rendering from browser to browser. This is expected as they might
translate the SVG
slightly differently. Let's call Chromium renderings canonical. They also render faster there and we love
that.
Shoutout to
Matt DesLauriers for A) being an
incredible artist, and B) for writing
gifenc, a wonderful GIF encoder for Javascript that was used in this project.