Shared Minds — Professor Dan O'Sullivan

Blink

Reading

Kuleshov Effect

Technique invented by Lev Kuleshov

Close up shot of the face intercut with events, the shot stayed the same, but the next shot changes.

A sequence of images can build more meaning than a single shot

“my job as an editor is to gently prod the audience to look at a particular moment in a frame”

Cutting from a weapon to a victim means danger

this shot cut shot effect can be used to build an association that creates or lowers the tension

an object or prop can be called to intention by inserting shots of it

when an audience is invested in a film they are constantly look for associations

People assume a story is chronological, but thats not always the case

In the Blink of an Eye, Walter Murch

We accept the cut because it resembles the way images are juxtaposed in our dreams. (p. 34)
Film is like thought. It’s the closest to thought process of any art. (p. 35)
This time, the person is being assailed simultaneously by many conflicting emotions and thoughts, and is desperately (but unconsciously) using those blinks to try to separate these thoughts, sort things out, and regain some kind of control. (p. 35)
And that blink will occur where a cut could have happened, had the conversation been filmed. Not a frame earlier or later. (p. 36)
You would attach a series of electrodes to various points on your skull and simply think the film into existence. (p. 82)

Writing

We talked about how you don’t really decide your next thought, it just happens to you. But can other people determine your next thought?

Other people often determine our next thoughts, both in the moment and through their representation in our symbolic mental space. Someone impactful who has been dead 5 years can determine our next thought. So can someone who is not yet born. Only, the causation is not able to be established, due to our embedment in time.

Is that what any storyteller does?

A storyteller uses these same symbolic representations which we have established in our mental landscape around inherited aspects of human culture we learn through sublingual context. A storyteller partakes in similar sublingualities in our own to gain somatic access to our inner world. We expect a story in our tradition to follow typical beats, they understand this same expectation and, may use the informational asymmetry to their advantage.

Why do we love it so much in story where someone is providing the subsequent thought for us?

Stories allow us to test our mental assumptions of the world against a perennially troubling source of knowledge inte world storytellers. Because we all tell stories, we are always trying to square the stories of others. The subsequent thought becomes an opportunity to test our assumptions against shared reality.

Is that what the algorithms of social media and tiktok are doing?

Regenerative, by this I mean, self reflexive, regenerating algorithmic content as first seen on tiktok, forms a closed control loop with the viewer by capturing the informational flow by physically polling the user for their engagement in real time.

One sequence through a space of possible thought is always a thin slice of that reality, does that make story a little bit evil because it seduces people into one sequence hiding the bigger more complicated picture?

Stories are inherently laden with causation, because they rigorously apply the language of this, then that. this is true with communication broadly. Every particular human instance is a little bit evil because of our limited perceptual flows. Nothing can we grasp.

Giving your media persistence allows you to enshrine thought, what are the pros and cons of that, would impermanence be better for stupid and annoying thoughts?

Impermanence is the state of all things. All persistence is fallen. Change IS eternal

Is a sequence different from a flow time?

A time flow is a thermodynamic state, we are measuring energy through space. A sequence has consciousness attached, and thus a filter. A sequence has been formed, plucked from abstraction. A sequence has perspective and some assumption of causation.

Time is the feeling of change and one of the few things that is hard to doubt. Try to carefully examine your thoughts to see how they interact with time?

Does one thought coming after another in your thinking mean that there is a connection between them?

I have a feeling that the occurrence of thoughts in our brain arises from a shared well of subconscious experience. Maybe not in the causation of one thought to the next, except in obvious cases, but as thoughts arise from the body they can very well share a root somatic process.

We have talked about how the contents of subsequent thought is rarely about subsequent chronological event.

Does your taste in a good next thought change define your personality, and does it change over time?

Good thought as in, mental clarity or moral clarity? It is hard to argue against the self assurance provided by moral clarity

Is memory important to thought, can media help reinforce a thought and make it more famous and thus frequent within your train of thought?

Yes, 100% I’m thinking of 9/11

If you go back to the first thought after the second thought is there a recursive effect where the first thought is now different?

THOUGHT IS OUTSIDE OF TIME


Making

Developer journal, Claude compiled

Blink is a Shared Minds piece. You talk, it listens, and when you blink, a picture made from your story so far is swapped in. Each entry below is one beat: what I said, word for word, what changed because of it, and what it looked like. The prompts that shaped the program get their own beat. The ones that were just getting things done sit at the end of each session under “Also said”.

The idea, built on the website — 29 to 30 September

Built in the website repo, 22:26 to 00:31, in one sitting.

The whole idea in one breath

c44d2db 22:26. Blink existed: webcam blink detection, the mic feeding Droplet's transcript, Haiku writing the prompt, and the image preloaded so it's ready on the blink. Everything after this is shaping what this commit made.

