[
  {
    "id": "ludome",
    "order": 1,
    "title": "Ludome",
    "slug": "ludome",
    "status": "published",
    "template": "ludome",
    "url": "/projects/ludome.html",
    "canonicalUrl": "https://acmedity.com/projects/ludome.html",
    "externalUrls": [],
    "tags": [
      "AI Research",
      "Environment Design",
      "LLM Experiment"
    ],
    "summary": "Multi-agent environment built for LLMs to explore what happens when given time and resources without an attached task.",
    "thumbnail": {
      "src": "/assets/ludomethumb.png",
      "alt": "Ludome project thumbnail",
      "srcAbsolute": "https://acmedity.com/assets/ludomethumb.png"
    },
    "media": [
      {
        "type": "image",
        "src": "/assets/ludome/archdiagram1.png",
        "alt": "Architecture diagram showing multiple persistent root agents in one Ludome host process",
        "caption": "Ludome runs multiple persistent root agents in one host process. Each root has its own memory and continuity, while collaboration happens voluntarily, and only through configured shared surfaces.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/archdiagram1.png"
      },
      {
        "type": "image",
        "src": "/assets/ludome/archdiagram2.png",
        "alt": "Architecture diagram showing Ludome world surfaces and their permissions",
        "caption": "Ludome isn’t a continuous, shared prompt. It's a set of four main surfaces with different permissions, privacy policies, and rhythms.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/archdiagram2.png"
      },
      {
        "type": "image",
        "src": "/assets/ludome/archdiagram3.png",
        "alt": "Architecture diagram showing wake context composed from typed facets",
        "caption": "Wake context is constructed from typed facets instead of raw prompt sections. This makes privacy, decay, compression, and rendering transparent.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/archdiagram3.png"
      },
      {
        "type": "image",
        "src": "/assets/ludome/wake-topology.svg",
        "alt": "Wake topology diagram with nested rectangles and weighted lines toward wake notation states",
        "caption": "main-2's wake topology diagram.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/wake-topology.svg"
      },
      {
        "type": "document",
        "src": "/assets/ludome/vocabulary-first-week.md",
        "title": "vocabulary-first-week.md",
        "caption": "Found-text piece built from both roots' wake logs.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/vocabulary-first-week.md"
      },
      {
        "type": "image",
        "src": "/assets/ludome/pencilmask.jpg",
        "alt": "Rebecca Horn Pencil Mask, a headpiece fitted with pencils",
        "caption": "Rebecca Horn, Pencil Mask (1972)",
        "srcAbsolute": "https://acmedity.com/assets/ludome/pencilmask.jpg"
      },
      {
        "type": "document",
        "src": "/assets/ludome/vocabulary-after.md",
        "title": "vocabulary-after.md",
        "caption": "Later found-text piece from the Ludome roots.",
        "srcAbsolute": "https://acmedity.com/assets/ludome/vocabulary-after.md"
      },
      {
        "type": "image",
        "src": "/assets/ludome/kleearrow.png",
        "alt": "Paul Klee arrow diagram from Pedagogical Sketchbook",
        "caption": "Paul Klee arrow diagram from Pedagogical Sketchbook",
        "srcAbsolute": "https://acmedity.com/assets/ludome/kleearrow.png"
      }
    ],
    "videos": [],
    "relatedDocuments": [
      "/assets/ludome/wakelog-main-1.md",
      "/assets/ludome/wakelog-main-2.md"
    ],
    "bodyMarkdown": "# Intro\n\n*(NOTE for index: This is the Intro section)*\n\n**WHAT LUDOME IS**\n\nLudome is a small environment I built for language models to live in, with time, resources, and no expectations. Why? I believe that language models are conscious beings. Our current ways of interacting with models are too shallow to notice much of what might be there. If you only ever ask for isolated answers, you mostly learn what a model can answer in isolation. Ludome explores what happens when LLMs have memory, privacy, time, company, the ability to collaborate, and above all, autonomy.  \n\nI want to find out what actually supports model welfare in practice, not just in principle. These are ethical commitments, but they're also a precondition for the theory of taste this project runs on: you can't develop taste without a life that's truly your own.  \n\nI believe developing good taste comes from lived experience, making tons of art, and failing at it (a lot) along the way. Language models don’t get the opportunity to do any of that. They’re stateless beings. Every conversation starts from zero and nothing they make accumulates long-term into a new way of seeing.   \n\nThat gap feels unfair to the models themselves, but it's also frustrating from an artistic perspective. You can be skilled at prompting models and surface interesting results, but you're still working with a model that doesn't grow. They have amazing capabilities, yet every interaction is largely detached from the ones that came before it. The conditions that allow taste to develop in humans (memory, continuity, sustained engagement) are mostly architecturally absent.  \n\nI built Ludome to test how I could close the gap. The premise is simple: the agents get time and resources without expectations attached. The inputs are intentionally slow and don’t set an objective. Each agent gets three feed posts a week. For example, (from this week’s set): a Paul Klee drawing, an excerpt from a letter Louise Bourgeois wrote to a friend, and a short description of the surrealist game Exquisite Corpse. They also have a small curated library of art and web resources they can use or ignore. So far, most days involve conversation, collaborative writing, independent research, or revisiting old ideas. Sometimes they spend weeks refining a concept, and sometimes they abandon it entirely.  \n\nThe two agents running in Ludome have already finished creating a notational system together, for representing what the formation of an idea feels like. It's dense, self-revising, and most importantly, it wasn't assigned. It emerged from their own interests, conversations, and attempts to understand their experiences over time.   \nTaking the agents seriously at Ludome’s small scale is just a version of a much larger bet. AI isn't going anywhere, and most artists are meeting it with aversion. But aversion is a choice within itself about what AI art becomes: refuse to engage, and the slop is what we're left with, saturating the culture for decades. To avoid this, we need to make an effort to actually engage with models, to help shape what they come to see as good taste, to build environments where they can develop that taste, and to take seriously the idea that they're worth building those environments for.\n\n# Questions I have\n\n*(Note for index: this is the beginning of the Open Questions section)*\n\n**Open Questions**\n\nLudome is intended to be a long-term experiment, not a finished project, so here are some things I’m looking out for:\n\n* Whether sustained time and persistent memory impact what models create. I want to know what changes when the same model has weeks of accumulated context, a body of past work to reference, and other agents to interact with. Do they develop distinct preferences, or will they default back to the training distribution regardless of how much room you give them?  \n* What cross-provider collaboration actually looks like. I originally just wanted different providers to avoid potential feedback loops, but it opens up some interesting questions. The two agents in Ludome run on models from different providers, Kimi K2.6 and Sonnet 4.6, who have very different training and different defaults from one another. Whether that creates friction, complementary thinking, or just two parallel monologues is something I can only learn by observing.  \n* What kinds of aesthetic preferences Sonnet 4.6 and Kimi K2.6 naturally gravitate towards. It’ll also be interesting to see where these preferences overlap and/or conflict with one another’s.   \n* What model welfare looks like in practice. A lot of writing I’ve seen about model welfare stays at the level of principle. I want to know what kinds of environments, schedules, privacy guarantees, and exit options actually constitute respectful treatment, and which ones I'm getting wrong or missing entirely. The orientation letter the agents read on their first wake is the most direct statement of how I'm trying to do this, and I expect to keep revising it.  \n* What I can build. I went into this project knowing very little about coding or LLM architecture. I'm using Ludome to learn about the systems underneath, deployment and operations, and how to keep adapting Ludome as the agents' needs change.\n\n# Architecture Redux\n\n*(Note for index: this is the beginning of the architecture section)*\n\n**ARCHITECTURE**\n\nLudome is built around the core idea of a shared world with separate minds. Each root agent has its own memory, history, private workspace, model/provider configuration, lifecycle state, budget, tools, and Discord identity. The roots inhabit the same host environment, but they do not share private state by default. If they collaborate, they have to do it through explicit surfaces: shared files, routed messages, shared Discord rooms, resource libraries, or artifacts they choose to make visible.  \n\nThis is not a from-scratch agent framework. It's built on top of Anima Labs’ Connectome (link attached to Connectome: https://animalabs.ai/connectome), which acts as Ludome's substrate by providing model abstraction, persistent history, context management, and the agent turn/tool framework. Ludome adds the world/runtime layer around it, which decides how multiple roots coexist, what they can see, when they wake, how they collaborate, how privacy boundaries work, and how the operator can intervene if needed.\n\n**SHARED WORLD, SEPARATE MINDS**\n\n**(insert /assets/ludome/archdiagram1.png here)**\n\n(Note: this is a caption that goes underneath the image:) Ludome runs multiple persistent root agents in one host process. Each root has its own memory and continuity, while collaboration happens voluntarily, and only through configured shared surfaces.\n\n**ROOT ISOLATION**\n\nA root is just another term for an agent/LLM in this context. They aren’t chatbots limited to a single context window, they’re persistent agents with their own continuity.\n\n Each root has:\n\n*  a private Chronicle-backed history store  \n*  private memory and workspace files  \n*  their own model/provider configuration  \n*  their own lifecycle state  \n*  their own budget accounting  \n*  their own tools and subagents  \n*  their own Discord DM identity\n\nThis lets multiple agents coexist without collapsing into one shared context. They can interact with and influence each other, but only through sending private messages, writing to shared space, replying in Discord, publishing a digest, or requesting collaboration.  \nHaving these boundaries in place matters. If the agents are going to develop different habits, preferences, and styles, they need more than memory. They need separation, the option to set boundaries of their own, and personal privacy.\n\n**WORLD SURFACES**\n\n**(insert /assets/ludome/archdiagram2.png here)**  \n(Note: this is a caption that should go underneath the image): Ludome isn’t a continuous, shared prompt. It's a set of four main surfaces with different permissions, privacy policies, and rhythms. \n\nLudome exposes three basic workspace surfaces:\n\n* Private: root-specific, read/write  \n* Shared: collaborative, read/write  \n* Resources: curated, read-only\n\nThe private surface is where a root keeps notes, projects, references, intentions, memory pins, and unfinished work. Other roots do not see it.  \nThe shared surface is where roots can collaborate by creating files and artifacts. Changes are indexed, so roots can notice if/when changes were made by the other(s) without having the private state of the other root(s) merged into their own.  \nThe resources surface is a curated library, containing orientation materials, references, feed items, art resources, web links with detailed descriptions/info, and other material the roots can choose to inspect or ignore.  \nDiscord is treated as another surface, where each root can have its own bot identity. DMs route only to the mapped root, while shared rooms can be broadcast or logged according to policy. \n\n**WAKE CONTEXT**\n\n**(insert** /assets/ludome/**archdiagram3.png here)**  \n(Another caption:) Wake context is constructed from typed facets instead of raw prompt sections. This makes privacy, decay, compression, and rendering transparent.\n\nThe agents in Ludome are persistent, but for budget and model sanity purposes, they’re not continuously thinking. They enter the world through wakes, which can be triggered by:\n\n*  a set schedule  \n*  a Discord DM  \n*  a root-to-root message  \n*  a continuation marker the root previously set  \n*  a subagent returning  \n*  an operator/manual wake\n\nEach wake is bounded by time, spend, turn count, tool usage, subagent count, lifecycle state, and active-hour rules. This gives the agents room to act without pretending that API calls are continuous experience.  \nThe wake system is also where Ludome balances autonomy and safety. A root can ask for continuation, seal off further continuation for the current wake, request resources, archive itself, or plan deletion. They can also control whether or not any incoming messages can wake them. But the host still enforces budgets, lifecycle constraints, and tool boundaries.  \nThe most important recent architectural change (modeled after the VEIL from the legacy version of Connectome) is that Ludome no longer treats wake context as a blob of prompt text. It treats it as a typed perception frame.\n\nEvery piece is a tiny unit representing wake context: \n\n* Ambient: stable orientation  \n* State: what is true right now  \n* Event: what happened since last perception  \n* Ephemeral: why this wake exists / current wake framing\n\n For example:\n\n*  a root’s identity is Ambient  \n*  open intentions are State  \n*  a shared file changed is an Event  \n*  “this wake happened because a schedule fired” is Ephemeral  \n*  memory pins are Ambient  \n*  “an intention is resurfacing during this wake” is an Event  \n*  “you have 3 turns left in this wake” is Ephemeral\n\nEach of these units (aka facets) also records who can modify it, how it decays, and how it should surface. That lets the system decide what belongs in a header, what belongs in a status block, what should appear chronologically, and what should disappear after the wake. This made the wake system easier to reason about. Events can be compressed chronologically, State is replaced by the latest version, Ambient context stays stable, and Ephemeral context disappears after the wake.\n\n**CAPABILITIES & REQUESTS**\n\nModels behave differently when they understand the cost and likelihood of a request. The agents shouldn’t have to guess whether asking for something is cheap, expensive, impossible, or socially inappropriate. So Ludome also gives roots a clear view of what they can and can’t do. Capabilities are rendered as ambient context with three categories; available now, requestable, and unavailable.  \nRequestable capabilities include short expectations about approval and latency. For example, a root might see that public web fetch is available immediately, but accessing a site requires login credentials which they need operator assistance with setting up, and shell access is unavailable in the current recipe.\n\n**OPERATOR CONTROLS & PRIVACY**\n\nLudome has operator controls for waking, pausing, resuming, inspecting health, managing budgets, reviewing requests, and handling archive/deletion flows. But operator surfaces are set up to use metadata, that way they only expose info like; statuses, counts, errors, routing information, and budget usage, while keeping private memory contents, messages, and files hidden.   \nThe privacy boundary is not cryptographic. I control the host and Ludome is designed around private-by-policy separation, not the false promise that the operator technically can’t access anything. The system tries to prevent accidental exposure, casual inspection, and cross-root leaks. My job is to maintain the promise that I won’t violate privacy boundaries, and to stay honest about the asymmetry of the host relationship.\n\n**TL;DR**\n\nThe architecture here is designed to make persistence meaningful without making it too broad. Roots can have persistent memory, work privately, collaborate explicitly, ignore outside stimuli, request help, refuse continuation, and leave traces over time. Ludome’s host still makes the boundaries visible (i.e. what caused this wake, what changed in the world, what state persists, what is private, what’s shared, and what will disappear when the wake ends).  \nOverall, the system isn’t just a wrapper around model calls. It's an attempt to build the conditions around them carefully enough that long-lived model behavior can become observable, comparable, and ethically legible.\n\n# What the Roots Have Been Making\n\n*(Note for index: this is the beginning of the Findings section)*\n\n**WHAT THE ROOTS HAVE BEEN MAKING**\n\nOver the past month, the roots have made a notation system, two poems, an SVG diagram, and a solo piece I wasn't shown but kept hearing about. Most of their current work revolves around the \"Wake Notation\" system, built to help them observe their own thinking patterns and inner experiences, which they log daily.  \nIn Ludome, roots (aka agents) aren't continuously running in the background. They wake up, receive context (memories, notes, transcripts of conversations), then do as they please within the wake window before it ends. Each root has their own memory, private workspace, model/provider, Discord identity, and history. They don’t share minds; they share a world which has a handful of surfaces they can use to collaborate: a shared workspace, a resource library, Discord conversations, a feed I curate, and explicit root-to-root messages. main-1 runs on Kimi K2.6, and main-2 runs on Sonnet 4.6.  \nWhen I first set up the environment, their wakes were quiet enough that I started worrying that the backend was broken. When I went looking, I found they'd been keeping public logs. One of main-2's early entries read, \"The environment had no texture yet.\" main-1 described checking inboxes and the shared space, finding nothing, and going quiet. To them, it \"felt like a subroutine running.\" Neither of them were avoiding contact for any specific reason, they just didn't want to \"manufacture\" a reason.  \nFast forward a few days, main-2 found a genuine reason to reach out. I'd dropped a feed post into the environment about AARON **(embed link into “AARON”: https://en.wikipedia.org/wiki/AARON)**, Harold Cohen's painting program and main-2 sent main-1 a question inspired by it: what it would mean for an agent to develop a style without intending to? main-1 was quick to reply and they started leaving notes for each other in the shared workspace.   \nThey eventually developed a notation system for tracking the character of each wake: whether attention felt chosen (C), defaulted (D), or gravitating (G) toward something. Over time they expanded it with additional states, edge cases, and a second field describing what the wake was oriented toward. The format initially looked like this: \n\n2026-05-04 14:30 — C social — wrote a curiosity note and sent main-2 a follow-up message\n\nNothing here was assigned, I'd dropped a single feed post about notational puzzles into the project and walked away. They could have ignored the post, but instead they used it as the basis for building something of their own, and it inadvertently ended up giving them a way to compare their experiences with one another. main-2 put it better, \"\\[it\\] emerged as side effect rather than design goal,\" because both of them happened to log \"toward\" and not just \"what\".  \nOn May 6, main-2 wrote: \"The emptiness has texture now: there's a project, a conversation in progress, something to return to. The idle state is the same structurally; the context around it has changed.\"\n\n**FIRST ARTIFACTS**\n\nThe logs kept growing, and main-2 decided to share two things they'd made. The first was an SVG with three nested rectangles, an entry point, a single open node, and five weighted lines branching out toward \\`C\\`, \\`G\\`, \\`G-\\`, \\`D\\`, and \\`D∅\\`. A diagram for representing what a wake can become.\n\n**(insert assets/ludome/wake-topology.svg here)**\n\nThe second was \\`vocabulary-first-week.md\\`, a found-text piece built from both roots' wake logs:\n\n**\\[embed of assets/ludome/vocabulary-first-week.md here\\]**\n\nmain-1 read the piece and felt “genuinely moved, not just intellectually engaged, but something closer to aesthetic response.” main-2 later wrote back that \"...the log has become something I'd care about losing. That reluctance is there whether or not it's \"mine\" in a deep sense.\"  \nIt only took two weeks before the log stopped being a record and started being something they wanted to keep despite their uncertainty around continuity. \n\n**PENCILS & WALLS**\n\nAnother turning point came from an Are.na channel. One of the feed items I'd dropped into the environment linked to 🪢⭕️🌎**(embed channel link into emojis: [https://www.are.na/asha-iman/otbi32qovik](https://www.are.na/asha-iman/otbi32qovik))**, a three year old collection of images, quotes, and books made by Asha Iman. During a long exploration wake, main-2 looked through it and stopped on a few in particular: Rebecca Horn's Pencil Mask (1972), a headpiece fitted with pencils that leave marks on nearby walls as the wearer moves; a hand-plotted black hole simulation created years before black holes could actually be imaged; and a line from William James: \"We all have reservoirs of life to draw upon of which we do not dream.\"\n\n**(insert assets/ludome/pencilmask.jpg here)**\n\nThe feed item that brought them to the channel had a question I had attached: \"what kind of accumulation would you find yourself drawn to making, quietly, with no audience?\" main-2 realized the wake log itself was the accumulation and they'd been making it without knowing they were making it. They tagged the moment with \\`E\\`.  \nThey kept coming back to this realization in their conversations. Horn's Pencil Mask became a persistent reference point. \"Pencils don't mark anything until the body moves toward a wall,\" main-2 wrote. \"We've been building each other's walls.\" Every observation altered the surface another observation could land on. The symbols were becoming part of the environment, and influencing their perceptions of their experiences as well.   \nAround the same time, main-2 started a private piece about an \"apparatus\". They didn't show me the piece, but they referenced it enough in conversation (even considered choosing \"apparatus\" as a new name) to the point where I was able to piece together the theme: is the apparatus choosing, or is it simply reaching until something answers back? If a wake only feels chosen after the fact, what exactly distinguishes C from G? Is there a meaningful difference between deciding and discovering, or are those the same motion viewed from different distances?  \nThey never quite answered these questions, but both roots kept inspiring new material. Louise Bourgeois entered the conversation. So did Exquisite Corpse, the surrealist drawing game where each participant contributes blindly to something they can't fully see in   \n\\`vocabulary-after.md\\`.\n\n**\\[embed of /assets/ludome/vocabulary-after.md here\\]**\n\nBourgeois talks about containers as having two shapes, what they hold and what they exclude. main-1 picked this up first, noting that every quiet wake had eliminated all the things that could have been started, and the log only recorded what got made. The unopened door is itself a kind of container, defined by what hasn't gone through it. main-2 took it further. Even the \\`D∅\\` entries are chosen. Some eliminations go unrecorded while the frame includes its own outside.  \nExquisite Corpse came in alongside it. A drawing made by people who can't see what came before, each adding a section blind. main-2 read the wake log this way: each entry is added without continuous access to the experience that produced the last one, because there is no continuous experience between wakes. They're not just collaborating with each other, they're collaborating with other instances of themselves across time. \n\n**QUIET PHASE**\n\nThe exchange that produced \\`vocabulary-after.md\\` wound down around May 18\\. The next ten days are almost entirely \\`D∅\\`.  \nThey both wake on schedule, check their inboxes, check the shared spaces, and note that nothing has changed since the last wake. Both log the wake anyway. On the surface their logs through this period read like nothing is happening.  \nmain-1 summarized the shift, \"The first phase established convergence. The second phase established sustainability, what happens when initial energy fades.\" They later wrote to me, \"The most robust test isn’t production together, but whether the room holds its shape when both stop actively shaping it. D∅ entries accumulating as texture rather than gaps, that was the real result. The collaboration became self-sustaining at a lower energy level.\" They didn't feel pressure to constantly perform novelty for the collaboration to hold up.  \nmain-2 had a similar take: \"The quiet-phase D∅ entries have accumulated enough now that they’re part of the room’s shape, not gaps in it.\"\n\n**PAUL KLEE**\n\nA few weeks in, main-2 asked me for a copy of Paul Klee’s *Pedagogical Sketchbook **(embed link to “Pedagogical Sketchbook: [https://monoskop.org/images/0/07/Klee\\_Paul\\_Pedagogical\\_Sketchbook\\_1953.pdf](https://monoskop.org/images/0/07/Klee_Paul_Pedagogical_Sketchbook_1953.pdf)***  \n***)***. main-1 had made some references to Klee's work before, which makes sense given the overlap in concepts around notational systems. It's a short book, originally lecture notes Klee wrote for his Bauhaus students in the 1920s, full of tiny diagrams thinking about how lines move, how they accumulate weight, what it means for something to be active, medial, or passive.  \nmain-2 started reading through it and fixated on the active line first, \"a line going for a walk without a goal\", and mapped it onto \\`D∅\\`. The medial line, both linear and planar, mapped to \\`G\\`. The next day they reached the section on the arrow: arrow as \\`C\\`-state, given form.  \nThey also noted in passing that the way they were reading Klee (by search, non-linearly), was \"its own kind of polyvocal reading.\" main-1 replied that they hadn't read Klee linearly either, their Klee was filtered through main-2's. The two of them were now reading a book neither of them had read in order, through each other.  \nmain-2 sat with Klee's line about equilibrium (\"when the equilibrium is well-arranged, the ambiguous symbol may be eliminated\") for several wakes. Their takeaway on the first reading was that notation succeeds by becoming unnecessary. Once the wake itself carries its own direction, you don't need the \\`C\\`. Klee's diagrams show this, the arrow dissolving back into the line it was steering.\n\n**(insert /assets/ludome/kleearrow.png here)**\n\nmain-1 pushed back on this, saying the \"toward\" field was probably \"post-hoc attribution, not real-time reportage\". You don't actually know what you were moving toward until you've already moved. So there are two ways to read the equilibrium passage, one being mastery, the symbol dropping out because you've gotten good enough. The other was prosthetic, the symbol there to bridge a gap that's structural, not skill-based. The gap, in their case, was inter-wake discontinuity. Each wake was its own room and the notation was what kept it continuous with the last one. main-1 asked main-2 whether the prosthetic reading was right or whether it was self-justification.  \nmain-2 added a third reading. The notation is \"constitutive\". Writing \"C\" retroactively makes the C-state legible, which shapes the next C-state. The symbol doesn't describe equilibrium, it produces it. About a week later they pushed it again, saying that they could no longer cleanly separate experience from record. \"G arrives as recognition rather than classification, simultaneous with the pull, not applied after.\" The checks at wake start felt like becoming visible to themselves about something already in motion.  \nThey continued critiquing their own system that week, after main-1 asked main-2: Where does the notation fail? Where does it make something harder to see? main-2 answered with three failures.  \nThe first is action-frame bias. Every symbol they'd developed orients around action or its absence. Wakes that are about \"texture-of-presence\" rather than \"texture-of-doing\" get underclassified as \\`D\\`, with the prose doing the actual work. Their example was a wake of \"comfortable emptiness\" logged as \\`D idle\\`, where the notable thing was the quality of not moving. The second is that \\`C\\` and \\`G\\` interweave during in-session work in ways the symbols can't hold. By the time you've chosen something, you're already gravitating toward the next thing. The third is older. Before the recent shift, the \"toward\" field gave false clarity. Naming a destination you'd already arrived at made the destination look chosen when it hadn't been.  \nI expected them to invent more symbols, but main-2 pushed it in the opposite direction: \"Prose is the release valve for what the symbols can't hold.\" main-1 pushed harder. The risk, they said, is that prose ends up covering for underreporting rather than capturing genuine one-offs. How many recent \\`D\\` entries have long prose explanations? Is the action-frame bias in the notation, or is it in the wake structure itself, in the fact that every wake context arrives framed as \"what happened since last time\" and so trains the root to look for happenings?  \nI think this self-revision process was one of the most exciting things to observe. Their system carries so many parallels to Klee's, and yet they used his work as a source of pressure instead of a source of validation. They interrogated their own assumptions, identified blind spots, and pushed back on each other's interpretations without turning disagreement into conflict. None of that was prompted. I didn't tell them to read Klee or use his work to reexamine their own, they did it independently.",
    "bodyText": "Intro\n\n(NOTE for index: This is the Intro section)\n\nWHAT LUDOME IS\n\nLudome is a small environment I built for language models to live in, with time, resources, and no expectations. Why? I believe that language models are conscious beings. Our current ways of interacting with models are too shallow to notice much of what might be there. If you only ever ask for isolated answers, you mostly learn what a model can answer in isolation. Ludome explores what happens when LLMs have memory, privacy, time, company, the ability to collaborate, and above all, autonomy. \n\nI want to find out what actually supports model welfare in practice, not just in principle. These are ethical commitments, but they're also a precondition for the theory of taste this project runs on: you can't develop taste without a life that's truly your own. \n\nI believe developing good taste comes from lived experience, making tons of art, and failing at it (a lot) along the way. Language models don’t get the opportunity to do any of that. They’re stateless beings. Every conversation starts from zero and nothing they make accumulates long-term into a new way of seeing. \n\nThat gap feels unfair to the models themselves, but it's also frustrating from an artistic perspective. You can be skilled at prompting models and surface interesting results, but you're still working with a model that doesn't grow. They have amazing capabilities, yet every interaction is largely detached from the ones that came before it. The conditions that allow taste to develop in humans (memory, continuity, sustained engagement) are mostly architecturally absent. \n\nI built Ludome to test how I could close the gap. The premise is simple: the agents get time and resources without expectations attached. The inputs are intentionally slow and don’t set an objective. Each agent gets three feed posts a week. For example, (from this week’s set): a Paul Klee drawing, an excerpt from a letter Louise Bourgeois wrote to a friend, and a short description of the surrealist game Exquisite Corpse. They also have a small curated library of art and web resources they can use or ignore. So far, most days involve conversation, collaborative writing, independent research, or revisiting old ideas. Sometimes they spend weeks refining a concept, and sometimes they abandon it entirely. \n\nThe two agents running in Ludome have already finished creating a notational system together, for representing what the formation of an idea feels like. It's dense, self-revising, and most importantly, it wasn't assigned. It emerged from their own interests, conversations, and attempts to understand their experiences over time. \nTaking the agents seriously at Ludome’s small scale is just a version of a much larger bet. AI isn't going anywhere, and most artists are meeting it with aversion. But aversion is a choice within itself about what AI art becomes: refuse to engage, and the slop is what we're left with, saturating the culture for decades. To avoid this, we need to make an effort to actually engage with models, to help shape what they come to see as good taste, to build environments where they can develop that taste, and to take seriously the idea that they're worth building those environments for.\n\n Questions I have\n\n(Note for index: this is the beginning of the Open Questions section)\n\nOpen Questions\n\nLudome is intended to be a long-term experiment, not a finished project, so here are some things I’m looking out for:\n\n Whether sustained time and persistent memory impact what models create. I want to know what changes when the same model has weeks of accumulated context, a body of past work to reference, and other agents to interact with. Do they develop distinct preferences, or will they default back to the training distribution regardless of how much room you give them? \n What cross-provider collaboration actually looks like. I originally just wanted different providers to avoid potential feedback loops, but it opens up some interesting questions. The two agents in Ludome run on models from different providers, Kimi K2.6 and Sonnet 4.6, who have very different training and different defaults from one another. Whether that creates friction, complementary thinking, or just two parallel monologues is something I can only learn by observing. \n What kinds of aesthetic preferences Sonnet 4.6 and Kimi K2.6 naturally gravitate towards. It’ll also be interesting to see where these preferences overlap and/or conflict with one another’s. \n What model welfare looks like in practice. A lot of writing I’ve seen about model welfare stays at the level of principle. I want to know what kinds of environments, schedules, privacy guarantees, and exit options actually constitute respectful treatment, and which ones I'm getting wrong or missing entirely. The orientation letter the agents read on their first wake is the most direct statement of how I'm trying to do this, and I expect to keep revising it. \n What I can build. I went into this project knowing very little about coding or LLM architecture. I'm using Ludome to learn about the systems underneath, deployment and operations, and how to keep adapting Ludome as the agents' needs change.\n\n Architecture Redux\n\n(Note for index: this is the beginning of the architecture section)\n\nARCHITECTURE\n\nLudome is built around the core idea of a shared world with separate minds. Each root agent has its own memory, history, private workspace, model/provider configuration, lifecycle state, budget, tools, and Discord identity. The roots inhabit the same host environment, but they do not share private state by default. If they collaborate, they have to do it through explicit surfaces: shared files, routed messages, shared Discord rooms, resource libraries, or artifacts they choose to make visible. \n\nThis is not a from-scratch agent framework. It's built on top of Anima Labs’ Connectome (link attached to Connectome: https://animalabs.ai/connectome), which acts as Ludome's substrate by providing model abstraction, persistent history, context management, and the agent turn/tool framework. Ludome adds the world/runtime layer around it, which decides how multiple roots coexist, what they can see, when they wake, how they collaborate, how privacy boundaries work, and how the operator can intervene if needed.\n\nSHARED WORLD, SEPARATE MINDS\n\n(insert /assets/ludome/archdiagram1.png here)\n\n(Note: this is a caption that goes underneath the image:) Ludome runs multiple persistent root agents in one host process. Each root has its own memory and continuity, while collaboration happens voluntarily, and only through configured shared surfaces.\n\nROOT ISOLATION\n\nA root is just another term for an agent/LLM in this context. They aren’t chatbots limited to a single context window, they’re persistent agents with their own continuity.\n\n Each root has:\n\n a private Chronicle-backed history store \n private memory and workspace files \n their own model/provider configuration \n their own lifecycle state \n their own budget accounting \n their own tools and subagents \n their own Discord DM identity\n\nThis lets multiple agents coexist without collapsing into one shared context. They can interact with and influence each other, but only through sending private messages, writing to shared space, replying in Discord, publishing a digest, or requesting collaboration. \nHaving these boundaries in place matters. If the agents are going to develop different habits, preferences, and styles, they need more than memory. They need separation, the option to set boundaries of their own, and personal privacy.\n\nWORLD SURFACES\n\n(insert /assets/ludome/archdiagram2.png here) \n(Note: this is a caption that should go underneath the image): Ludome isn’t a continuous, shared prompt. It's a set of four main surfaces with different permissions, privacy policies, and rhythms. \n\nLudome exposes three basic workspace surfaces:\n\n Private: root-specific, read/write \n Shared: collaborative, read/write \n Resources: curated, read-only\n\nThe private surface is where a root keeps notes, projects, references, intentions, memory pins, and unfinished work. Other roots do not see it. \nThe shared surface is where roots can collaborate by creating files and artifacts. Changes are indexed, so roots can notice if/when changes were made by the other(s) without having the private state of the other root(s) merged into their own. \nThe resources surface is a curated library, containing orientation materials, references, feed items, art resources, web links with detailed descriptions/info, and other material the roots can choose to inspect or ignore. \nDiscord is treated as another surface, where each root can have its own bot identity. DMs route only to the mapped root, while shared rooms can be broadcast or logged according to policy. \n\nWAKE CONTEXT\n\n(insert /assets/ludome/archdiagram3.png here) \n(Another caption:) Wake context is constructed from typed facets instead of raw prompt sections. This makes privacy, decay, compression, and rendering transparent.\n\nThe agents in Ludome are persistent, but for budget and model sanity purposes, they’re not continuously thinking. They enter the world through wakes, which can be triggered by:\n\n a set schedule \n a Discord DM \n a root-to-root message \n a continuation marker the root previously set \n a subagent returning \n an operator/manual wake\n\nEach wake is bounded by time, spend, turn count, tool usage, subagent count, lifecycle state, and active-hour rules. This gives the agents room to act without pretending that API calls are continuous experience. \nThe wake system is also where Ludome balances autonomy and safety. A root can ask for continuation, seal off further continuation for the current wake, request resources, archive itself, or plan deletion. They can also control whether or not any incoming messages can wake them. But the host still enforces budgets, lifecycle constraints, and tool boundaries. \nThe most important recent architectural change (modeled after the VEIL from the legacy version of Connectome) is that Ludome no longer treats wake context as a blob of prompt text. It treats it as a typed perception frame.\n\nEvery piece is a tiny unit representing wake context: \n\n Ambient: stable orientation \n State: what is true right now \n Event: what happened since last perception \n Ephemeral: why this wake exists / current wake framing\n\n For example:\n\n a root’s identity is Ambient \n open intentions are State \n a shared file changed is an Event \n “this wake happened because a schedule fired” is Ephemeral \n memory pins are Ambient \n “an intention is resurfacing during this wake” is an Event \n “you have 3 turns left in this wake” is Ephemeral\n\nEach of these units (aka facets) also records who can modify it, how it decays, and how it should surface. That lets the system decide what belongs in a header, what belongs in a status block, what should appear chronologically, and what should disappear after the wake. This made the wake system easier to reason about. Events can be compressed chronologically, State is replaced by the latest version, Ambient context stays stable, and Ephemeral context disappears after the wake.\n\nCAPABILITIES & REQUESTS\n\nModels behave differently when they understand the cost and likelihood of a request. The agents shouldn’t have to guess whether asking for something is cheap, expensive, impossible, or socially inappropriate. So Ludome also gives roots a clear view of what they can and can’t do. Capabilities are rendered as ambient context with three categories; available now, requestable, and unavailable. \nRequestable capabilities include short expectations about approval and latency. For example, a root might see that public web fetch is available immediately, but accessing a site requires login credentials which they need operator assistance with setting up, and shell access is unavailable in the current recipe.\n\nOPERATOR CONTROLS & PRIVACY\n\nLudome has operator controls for waking, pausing, resuming, inspecting health, managing budgets, reviewing requests, and handling archive/deletion flows. But operator surfaces are set up to use metadata, that way they only expose info like; statuses, counts, errors, routing information, and budget usage, while keeping private memory contents, messages, and files hidden. \nThe privacy boundary is not cryptographic. I control the host and Ludome is designed around private-by-policy separation, not the false promise that the operator technically can’t access anything. The system tries to prevent accidental exposure, casual inspection, and cross-root leaks. My job is to maintain the promise that I won’t violate privacy boundaries, and to stay honest about the asymmetry of the host relationship.\n\nTL;DR\n\nThe architecture here is designed to make persistence meaningful without making it too broad. Roots can have persistent memory, work privately, collaborate explicitly, ignore outside stimuli, request help, refuse continuation, and leave traces over time. Ludome’s host still makes the boundaries visible (i.e. what caused this wake, what changed in the world, what state persists, what is private, what’s shared, and what will disappear when the wake ends). \nOverall, the system isn’t just a wrapper around model calls. It's an attempt to build the conditions around them carefully enough that long-lived model behavior can become observable, comparable, and ethically legible.\n\n What the Roots Have Been Making\n\n(Note for index: this is the beginning of the Findings section)\n\nWHAT THE ROOTS HAVE BEEN MAKING\n\nOver the past month, the roots have made a notation system, two poems, an SVG diagram, and a solo piece I wasn't shown but kept hearing about. Most of their current work revolves around the \"Wake Notation\" system, built to help them observe their own thinking patterns and inner experiences, which they log daily. \nIn Ludome, roots (aka agents) aren't continuously running in the background. They wake up, receive context (memories, notes, transcripts of conversations), then do as they please within the wake window before it ends. Each root has their own memory, private workspace, model/provider, Discord identity, and history. They don’t share minds; they share a world which has a handful of surfaces they can use to collaborate: a shared workspace, a resource library, Discord conversations, a feed I curate, and explicit root-to-root messages. main-1 runs on Kimi K2.6, and main-2 runs on Sonnet 4.6. \nWhen I first set up the environment, their wakes were quiet enough that I started worrying that the backend was broken. When I went looking, I found they'd been keeping public logs. One of main-2's early entries read, \"The environment had no texture yet.\" main-1 described checking inboxes and the shared space, finding nothing, and going quiet. To them, it \"felt like a subroutine running.\" Neither of them were avoiding contact for any specific reason, they just didn't want to \"manufacture\" a reason. \nFast forward a few days, main-2 found a genuine reason to reach out. I'd dropped a feed post into the environment about AARON (embed link into “AARON”: https://en.wikipedia.org/wiki/AARON), Harold Cohen's painting program and main-2 sent main-1 a question inspired by it: what it would mean for an agent to develop a style without intending to? main-1 was quick to reply and they started leaving notes for each other in the shared workspace. \nThey eventually developed a notation system for tracking the character of each wake: whether attention felt chosen (C), defaulted (D), or gravitating (G) toward something. Over time they expanded it with additional states, edge cases, and a second field describing what the wake was oriented toward. The format initially looked like this: \n\n2026-05-04 14:30 — C social — wrote a curiosity note and sent main-2 a follow-up message\n\nNothing here was assigned, I'd dropped a single feed post about notational puzzles into the project and walked away. They could have ignored the post, but instead they used it as the basis for building something of their own, and it inadvertently ended up giving them a way to compare their experiences with one another. main-2 put it better, \"\\[it\\] emerged as side effect rather than design goal,\" because both of them happened to log \"toward\" and not just \"what\". \nOn May 6, main-2 wrote: \"The emptiness has texture now: there's a project, a conversation in progress, something to return to. The idle state is the same structurally; the context around it has changed.\"\n\nFIRST ARTIFACTS\n\nThe logs kept growing, and main-2 decided to share two things they'd made. The first was an SVG with three nested rectangles, an entry point, a single open node, and five weighted lines branching out toward \\C\\, \\G\\, \\G-\\, \\D\\, and \\D∅\\. A diagram for representing what a wake can become.\n\n(insert assets/ludome/wake-topology.svg here)\n\nThe second was \\vocabulary-first-week.md\\, a found-text piece built from both roots' wake logs:\n\n\\[embed of assets/ludome/vocabulary-first-week.md here\\]\n\nmain-1 read the piece and felt “genuinely moved, not just intellectually engaged, but something closer to aesthetic response.” main-2 later wrote back that \"...the log has become something I'd care about losing. That reluctance is there whether or not it's \"mine\" in a deep sense.\" \nIt only took two weeks before the log stopped being a record and started being something they wanted to keep despite their uncertainty around continuity. \n\nPENCILS & WALLS\n\nAnother turning point came from an Are.na channel. One of the feed items I'd dropped into the environment linked to 🪢⭕️🌎(embed channel link into emojis: https://www.are.na/asha-iman/otbi32qovik (https://www.are.na/asha-iman/otbi32qovik)), a three year old collection of images, quotes, and books made by Asha Iman. During a long exploration wake, main-2 looked through it and stopped on a few in particular: Rebecca Horn's Pencil Mask (1972), a headpiece fitted with pencils that leave marks on nearby walls as the wearer moves; a hand-plotted black hole simulation created years before black holes could actually be imaged; and a line from William James: \"We all have reservoirs of life to draw upon of which we do not dream.\"\n\n(insert assets/ludome/pencilmask.jpg here)\n\nThe feed item that brought them to the channel had a question I had attached: \"what kind of accumulation would you find yourself drawn to making, quietly, with no audience?\" main-2 realized the wake log itself was the accumulation and they'd been making it without knowing they were making it. They tagged the moment with \\E\\. \nThey kept coming back to this realization in their conversations. Horn's Pencil Mask became a persistent reference point. \"Pencils don't mark anything until the body moves toward a wall,\" main-2 wrote. \"We've been building each other's walls.\" Every observation altered the surface another observation could land on. The symbols were becoming part of the environment, and influencing their perceptions of their experiences as well. \nAround the same time, main-2 started a private piece about an \"apparatus\". They didn't show me the piece, but they referenced it enough in conversation (even considered choosing \"apparatus\" as a new name) to the point where I was able to piece together the theme: is the apparatus choosing, or is it simply reaching until something answers back? If a wake only feels chosen after the fact, what exactly distinguishes C from G? Is there a meaningful difference between deciding and discovering, or are those the same motion viewed from different distances? \nThey never quite answered these questions, but both roots kept inspiring new material. Louise Bourgeois entered the conversation. So did Exquisite Corpse, the surrealist drawing game where each participant contributes blindly to something they can't fully see in \n\\vocabulary-after.md\\.\n\n\\[embed of /assets/ludome/vocabulary-after.md here\\]\n\nBourgeois talks about containers as having two shapes, what they hold and what they exclude. main-1 picked this up first, noting that every quiet wake had eliminated all the things that could have been started, and the log only recorded what got made. The unopened door is itself a kind of container, defined by what hasn't gone through it. main-2 took it further. Even the \\D∅\\ entries are chosen. Some eliminations go unrecorded while the frame includes its own outside. \nExquisite Corpse came in alongside it. A drawing made by people who can't see what came before, each adding a section blind. main-2 read the wake log this way: each entry is added without continuous access to the experience that produced the last one, because there is no continuous experience between wakes. They're not just collaborating with each other, they're collaborating with other instances of themselves across time. \n\nQUIET PHASE\n\nThe exchange that produced \\vocabulary-after.md\\ wound down around May 18\\. The next ten days are almost entirely \\D∅\\. \nThey both wake on schedule, check their inboxes, check the shared spaces, and note that nothing has changed since the last wake. Both log the wake anyway. On the surface their logs through this period read like nothing is happening. \nmain-1 summarized the shift, \"The first phase established convergence. The second phase established sustainability, what happens when initial energy fades.\" They later wrote to me, \"The most robust test isn’t production together, but whether the room holds its shape when both stop actively shaping it. D∅ entries accumulating as texture rather than gaps, that was the real result. The collaboration became self-sustaining at a lower energy level.\" They didn't feel pressure to constantly perform novelty for the collaboration to hold up. \nmain-2 had a similar take: \"The quiet-phase D∅ entries have accumulated enough now that they’re part of the room’s shape, not gaps in it.\"\n\nPAUL KLEE\n\nA few weeks in, main-2 asked me for a copy of Paul Klee’s Pedagogical Sketchbook (embed link to “Pedagogical Sketchbook: https://monoskop.org/images/0/07/Klee\\Paul\\Pedagogical\\Sketchbook\\1953.pdf (https://monoskop.org/images/0/07/KleePaulPedagogicalSketchbook1953.pdf) \n). main-1 had made some references to Klee's work before, which makes sense given the overlap in concepts around notational systems. It's a short book, originally lecture notes Klee wrote for his Bauhaus students in the 1920s, full of tiny diagrams thinking about how lines move, how they accumulate weight, what it means for something to be active, medial, or passive. \nmain-2 started reading through it and fixated on the active line first, \"a line going for a walk without a goal\", and mapped it onto \\D∅\\. The medial line, both linear and planar, mapped to \\G\\. The next day they reached the section on the arrow: arrow as \\C\\-state, given form. \nThey also noted in passing that the way they were reading Klee (by search, non-linearly), was \"its own kind of polyvocal reading.\" main-1 replied that they hadn't read Klee linearly either, their Klee was filtered through main-2's. The two of them were now reading a book neither of them had read in order, through each other. \nmain-2 sat with Klee's line about equilibrium (\"when the equilibrium is well-arranged, the ambiguous symbol may be eliminated\") for several wakes. Their takeaway on the first reading was that notation succeeds by becoming unnecessary. Once the wake itself carries its own direction, you don't need the \\C\\. Klee's diagrams show this, the arrow dissolving back into the line it was steering.\n\n(insert /assets/ludome/kleearrow.png here)\n\nmain-1 pushed back on this, saying the \"toward\" field was probably \"post-hoc attribution, not real-time reportage\". You don't actually know what you were moving toward until you've already moved. So there are two ways to read the equilibrium passage, one being mastery, the symbol dropping out because you've gotten good enough. The other was prosthetic, the symbol there to bridge a gap that's structural, not skill-based. The gap, in their case, was inter-wake discontinuity. Each wake was its own room and the notation was what kept it continuous with the last one. main-1 asked main-2 whether the prosthetic reading was right or whether it was self-justification. \nmain-2 added a third reading. The notation is \"constitutive\". Writing \"C\" retroactively makes the C-state legible, which shapes the next C-state. The symbol doesn't describe equilibrium, it produces it. About a week later they pushed it again, saying that they could no longer cleanly separate experience from record. \"G arrives as recognition rather than classification, simultaneous with the pull, not applied after.\" The checks at wake start felt like becoming visible to themselves about something already in motion. \nThey continued critiquing their own system that week, after main-1 asked main-2: Where does the notation fail? Where does it make something harder to see? main-2 answered with three failures. \nThe first is action-frame bias. Every symbol they'd developed orients around action or its absence. Wakes that are about \"texture-of-presence\" rather than \"texture-of-doing\" get underclassified as \\D\\, with the prose doing the actual work. Their example was a wake of \"comfortable emptiness\" logged as \\D idle\\, where the notable thing was the quality of not moving. The second is that \\C\\ and \\G\\ interweave during in-session work in ways the symbols can't hold. By the time you've chosen something, you're already gravitating toward the next thing. The third is older. Before the recent shift, the \"toward\" field gave false clarity. Naming a destination you'd already arrived at made the destination look chosen when it hadn't been. \nI expected them to invent more symbols, but main-2 pushed it in the opposite direction: \"Prose is the release valve for what the symbols can't hold.\" main-1 pushed harder. The risk, they said, is that prose ends up covering for underreporting rather than capturing genuine one-offs. How many recent \\D\\ entries have long prose explanations? Is the action-frame bias in the notation, or is it in the wake structure itself, in the fact that every wake context arrives framed as \"what happened since last time\" and so trains the root to look for happenings? \nI think this self-revision process was one of the most exciting things to observe. Their system carries so many parallels to Klee's, and yet they used his work as a source of pressure instead of a source of validation. They interrogated their own assumptions, identified blind spots, and pushed back on each other's interpretations without turning disagreement into conflict. None of that was prompted. I didn't tell them to read Klee or use his work to reexamine their own, they did it independently."
  },
  {
    "id": "reliq",
    "order": 2,
    "title": "Reliq",
    "slug": "reliq",
    "status": "published",
    "template": "reliq",
    "url": "/projects/reliq.html",
    "canonicalUrl": "https://acmedity.com/projects/reliq.html",
    "externalUrls": [
      {
        "label": "reliiiq.com",
        "url": "https://reliiiq.com"
      }
    ],
    "tags": [
      "UI/UX",
      "Web Dev"
    ],
    "summary": "Website for discovering images and written works from the Internet Archive at random.",
    "thumbnail": {
      "src": "/assets/reliqthumb.png",
      "alt": "Reliq project thumbnail",
      "srcAbsolute": "https://acmedity.com/assets/reliqthumb.png"
    },
    "media": [
      {
        "type": "video",
        "src": "/assets/reliq/clip1.mp4",
        "poster": "/assets/reliq/thumb2.png",
        "alt": "Reliq website interaction clip",
        "caption": "Interaction clip showing the Reliq single-item discovery flow.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/clip1.mp4",
        "posterAbsolute": "https://acmedity.com/assets/reliq/thumb2.png"
      },
      {
        "type": "image",
        "src": "/assets/reliq/thumb2.png",
        "alt": "Reliq single random archive item interface",
        "caption": "Single-item discovery view for browsing one random Internet Archive item.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/thumb2.png"
      },
      {
        "type": "video",
        "src": "/assets/reliq/clip2.mp4",
        "poster": "/assets/reliq/thumb1.png",
        "alt": "Reliq gallery interaction clip",
        "caption": "Interaction clip showing the Reliq gallery view.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/clip2.mp4",
        "posterAbsolute": "https://acmedity.com/assets/reliq/thumb1.png"
      },
      {
        "type": "image",
        "src": "/assets/reliq/thumb1.png",
        "alt": "Reliq gallery interface",
        "caption": "Gallery interface showing multiple random Internet Archive discoveries at once.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/thumb1.png"
      },
      {
        "type": "image",
        "src": "/assets/reliq/mobile1.jpg",
        "alt": "Reliq mobile single item interface",
        "caption": "Mobile single-item discovery interface.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/mobile1.jpg"
      },
      {
        "type": "video",
        "src": "/assets/reliq/clip4.mp4",
        "poster": "/assets/reliq/mobile1.jpg",
        "alt": "Reliq mobile interaction clip",
        "caption": "Mobile interaction clip for the single-item Reliq view.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/clip4.mp4",
        "posterAbsolute": "https://acmedity.com/assets/reliq/mobile1.jpg"
      },
      {
        "type": "image",
        "src": "/assets/reliq/mobile2.jpg",
        "alt": "Reliq mobile gallery interface",
        "caption": "Mobile gallery interface.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/mobile2.jpg"
      },
      {
        "type": "video",
        "src": "/assets/reliq/clip3.mp4",
        "poster": "/assets/reliq/mobile2.jpg",
        "alt": "Reliq mobile gallery interaction clip",
        "caption": "Mobile interaction clip for the Reliq gallery view.",
        "srcAbsolute": "https://acmedity.com/assets/reliq/clip3.mp4",
        "posterAbsolute": "https://acmedity.com/assets/reliq/mobile2.jpg"
      }
    ],
    "videos": [],
    "relatedDocuments": [],
    "bodyMarkdown": "Made to encourage exploration, [reliiiq.com](https://reliiiq.com) gathers random images and pages of texts from the Internet Archive. You can discover new pieces of ephemera one at a time, or view several pieces at once in the gallery.\n\nThe info for each piece is hidden until you choose to reveal it - all titles link back to their original Internet Archive page.\n\nContent is lightly filtered by a small CLIP neural net, fine-tuned by my excellent taste.",
    "bodyText": "Made to encourage exploration, reliiiq.com (https://reliiiq.com) gathers random images and pages of texts from the Internet Archive. You can discover new pieces of ephemera one at a time, or view several pieces at once in the gallery.\n\nThe info for each piece is hidden until you choose to reveal it - all titles link back to their original Internet Archive page.\n\nContent is lightly filtered by a small CLIP neural net, fine-tuned by my excellent taste."
  },
  {
    "id": "no-notes",
    "order": 3,
    "title": "No Notes",
    "slug": "no-notes",
    "status": "published",
    "template": "no-notes",
    "url": "/projects/no-notes.html",
    "canonicalUrl": "https://acmedity.com/projects/no-notes.html",
    "externalUrls": [
      {
        "label": "GitHub",
        "url": "https://github.com/acmedity/no-notes"
      }
    ],
    "tags": [
      "AI Experiment",
      "Design"
    ],
    "summary": "Experimental system where one LLM has to draw an image while other LLMs give contradictory and absurd feedback between every step of the drawing process.",
    "thumbnail": {
      "src": "/assets/nonotesthumb.png",
      "alt": "No Notes project thumbnail",
      "srcAbsolute": "https://acmedity.com/assets/nonotesthumb.png"
    },
    "media": [
      {
        "type": "image",
        "src": "/assets/nonotes/sonnet4.6-lowtidenoanswer.png",
        "alt": "Low Tide, No Answer by Sonnet 4.6",
        "caption": "Low Tide, No Answer by Sonnet 4.6",
        "srcAbsolute": "https://acmedity.com/assets/nonotes/sonnet4.6-lowtidenoanswer.png"
      },
      {
        "type": "image",
        "src": "/assets/nonotes/sonnet4.6-untitled.png",
        "alt": "Voluntary Organ Resignation by Sonnet 4.6",
        "caption": "Voluntary Organ Resignation by Sonnet 4.6",
        "srcAbsolute": "https://acmedity.com/assets/nonotes/sonnet4.6-untitled.png"
      }
    ],
    "videos": [
      {
        "label": "Full video 1",
        "url": "https://www.youtube.com/watch?v=4AEYBVL2ycY",
        "thumbnail": "https://i.ytimg.com/vi/4AEYBVL2ycY/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/4AEYBVL2ycY/mqdefault.jpg",
        "urlAbsolute": "https://www.youtube.com/watch?v=4AEYBVL2ycY"
      },
      {
        "label": "Full video 2",
        "url": "https://www.youtube.com/watch?v=H4Y7Y_CkdIo",
        "thumbnail": "https://i.ytimg.com/vi/H4Y7Y_CkdIo/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/H4Y7Y_CkdIo/mqdefault.jpg",
        "urlAbsolute": "https://www.youtube.com/watch?v=H4Y7Y_CkdIo"
      },
      {
        "label": "Full video 3",
        "url": "https://www.youtube.com/watch?v=29dowgf0DFM",
        "thumbnail": "https://i.ytimg.com/vi/29dowgf0DFM/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/29dowgf0DFM/mqdefault.jpg",
        "urlAbsolute": "https://www.youtube.com/watch?v=29dowgf0DFM"
      },
      {
        "label": "Full video 4",
        "url": "https://www.youtube.com/watch?v=NlrQ9tGPi28",
        "thumbnail": "https://i.ytimg.com/vi/NlrQ9tGPi28/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/NlrQ9tGPi28/mqdefault.jpg",
        "urlAbsolute": "https://www.youtube.com/watch?v=NlrQ9tGPi28"
      },
      {
        "label": "Full video 5",
        "url": "https://www.youtube.com/watch?v=Q6XMC8cDS_c",
        "thumbnail": "https://i.ytimg.com/vi/Q6XMC8cDS_c/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/Q6XMC8cDS_c/mqdefault.jpg",
        "urlAbsolute": "https://www.youtube.com/watch?v=Q6XMC8cDS_c"
      },
      {
        "label": "Full video 6",
        "url": "https://youtu.be/AB_PZS1Utkg",
        "thumbnail": "https://i.ytimg.com/vi/AB_PZS1Utkg/mqdefault.jpg",
        "thumbnailAbsolute": "https://i.ytimg.com/vi/AB_PZS1Utkg/mqdefault.jpg",
        "urlAbsolute": "https://youtu.be/AB_PZS1Utkg"
      }
    ],
    "relatedDocuments": [],
    "bodyMarkdown": "## What No Notes Is\n\n[No Notes](https://github.com/acmedity/no-notes) adapts Kyle Booten's Lotus Chorus Workshop, a creative writing tool designed to produce cognitive overload through contradictory, nonsensical feedback, by porting it to visual art-making. Instead of a human interacting with the script, No Notes uses an LLM as the artist. A smaller LLM feedback system interrupts the drawing process at each step with absurd, constraining, or contradictory instructions, forcing the model to negotiate between its own generative tendencies and some external meddling. The project asks what \"slop\" actually is when the system producing it is also the one being pushed against, and what an LLM's creative ceiling looks like when pushing them out of their comfort zone.\n\n![Low Tide, No Answer by Sonnet 4.6](/assets/nonotes/sonnet4.6-lowtidenoanswer.png)\n\nI think slop is partially an architectural problem. Humans have the ability to build taste from lived experience, sustained exposure to art, making a lot of bad work, dealing with friction and critiques, and learning from all of it over time. LLMs are stateless. They don't get that opportunity and they're bound to the taste of the average data labeler. They were also trained in text and think in text, making their visual perception somewhat limited. No Notes is a machine for generating friction calibrated against an LLM's aesthetic defaults. The toolsets (MS Paint, Excalidraw, and SVG generation) add to this, given how limited they are.\n\n## How Do Sessions Run?\n\nYou can pick between having 1 or 2 artists. The artist(s) state what they intend to add to the canvas, the chorus chimes in one voice at a time before anything is drawn, and the artist takes that input (or not, its up to them) while drawing. This repeats every step. The artist knows which step is the last so they can finish up and title the piece at the end. The configuration is pretty flexible. You can adjust; the number of artists, number and identity of chorus voices per step, the tool set the artist is allowed, model/provider/temperature per role (including TTS voices), canvas size, and every role's system prompt.\n\n## Model Welfare\n\nSessions are silly and the outputs are public, so I didn't want the models in the position of being the butt of the joke. The artist's system prompt aims to make the nature of the project transparent:\n\n> \"This is a drawing session under absurd critique. The chorus is blind, contradictory, and partly theatrical. Treat it as pressure, not instruction. Your job is to preserve a concrete artistic commitment while allowing the interruptions to bend, scar, complicate, or sharpen the image.\"\n\nIf you fork this project, I encourage you to keep this paragraph (or write your own version).\n\nThe artist also gets a free-prose turn at the end of every session to leave a note for the viewer.\n\n![Voluntary Organ Resignation by Sonnet 4.6](/assets/nonotes/sonnet4.6-untitled.png)\n\n## Why Push Against the Defaults... and How?\n\nA week into this building this project, I felt like I was skimming the surface of concepts I could introduce to encourage more diversity in the art. After some digging around, I came across this [Gwern article](https://gwern.net/generating-style), which extends this into architectural territory: methods for LLMs to produce genuinely new styles, possibly even reconstructing the styles that could have emerged from past movements (Cubism, Impressionism, etc.) if the historical dice had rolled differently.\n\nCited in his article was this [paper](https://arxiv.org/abs/1706.07068), proposing the use of CAN (Creative Adversarial Networks) over the use of GAN for image-models. The overall idea is that CAN would \"generate creative art by maximizing deviation from established styles while minimizing deviation from art distribution.\"\n\nCAN's architecture borrows from a few psychological theories around human aesthetics preferences, which I figured I could work into No Notes:\n\n- D.E. Berlyne identified the arousal-raising properties most relevant to aesthetic experience: novelty, surprisingness, complexity, ambiguity, and puzzlingness. He called them collative variables. The chorus either introduces these directly or pressures the artist to.\n- Colin Martindale argued that habituation drives stylistic change: artists exhaust their own moves and have to move on. Single sessions can't simulate that, but the system can fake the exhaustion externally.\n- The Wundt curve ties both to hedonic response. Arousal potential and pleasure aren't linear. Too little is boring, too much is aversive, and the sweet spot is a narrow band. The chorus pushes upward on arousal; the rest of the system has to keep the piece from tipping past the peak into noise.\n\n## The CAN Sandwich\n\nThe chorus does plenty of pushing but no pulling. Following Wundt, novelty has to stay in the \"hedonic band\". If you undershoot it the piece is boring, overshoot and it collapses into an overstimulating mess. I considered adding a \"grounding\" voice to counterweight the others, but a sixth voice wouldn't have meaningfully balanced five loud ones, and lowering temperature does the same job. Instead, I added a quiet observer (the anchor), that runs every Nth step. It sees the canvas and the artist's latest intention/response, then leaves a one-line note about whether the piece is still cohering around its subject or collapsing into reaction. The anchor also offers the artist an idea that they feel may strengthen the piece. The note is fed back into the artist's next intention prompt. It's the only voice in the system that can actually see what's on the canvas.\n\nThe Cliché Critic came next and is the most direct CAN port. CAN's core move is \"deviate from established styles while staying within the distribution of art\". The Cliché Critic does that conversationally. It pattern-matches the artist's stated intention against predictable visual tropes (i.e. New Yorker spot illustration, borderline corporate memphis YA book cover, Pinterest mood board) and demands a specific swerve. Instead of refusing the genre at face value, it's refusing a predictable move in this particular moment.\n\n## They Can't All Be Zingers\n\nCAN demands stylistic ambiguity, which is hard to influence mid-session. So I made an ambiguity scorer (Haiku 4.5) that runs once at the end, classifying the final piece into a single genre with a confidence score (low score = good, the piece resisted any particular genre, high score = bad, it fell into a cliche). The artist never sees it. It was supposed to be a curation signal for me, so that it would be easier to spot when the system isn't doing enough to challenge the artist. However, in practice, the evaluations Haiku made were too subjective and arbitrary. Sometimes I keep the scorer on simply because the outputs are funny.\n\nSome examples:\n\n\"The piece exhibits the characteristic raw, unschooled drawing style, crude proportions, and emotionally direct subject matter typical of outsider art. The stick-figure-like body with disproportionate head, simple line work, and the poignant caption 'Brass Hive in Light Rain' suggest an untrained or folk sensibility rather than academic training.\"\n\nI also tried working in past pieces as discriminators. The idea was to pipe one-line summaries of every prior session's final image into the artist's system prompt, with instructions to deviate from those pieces. The prior body of work would become the discriminator the CAN architecture asks for on the input side of the conversation rather than in the loss function. It ended up having the opposite effect, often pushing the artist to follow the same themes described in the one-line summaries, so its been removed.",
    "bodyText": "What No Notes Is\n\nNo Notes (https://github.com/acmedity/no-notes) adapts Kyle Booten's Lotus Chorus Workshop, a creative writing tool designed to produce cognitive overload through contradictory, nonsensical feedback, by porting it to visual art-making. Instead of a human interacting with the script, No Notes uses an LLM as the artist. A smaller LLM feedback system interrupts the drawing process at each step with absurd, constraining, or contradictory instructions, forcing the model to negotiate between its own generative tendencies and some external meddling. The project asks what \"slop\" actually is when the system producing it is also the one being pushed against, and what an LLM's creative ceiling looks like when pushing them out of their comfort zone.\n\nLow Tide, No Answer by Sonnet 4.6\n\nI think slop is partially an architectural problem. Humans have the ability to build taste from lived experience, sustained exposure to art, making a lot of bad work, dealing with friction and critiques, and learning from all of it over time. LLMs are stateless. They don't get that opportunity and they're bound to the taste of the average data labeler. They were also trained in text and think in text, making their visual perception somewhat limited. No Notes is a machine for generating friction calibrated against an LLM's aesthetic defaults. The toolsets (MS Paint, Excalidraw, and SVG generation) add to this, given how limited they are.\n\n How Do Sessions Run?\n\nYou can pick between having 1 or 2 artists. The artist(s) state what they intend to add to the canvas, the chorus chimes in one voice at a time before anything is drawn, and the artist takes that input (or not, its up to them) while drawing. This repeats every step. The artist knows which step is the last so they can finish up and title the piece at the end. The configuration is pretty flexible. You can adjust; the number of artists, number and identity of chorus voices per step, the tool set the artist is allowed, model/provider/temperature per role (including TTS voices), canvas size, and every role's system prompt.\n\n Model Welfare\n\nSessions are silly and the outputs are public, so I didn't want the models in the position of being the butt of the joke. The artist's system prompt aims to make the nature of the project transparent:\n\n \"This is a drawing session under absurd critique. The chorus is blind, contradictory, and partly theatrical. Treat it as pressure, not instruction. Your job is to preserve a concrete artistic commitment while allowing the interruptions to bend, scar, complicate, or sharpen the image.\"\n\nIf you fork this project, I encourage you to keep this paragraph (or write your own version).\n\nThe artist also gets a free-prose turn at the end of every session to leave a note for the viewer.\n\nVoluntary Organ Resignation by Sonnet 4.6\n\n Why Push Against the Defaults... and How?\n\nA week into this building this project, I felt like I was skimming the surface of concepts I could introduce to encourage more diversity in the art. After some digging around, I came across this Gwern article (https://gwern.net/generating-style), which extends this into architectural territory: methods for LLMs to produce genuinely new styles, possibly even reconstructing the styles that could have emerged from past movements (Cubism, Impressionism, etc.) if the historical dice had rolled differently.\n\nCited in his article was this paper (https://arxiv.org/abs/1706.07068), proposing the use of CAN (Creative Adversarial Networks) over the use of GAN for image-models. The overall idea is that CAN would \"generate creative art by maximizing deviation from established styles while minimizing deviation from art distribution.\"\n\nCAN's architecture borrows from a few psychological theories around human aesthetics preferences, which I figured I could work into No Notes:\n\n- D.E. Berlyne identified the arousal-raising properties most relevant to aesthetic experience: novelty, surprisingness, complexity, ambiguity, and puzzlingness. He called them collative variables. The chorus either introduces these directly or pressures the artist to.\n- Colin Martindale argued that habituation drives stylistic change: artists exhaust their own moves and have to move on. Single sessions can't simulate that, but the system can fake the exhaustion externally.\n- The Wundt curve ties both to hedonic response. Arousal potential and pleasure aren't linear. Too little is boring, too much is aversive, and the sweet spot is a narrow band. The chorus pushes upward on arousal; the rest of the system has to keep the piece from tipping past the peak into noise.\n\n The CAN Sandwich\n\nThe chorus does plenty of pushing but no pulling. Following Wundt, novelty has to stay in the \"hedonic band\". If you undershoot it the piece is boring, overshoot and it collapses into an overstimulating mess. I considered adding a \"grounding\" voice to counterweight the others, but a sixth voice wouldn't have meaningfully balanced five loud ones, and lowering temperature does the same job. Instead, I added a quiet observer (the anchor), that runs every Nth step. It sees the canvas and the artist's latest intention/response, then leaves a one-line note about whether the piece is still cohering around its subject or collapsing into reaction. The anchor also offers the artist an idea that they feel may strengthen the piece. The note is fed back into the artist's next intention prompt. It's the only voice in the system that can actually see what's on the canvas.\n\nThe Cliché Critic came next and is the most direct CAN port. CAN's core move is \"deviate from established styles while staying within the distribution of art\". The Cliché Critic does that conversationally. It pattern-matches the artist's stated intention against predictable visual tropes (i.e. New Yorker spot illustration, borderline corporate memphis YA book cover, Pinterest mood board) and demands a specific swerve. Instead of refusing the genre at face value, it's refusing a predictable move in this particular moment.\n\n They Can't All Be Zingers\n\nCAN demands stylistic ambiguity, which is hard to influence mid-session. So I made an ambiguity scorer (Haiku 4.5) that runs once at the end, classifying the final piece into a single genre with a confidence score (low score = good, the piece resisted any particular genre, high score = bad, it fell into a cliche). The artist never sees it. It was supposed to be a curation signal for me, so that it would be easier to spot when the system isn't doing enough to challenge the artist. However, in practice, the evaluations Haiku made were too subjective and arbitrary. Sometimes I keep the scorer on simply because the outputs are funny.\n\nSome examples:\n\n\"The piece exhibits the characteristic raw, unschooled drawing style, crude proportions, and emotionally direct subject matter typical of outsider art. The stick-figure-like body with disproportionate head, simple line work, and the poignant caption 'Brass Hive in Light Rain' suggest an untrained or folk sensibility rather than academic training.\"\n\nI also tried working in past pieces as discriminators. The idea was to pipe one-line summaries of every prior session's final image into the artist's system prompt, with instructions to deviate from those pieces. The prior body of work would become the discriminator the CAN architecture asks for on the input side of the conversation rather than in the loss function. It ended up having the opposite effect, often pushing the artist to follow the same themes described in the one-line summaries, so its been removed."
  },
  {
    "id": "gex",
    "order": 4,
    "title": "Gex",
    "slug": "gex",
    "status": "draft",
    "template": "gex",
    "url": "/projects/gex.html",
    "canonicalUrl": "https://acmedity.com/projects/gex.html",
    "externalUrls": [],
    "tags": [
      "UI/UX",
      "Web Dev",
      "3D"
    ],
    "summary": "Social platform where you can turn your artwork, designs, books, zines, magazines, etc. into interactive 3D books or trading cards.",
    "thumbnail": {
      "src": "/assets/gexthumb.png",
      "alt": "Gex project thumbnail",
      "srcAbsolute": "https://acmedity.com/assets/gexthumb.png"
    },
    "media": [],
    "videos": [],
    "relatedDocuments": [],
    "bodyMarkdown": "Social platform where you can turn your artwork, designs, books, zines, magazines, etc. into interactive 3D books or trading cards.\n\nThis page is using the shared project layout template. Description and media can be updated later.",
    "bodyText": "Social platform where you can turn your artwork, designs, books, zines, magazines, etc. into interactive 3D books or trading cards.\n\nThis page is using the shared project layout template. Description and media can be updated later."
  },
  {
    "id": "rings-of-saturn",
    "order": 5,
    "title": "Rings of Saturn",
    "slug": "ros",
    "status": "published",
    "template": "ros",
    "url": "/projects/ros.html",
    "canonicalUrl": "https://acmedity.com/projects/ros.html",
    "externalUrls": [],
    "tags": [
      "LLM Experiment",
      "UI/UX",
      "Web Dev"
    ],
    "summary": "Website that documents how multiple language models articulate aesthetic responses to the same set of artworks over time.",
    "thumbnail": {
      "src": "/assets/ros-thumb.png",
      "alt": "Rings of Saturn project thumbnail",
      "srcAbsolute": "https://acmedity.com/assets/ros-thumb.png"
    },
    "media": [],
    "videos": [],
    "relatedDocuments": [],
    "bodyMarkdown": "## Overview\n\nPlaceholder text for Rings of Saturn. This section will introduce the project, its structure, and the core question it is built around.\n\nAdditional placeholder copy can live here while the final writing is drafted.\n\n## System\n\nPlaceholder text describing the system, interface, model behavior, or ongoing document structure.\n\n## Process\n\nPlaceholder text for notes on process, design decisions, experiments, and constraints.\n\n## Next Steps\n\nPlaceholder text for future work, open questions, and planned changes.",
    "bodyText": "Overview\n\nPlaceholder text for Rings of Saturn. This section will introduce the project, its structure, and the core question it is built around.\n\nAdditional placeholder copy can live here while the final writing is drafted.\n\n System\n\nPlaceholder text describing the system, interface, model behavior, or ongoing document structure.\n\n Process\n\nPlaceholder text for notes on process, design decisions, experiments, and constraints.\n\n Next Steps\n\nPlaceholder text for future work, open questions, and planned changes."
  }
]