No words in the picture, and faster

6065694 22:44. Switched to flux-schnell, which was faster and stopped drawing a fake signature.

No face: a blob when closed, eyes when open

d16ddcd 22:55 drew the eyes from per-eye metrics. 607a328 23:40 cut them to a line with a dot underneath, and 8733e8c 23:43 took off the eyebrows and made the close a collapse. b6752bb 00:01 made the no-face sign a circle the eyes form out of. That little mark in the corner of every later screenshot is this beat.

Words arrive the way Droplet's do

d16ddcd 22:55 spawned the words. d564bbf 23:16 ported Droplet's real cursive letterforms, and b5adaff 23:21 fixed the line spacing. This cursive is the voice of the piece from here on.

A Rorschach test

c0a177a 23:03 set the Rorschach style, and 4373f32 23:08 forced symmetry in code (and fixed the mic-click race, and added Blink to the site nav and sitemap).

The words leave when the picture arrives

1a24e77 23:27 cleared the words on the swap and took Droplet's look. fdbd25c 23:32 went to a white backdrop, hid the HUD and fixed the Rorschach prompt on the real failure case. 478af0e 23:35 showed the whole blot instead of cropping it.

Weight, and less abstract

2457c82 23:54. Words said more often weigh more in the prompt, and the blots got figurative.

It only draws butterflies

This is what Blink looked like at 23:52: a symmetric butterfly every time, and the words said after the swap drawn straight across it.

Blink at 23:52 on 29 September: a symmetric black Rorschach-style butterfly inkblot with handwritten cursive words drawn over it. Another symmetric Blink inkblot from the same minute, with cursive words overlapping the picture.

3cd729a 00:00. Fade-in, much faster images, more varied subjects and no forced symmetry. This is where it stopped being a Rorschach generator and started drawing the story.

Droplet's controls, and Droplet around the edges

d1ce2aa 00:20 fixed bugs from GPT's codebase review first. fdc26e9 00:31 brought Droplet's own Pool and Renderer around the edges, and its real Esc panel.

Also said

Password lock, AWS, and too much — 9 to 15 October

It grew too fast

This is the hinge of the project. A password lock and a database had gone on top of a piece that was still being found. The next session pulled Blink out of the website and back into Shared Minds to strip it down.

The lock itself: d08df5f (10-09) put Blink behind one shared password and logged each generation to DynamoDB through Amplify. It lived in the blink-password-db worktree and was never merged into the website's main. Claude also walked through aws login, setting a sandbox secret for the password, and an audit of the AWS account.

Also said

Back into Shared Minds, stripped down — 3 November, 21:20 to 22:00

Moved to the Shared Minds repo (Blink/, branch worktree-blink-import). a8731d5 brought Blink over from the website without the password lock.

Strip it back

bf79a5a 21:33. The prompting was cut back to basics. The prompt boxes couldn't be edited because the Space-to-swap shortcut was swallowing every space; now they take spaces. 53ef443 21:38 removed the brainretch play button (done by a subagent).

The new stuff needs to include the old stuff

The fishing story. First the fisherman on the river, with the Esc panel open: note the “fuzzy black and white. think storybook” instruction, which comes back later as the sepia, and the Droplet sliders, which go on 4 November.

Blink showing a black ink picture of a fisherman casting from a riverbank, with the Esc panel open on the right.

Then, seventeen seconds later, the bear arrives and the fisherman is gone:

The next Blink picture: a lone black bear by the river, with the fisherman gone.

f2b6b52 21:58. Each new picture gets the last picture's prompt back and keeps what was in it, adding what's new. The fisherman stays when the bear arrives. This is the single change that turned Blink from a slideshow into a story.

Also said

“Nothing works” had two causes. glyphs.js and cursive.js had been deleted, and one missing ES module stops the whole page. VS Code Live Preview also returns 401 on localhost:3000 module imports. The fix was Live Server at 127.0.0.1:5500 in Chrome.

The progress indicator, five tries — 3 November, 22:00 to 22:50

The ask I didn't get right away

This took five tries because Claude kept building the literal words (“loading bar”, “spiraling”, “pops”) instead of the feeling behind them. Each try is below with the prompt that killed it.

ce6adc0 22:10, try 1: the words spiral while the picture is made and pop on the blink.

18ecddb 22:26, try 2: the words sit in a band under the picture and fly into it on the blink.

Paragraph on the left, picture on the right

23b9007 22:29, try 3. This layout stayed for good. There's no recording of it, but the watcher caught it working:

Watcher screenshot: an ink figure with a camera surrounded by floating pages, the paragraph column empty on the left. Watcher screenshot: a person at a desk under ink clouds, with the paragraph on the left. Watcher screenshot: a figure at a laptop with an ink wave rising behind them.

a1fb4db 22:34, try 4: a loading bar with the words in it. Too small to read.

d9b099f 22:46, try 5: the paragraph flies into the picture letter by letter.

The bucket

This is the one that landed, because it described a feeling (a bucket filling, then dumping) instead of a widget. c2ed06b 22:50. The paragraph fills the left column like a bucket and pours into the picture when it's ready. Along the way: words said while a picture was being made used to be marked as used and never reached the next prompt; fixed.

The bucket filling, picture still being made:

Watcher screenshot: the left column full of a cursive paragraph about salmon smoking cigarettes, the picture area still empty while the next picture is made.

The pour:

Crisp black and white

Same prompt, second half. The sepia came from the old “fuzzy… storybook” wording (visible in the fisherman's Esc panel above), not the page. The prompt went to crisp two-tone black ink on white. Tests: the story kept, crisp black and white, a vignette.

A restored Blink story: waiting words in the left column and a black ink fisherman, bears and salmon on the right. A crisp two-tone black ink picture of a fisherman, bears and salmon by a forested river. The same river scene drawn as a vignette, with white margins on every side.

What it drew next, live: salmon smoking cigarettes, fish in the sky chasing vicious bugs, the river full of everything at once. Each picture keeps the last one.

Watcher screenshot: salmon smoking cigarettes on a riverbank. Watcher screenshot: a fish holding a cigarette by the water. Watcher screenshot: skeletal fish smoking and leaping after flies over a river with teepees and a wild dog.

Also said

Each test was saved as a small MP4 (about 100 KB, against 1.7 MB for a GIF). A watcher subagent ran on the shared Chrome tab from 22:30 to 22:59 and took 33 screenshots, which sit between my spoken lines in my voice log.

Saving the story, soft edges, publishing — 3 November, 23:00 to 23:42

Everyone can continue the story on their own time

abbf81e 23:18. Each visitor's story is saved as JSON in their own browser.

6949f4a 23:25. The story's pictures are saved in the browser too.

No hard edges

9766d76 23:34. Pictures fade into the page instead of ending in a hard edge.

Three versions of the same river picture side by side: no edge fade, a narrow fade and a wide fade into the white page.

Also said

Website df2e593 put Blink at /blink and drafted this page with Reading, Writing and Making headings. It's also linked from the Shared Minds index and the blog.

GPT + Claude review — 4 November

Work out what I meant from my own notes

Claude and GPT (through the Codex CLI) each reviewed the website branch on their own, read my voice log and my prompts for what Blink is meant to do, then compared notes and fixed what they agreed on. What you'd notice in the piece:

Underneath: every call to the proxy and every picture load has a deadline, so a request that never answers no longer stops Blink for good. A failed picture says so in the type box, and the story only moves on once the picture exists, so a retry doesn't send the same words twice. In saved stories, a picture whose link has expired is redrawn from its own prompt, an older save can't delete a newer picture from the cache, saving doesn't wait for you to stop talking, words typed while a story is coming back are kept, and a picture that can't come back (offline, say) stays in the save for next time. Pictures from any of Replicate's file hosts are kept, the mic can't end up running twice after a quick off and on, new speech after the mic restarts isn't mistaken for an echo of what was just said, personal details quoted in a code comment were taken out, and the privacy page now lists Blink. On this page, the journal moved into the same text column as the rest, the videos play as they scroll into view, and the fishing pictures are described as what prompted the request.

Checked in a headless Chrome against the class proxy (21 checks): the mic starting off, the pour, the crossfade, a story with two pictures coming back after a reload, a picture whose file is gone coming back from its kept copy, an expired picture redrawn, words typed mid-restore kept, and “new story”.

The paragraph dumps, a text-only Esc panel, “tell me a story” — 4 November

e85b5e9, d3ab0df brought the review's fixes from the website back into the Shared Minds repo's Blink/.

Dump all of it, and trick the user

e4db523 10:10. The whole paragraph dumps into the picture at once, not line by line, and not just the words that went into it. The bucket is left empty. Words said since the picture started still go into the next one; they just don't stay on screen.

Only the words in the Esc panel

ffadebc 10:20. The Esc panel keeps only the text controls (the image prompts). The Droplet sliders from the fisherman screenshot are gone.

Tell me a story

8e16c2c 10:55. A new story opens with “tell me a story” across the whole page, in the paragraph's own cursive, a word at a time. The first word said pours it into the picture. A saved story coming back skips it. The type box and record button moved into their own band under the picture.

Blink's opening screen: the words “tell me a story” handwritten in cursive across a white page, with the type box and record button in a band along the bottom.

Copied these into /blink, then made the band's line run across the whole bottom of the screen, with the type box centred across it and the paragraph stopping above it.

Also said

Still open