Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

url-tradition: drop psycho label, deepen lineage from platter; papers index goes dense

- url-tradition: pull psycho flag, broaden abstract/timeline; add sections on
Memex/Lovelace/Xanadu/Green Book, URL-as-score, casual creators, performer
at the address, URL as territory; expand net.art with Lialina vernacular
and the glitchbrowser; new bib entries (Bush, Nelson 1965, Plant, Brock,
Green, Gallope/Harren/Hicks, Compton/Mateas, Auslander, Lewis et al,
Menkman); regenerate cards companion.
- papers index: drop the platter cloche SVG and the stale build-status
panel; replace with a 2px fixed top progress bar driven by oven SSE;
tighten paper card density (smaller titles, tighter padding, smaller
abstract/meta) so the long list reads as a list, not a stack of posters.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

+319 -342
+97
papers/arxiv-url-tradition/references.bib
··· 253 253 year = {2004}, 254 254 note = {Information must be free; the URL is the infrastructure of that freedom}, 255 255 } 256 + 257 + % === DEEP HISTORY: BUSH / NELSON / LOVELACE === 258 + 259 + @article{bush1945memex, 260 + author = {Bush, Vannevar}, 261 + title = {As We May Think}, 262 + journal = {The Atlantic Monthly}, 263 + volume = {176}, 264 + number = {1}, 265 + pages = {101--108}, 266 + year = {1945}, 267 + note = {The Memex; trails as portable address-by-association}, 268 + } 269 + 270 + @inproceedings{nelson1965literary, 271 + author = {Nelson, Theodor H.}, 272 + title = {A File Structure for the Complex, the Changing, and the Indeterminate}, 273 + booktitle = {Proceedings of the 20th National ACM Conference}, 274 + pages = {84--100}, 275 + year = {1965}, 276 + note = {The first Xanadu paper; transclusion as stable addressing across copies}, 277 + } 278 + 279 + @book{plant1997zerosones, 280 + author = {Plant, Sadie}, 281 + title = {Zeros + Ones: Digital Women and the New Technoculture}, 282 + publisher = {Doubleday}, 283 + year = {1997}, 284 + note = {Hypertext as immanent to Lovelace's footnotes; networks before networking}, 285 + } 286 + 287 + % === GREEN BOOK / DISTRIBUTED BLACKNESS === 288 + 289 + @book{brock2020distributedblackness, 290 + author = {Brock, Andr{\'e}}, 291 + title = {Distributed Blackness: African American Cybercultures}, 292 + publisher = {NYU Press}, 293 + year = {2020}, 294 + note = {The Negro Motorist Green Book as proto-network browser; address-as-survival}, 295 + } 296 + 297 + @misc{green1936greenbook, 298 + author = {Green, Victor H.}, 299 + title = {The Negro Motorist Green Book}, 300 + year = {1936--1966}, 301 + publisher = {Victor H. Green \& Co.}, 302 + note = {Annual directory of safe lodging, food, and services for Black travelers in Jim Crow America}, 303 + } 304 + 305 + % === SCORES / CASUAL CREATORS / BOTS === 306 + 307 + @misc{gallope2025scores, 308 + author = {Gallope, Michael and Harren, Natilee and Hicks, Patricia}, 309 + title = {The Scores Project}, 310 + year = {2025}, 311 + note = {Open-access digital edition of postwar graphic and event scores; URL-organized scholarly performance archive}, 312 + } 313 + 314 + @inproceedings{compton2015casual, 315 + author = {Compton, Kate and Mateas, Michael}, 316 + title = {Casual Creators}, 317 + booktitle = {Proceedings of the Sixth International Conference on Computational Creativity}, 318 + pages = {228--235}, 319 + year = {2015}, 320 + note = {URL-encoded artifacts as the casual creator's shareability retrofit}, 321 + } 322 + 323 + @article{auslander2002cyberspace, 324 + author = {Auslander, Philip}, 325 + title = {Live from Cyberspace, or, I Was Sitting at My Computer This Guy Appeared He Thought I Was a Bot}, 326 + journal = {PAJ: A Journal of Performance and Art}, 327 + volume = {24}, 328 + number = {1}, 329 + pages = {16--21}, 330 + year = {2002}, 331 + note = {Chatterbots as performers at addresses; piece-as-performer for AC}, 332 + } 333 + 334 + % === INDIGENOUS AI / TERRITORY === 335 + 336 + @article{lewis2018kin, 337 + author = {Lewis, Jason Edward and Arista, Noelani and Pechawis, Archer and Kite, Suzanne}, 338 + title = {Making Kin with the Machines}, 339 + journal = {Journal of Design and Science}, 340 + year = {2018}, 341 + note = {Cyberspace as territory; the URL as a unit of claim}, 342 + } 343 + 344 + % === MENKMAN / GLITCHBROWSER === 345 + 346 + @book{menkman2011glitch, 347 + author = {Menkman, Rosa}, 348 + title = {The Glitch Momentum/Memento}, 349 + publisher = {Institute of Network Cultures}, 350 + year = {2011}, 351 + note = {Documents the glitchbrowser and other URL-resident net.art}, 352 + }
+79 -5
papers/arxiv-url-tradition/url-tradition-cards.tex
··· 86 86 \vspace{0.15em} 87 87 \colorbox{yellow!60}{\small\color{red!80!black}\textbf{\textit{working draft --- not for citation}}}\par 88 88 \vspace{0.1em} 89 - {\footnotesize\color{acgray} March 2026 · \href{https://github.com/whistlegraph/aesthetic-computer/commit/25c27353d}{25c27353d}}\par 89 + {\footnotesize\color{acgray} March 2026 · \href{https://github.com/whistlegraph/aesthetic-computer/commit/2dd904af4}{2dd904af4}}\par 90 90 \end{center} 91 91 \vspace*{\fill} 92 92 ··· 129 129 130 130 Scratch~\citep{resnick2009scratch} solved the sharing problem within its own ecosystem: every project gets a numbered URL on \code{scratch.mit.edu}. But these URLs are opaque---\code{scratch.mit.edu/projects/12345678}---and require the Scratch runtime to view. The address exists but it is not \emph{cool}: it encodes nothing about the content, and it cannot be guessed or remembered. 131 131 132 + % ============ 2.5 BEFORE THE URL ============ 133 + \section{Before the Web: Trails, Footnotes, and the Green Book} 134 + 135 + The URL did not begin in 1989. It is the operationalized fragment of a much older desire---that words and works should remain reachable across time and across the social-political terrain that words and works have to cross. Before Berners-Lee codified the URL, three traditions had already imagined the address as infrastructure for cultural memory and survival. 136 + 137 + \subsection{Bush's Trails (1945)} 138 + 139 + Vannevar Bush's \emph{As We May Think}~\citep{bush1945memex} described the Memex: a desk-sized device storing documents on microfilm and capable of preserving \emph{trails}---author-curated paths between documents that another reader could later replay. Bush's insight was that the address-by-location (this shelf, this drawer) was insufficient for thinking; what scholarship needed was the address-by-association, a way to fix a relationship between documents and hand the relationship to someone else. The trail was a portable graph of citations. The Memex was never built, but every URL is a fragment of one of its trails. 140 + 141 + \subsection{Lovelace's Footnotes} 142 + 143 + Sadie Plant traces the lineage further back~\citep{plant1997zerosones}. Ada Lovelace's 1843 footnotes on the Analytical Engine were already ``a node within a network''---each note pointing to other texts, other diagrams, other speculations. Plant argues that hypertext was \emph{immanent} to the printed page from the start; the digital network only operationalized what footnotes had always been doing. ``All, and everything is naturally related and interconnected,'' Lovelace wrote in her own footnotes. ``A volume I could write on this subject.'' The web is the volume she did not have time to write. 144 + 145 + \subsection{Xanadu (1965)} 146 + 147 + Ted Nelson named the dream Xanadu in 1965~\citep{nelson1965literary, nelson1974computer}. In Nelson's design every quotation retained a stable address linking back to its source, no matter how often it was cited. Xanadu's transclusion model is more demanding than the URL: a Xanadu link survives copying, splicing, and recontextualization because the source remains addressable. The web settled for a weaker promise---a URL points but does not transclude---but the demand is unchanged. The URL is what we got. Xanadu is what we are still owed. 148 + 149 + \subsection{The Negro Motorist Green Book (1936--1966)} 150 + 151 + While Bush, Nelson, and (later) Berners-Lee theorized address infrastructure for documents, a different address infrastructure had been in operation for human bodies. From 1936 to 1966, Victor Hugo Green published \emph{The Negro Motorist Green Book}~\citep{green1936greenbook}---an annual directory of restaurants, gas stations, hotels, and barbershops that would safely serve Black travelers crossing Jim Crow America. 152 + 153 + Andr\'{e} Brock~\citep{brock2020distributedblackness} argues that the Green Book should be read as a \emph{cultural network browser}. The US highway system was the network. The Green Book was the directory. Black drivers were the browsers. Each entry was an address that promised survival---the inverse of a Sundown Town, the affirmative dual of the redlined map. The Green Book was, Brock writes, ``one of the first cultural network browsers,'' a search engine for those seeking culturally vital information at a time when the wrong wrong turn could be fatal. 154 + 155 + This is the URL tradition's deepest root. An address is not a neutral pointer: it is a \emph{promise}, made by someone who knows the territory, that the destination exists and that you will not be turned away. The brilliance of the Green Book and the brilliance of ``cool URIs don't change''~\citep{berners-lee1998cool} are the same brilliance: addresses must be reliable across the social-political terrain they navigate. A broken URL and a missing Green Book entry both betray the same trust. 156 + 157 + When Aesthetic Computer commits to memorizable, top-level paths, it inherits from this lineage. The URL is not just a way to find a piece. It is a public claim that the piece will be there when you arrive. 158 + 132 159 % ============ 3. THE URL ENTERS CREATIVE COMPUTING ============ 133 160 \section{The URL Enters Creative Computing} 134 161 ··· 143 170 Olia Lialina's \emph{My Boyfriend Came Back from the War} (1996) existed at a specific address: \code{teleportacia.org/war/}~\citep{lialina1996boyfriend}. The work was a series of nested frames that fragmented a post-war narrative into clickable shards. You could not separate the piece from its URL. Every copy, every mirror, every screenshot was a degradation. The URL was the original. Later, Lialina documented the personal home page as a form of folk art~\citep{lialina2005vernacular}---the ``under construction'' GIF, the guest book, the hit counter---all artifacts of people learning to occupy an address. 144 171 145 172 The Art Happens Here anthology documents this moment when the address became the medium~\citep{connor2019artanthology}. What net.art understood, and what creative computing environments repeatedly forget, is that the URL is not a pointer to the work. The URL is a \emph{material} of the work, the way canvas is a material of painting. An environment that generates opaque URLs---\code{/projects/abc123}---is like handing a painter a canvas with no surface texture. Technically functional. Aesthetically dead. 173 + 174 + The decay of net.art URLs is itself part of the form. The \emph{glitchbrowser} (2005--2008), built by Beflix, Organised, and Dmtr, was a URL-rewriting tool: you typed a destination and the glitchbrowser served you the destination with its embedded JPEGs and GIFs corrupted into ribbons of color~\citep{menkman2011glitch}. The browser took itself offline in 2008. The URL where the glitchbrowser once lived now returns nothing. The work survives only as documentation. Link rot is not a failure mode of net.art---it is one of its subjects. A piece that lives at an address knows it can lose the address, and many net.art works staged that loss in advance. 175 + 176 + Olia Lialina later argued that the personal home page was ``a vernacular of file formats''~\citep{lialina2005vernacular}: a folk vocabulary built from \code{<marquee>} tags, blinking text, MIDI loops, animated buddies, and the under-construction GIF. The under-construction GIF was not embarrassing---it was honest. It admitted that the address was alive, that someone was at work behind it. The opposite of an under-construction GIF is a 404: a frozen page that betrays no one is home. 146 177 147 178 \subsection{Single-Serving Sites (2000s)} 148 179 ··· 273 304 274 305 The app store reverses this polarity. An iOS app is private by default and public only through the grace of a corporation that takes 30\% of every transaction. The URL tradition says: put it on the web, give it an address, and let anyone who knows the address walk in. No toll booth. No gatekeeper. No cut. 275 306 307 + % ============ 5.5 THE URL AS SCORE ============ 308 + \section{The URL as Score} 309 + 310 + A score, in the post-1945 sense, is not a record of a performance but its \emph{invocation}: a set of instructions that summon the piece into being. The Scores Project~\citep{gallope2025scores}---an open-access digital edition of postwar graphic and event scores edited by Michael Gallope, Natilee Harren, and Patricia Hicks---makes the argument structurally as well as polemically. The edition is itself organized by URLs: each chapter, each score image, each archival object, each time-based realization has a stable address. The reader does not just read about the score. The reader \emph{follows the URL} into the performance. 311 + 312 + Aesthetic Computer pieces extend score logic to its limit. Typing \code{aesthetic.computer/whistlegraph} is not visiting a website---it is invoking a score. The URL contains the entire performance instruction. Anyone who visits the URL re-performs the piece. Many AC pieces are explicitly score-shaped: \code{whistlegraph} is a draw-while-singing score, \code{notepat} is a notation surface, \code{wand} is a movement score for the body, \code{song} is a tap score for the voice. The URL hands you the score; the browser performs it. 313 + 314 + This is what HyperCard could never do. HyperCard's stacks were rehearsal materials trapped on a single machine. AC's URLs are world-readable scores: you receive the entire instruction by reading a single word, and the instruction begins to execute the moment you press Enter. 315 + 316 + % ============ 5.6 CASUAL CREATORS ============ 317 + \section{Casual Creators and the URL-Encoded Artifact} 318 + 319 + Compton and Mateas~\citep{compton2015casual} define \emph{casual creators} as creative systems whose users are casual---no prior domain expertise, no goal beyond exploration of a possibility space. To make their artifacts shareable, casual creators have to retrofit URL encoding. Compton's \emph{Ice-Maker} (2015) embeds an entire snowflake design into a single URL that the user can post or send; the URL becomes the artifact's bearer. Twine games encode story state into URL fragments. Generative tools from \emph{Tracery} bots to color-palette generators serialize their output into shareable links. 320 + 321 + Aesthetic Computer makes this retrofit unnecessary. Every piece is already URL-resident. When a \code{kidlisp} user saves a sketch, the source is hashed and stored at \code{aesthetic.computer/\$<code>}. When a \code{prompt} user invokes a piece with parameters, the parameters are part of the URL. The casual creator's friction---``how do I share what I just made?''---is not solved with a Save and Share button. It is dissolved by a property of the medium. The URL-encoded artifact is not a feature added to AC. It is the only thing AC produces. 322 + 323 + Compton's casual creators want their users to feel \emph{capable} after a few seconds. The URL is what makes that capability portable. Without the URL, the artifact dies on the user's screen the moment they close the tab. 324 + 325 + % ============ 5.7 THE BOT AT THE ADDRESS ============ 326 + \section{The Performer at the Address} 327 + 328 + Auslander~\citep{auslander2002cyberspace} argues that the chatterbot is the latest entry in a long history of mediated performance. Each chatterbot lives at an address: a URL, an IRC channel, an email list. The bot's identity is inseparable from where it can be reached. ELIZA at MIT was a destination; Julia on IRC was a presence. Each bot was, in Auslander's terms, a \emph{performer} at a particular \emph{location}. 329 + 330 + Aesthetic Computer extends bot-thinking to all pieces. Every AC piece is a kind of performer. \code{notepat} does the same thing every time you visit, but the \emph{thing it does} is a performance: pixels arrive in a particular order, sounds occur on a particular schedule, the screen receives the same wipe. The piece is not a static document. It is a performer waiting at an address. Visiting the URL summons it on stage. 331 + 332 + Auslander notes the politically interesting case: the bot inserted into a chatroom without identifying itself as a bot. Visiting an AC URL never produces this ambiguity. The piece declares itself by \emph{being itself}. The URL is the dressing room and the stage at once. There is no green room, no rehearsal hall, no separate venue. The address is the entire theater. 333 + 334 + % ============ 5.8 TERRITORY ============ 335 + \section{The URL as Territory} 336 + 337 + Lewis, Arista, Pechawis, and Kite argue that Indigenous epistemology must contend with cyberspace as territory~\citep{lewis2018kin}---that the ``archipelago of websites, social media platforms, shared virtual environments, corporate data stores, multiplayer video games, smart devices, and intelligent machines'' is not a separate domain from terrestrial life but situated within and alongside it. The question they raise: how do we \emph{claim} this new territory, knit it into existing life, and make it our own? 338 + 339 + The URL is the smallest unit of claim. To register a domain is to take a piece of the network and put a name on it. To publish at \code{aesthetic.computer/@<handle>/<piece>} is to claim a sub-territory inside someone else's address. The handle prefix \code{@} is a flag planted on a parcel. The platform is responsible for keeping the parcel reachable. The piece-maker is responsible for what happens once you arrive. 340 + 341 + This is not metaphor. Domain-name policy, name registries, and identifier specifications are real political infrastructure~\citep{galloway2004protocol}. The URL tradition takes a position inside that infrastructure: the address belongs to whoever can claim it; the claim should be possible to make in a single word; and the platform should not be allowed to overwrite the claim. AC's contribution is to make this politics legible at the level of every piece. 342 + 276 343 % ============ 6. THE TRADITION ============ 277 344 \section{The Tradition} 278 345 279 346 The URL tradition in creative computing runs: 280 347 281 348 \begin{enumerate} 349 + \item \textbf{Lovelace's footnotes} (1843): the printed page as a node within a network. Hypertext is immanent. 350 + \item \textbf{The Negro Motorist Green Book} (1936--1966): an address book as a network browser. The address as promise of safe arrival. 351 + \item \textbf{Memex} (1945): Bush's trails. The address-by-association, portable between readers. 352 + \item \textbf{Xanadu} (1965--): Nelson's transclusion model. Every quotation retains its address. 282 353 \item \textbf{HyperCard} (1987): cards and stacks, no address, bound to disk. 283 354 \item \textbf{The Web} (1991): every document is a URL. The address \emph{is} the work. 284 355 \item \textbf{GeoCities} (1994): the personal URL. \code{\textasciitilde{}user/page.html} as creative identity. 285 356 \item \textbf{Net.art} (1995--): artists exploit the URL as material and medium. 286 357 \item \textbf{zombo.com} (1999): the single-serving site. Domain name = content = interface. 287 358 \item \textbf{Processing} (2001): creative coding, but no native URL. Export required. 359 + \item \textbf{Scratch} (2007): project URLs, but opaque and runtime-dependent. 288 360 \item \textbf{Single-serving sites} (2008): Kottke names the form. The URL \emph{is} the joke, the tool, the artwork. 289 - \item \textbf{Scratch} (2007): project URLs, but opaque and runtime-dependent. 361 + \item \textbf{Casual creators} (2015): URL-encoded artifacts as a retrofit for shareability. 290 362 \item \textbf{Neocities} (2013): GeoCities revival. The personal URL fights back. 291 363 \item \textbf{tilde.club} (2014): the tilde as radical simplicity. One page, one person, one address. 292 364 \item \textbf{Glitch} (2017): instant URLs, forkable, live from first keystroke. ··· 330 402 % ============ 10. CONCLUSION ============ 331 403 \section{Conclusion} 332 404 333 - The URL is the most important interface in computing. It is the only universal addressing scheme that works across every device, every platform, every medium. It is the infrastructure of encounter, the minimum unit of information freedom, the material of net.art, the punchline of single-serving sites, and the identity layer of the personal web. 405 + The URL is the most important interface in computing. It is the only universal addressing scheme that works across every device, every platform, every medium. It is the infrastructure of encounter, the minimum unit of information freedom, the material of net.art, the score that summons the piece, the dressing room of the bot, and the identity layer of the personal web. 406 + 407 + The tradition this paper traces did not start with Berners-Lee. It runs from Lovelace's footnotes through Bush's trails, Nelson's Xanadu, and the Negro Motorist Green Book---each a different answer to the same question: \emph{how do words and works remain reachable across time and across the social-political terrain that words and works have to cross?} The web operationalized one answer. Aesthetic Computer extends that answer to creative computing's full surface. 334 408 335 409 Every force in contemporary computing conspires to kill the URL. Apps hide it. Platforms suppress it. Shorteners mangle it. SPAs hollow it out. Mobile browsers tuck it away. The URL tradition is not a historical curiosity---it is an active resistance. 336 410 337 - Creative computing environments that embrace the URL---that make every artifact addressable, shareable, memorizable---participate in a tradition that runs from Berners-Lee's cool URIs through net.art's material URLs, single-serving sites' domain-name-as-content, the tilde's radical personhood, and Glitch's instant forkability. 411 + Creative computing environments that embrace the URL---that make every artifact addressable, shareable, memorizable---participate in this tradition. Those that don't---that hide work behind login walls, project IDs, app stores, or native containers---break the contract that the URL is supposed to honor. 338 412 339 - AC's design makes the URL not just present but \emph{primary}. The prompt is the address bar. The piece name is the URL. The URL is the identity, the distribution channel, the pedagogical entry point, the social object, the authorship claim, and the political stance. There is nothing else. 413 + AC's design makes the URL not just present but \emph{primary}. The prompt is the address bar. The piece name is the URL. The URL is the identity, the distribution channel, the pedagogical entry point, the score, the social object, the authorship claim, and the political stance. There is nothing else. 340 414 341 415 Every AC piece is a single-serving site. Every AC user has a tilde. Every AC path is a cool URI that, by design, will never change. The URL tradition does not end. It gets typed into a prompt and pressed Enter. 342 416
+79 -5
papers/arxiv-url-tradition/url-tradition.tex
··· 189 189 190 190 \begin{quote} 191 191 \small\noindent\textbf{Abstract.} 192 - Creative computing environments have historically been \emph{opaque}: the state of the machine is accessible only to the person sitting in front of it. HyperCard stacks lived on a single disk. Processing sketches compiled to local executables. Scratch projects required a portal to find. The URL changes this. When every creative artifact is a URL---typeable, shareable, memorizable---the artifact escapes the machine and enters culture as an address. This paper traces a ``URL tradition'' in creative computing: the line from HyperCard's card/stack metaphor through the web's addressable document model, Glitch's instant remix URLs, p5.js's Web Editor links, and Aesthetic Computer's core design decision that every piece is a top-level path. We argue that URL-addressability is not a feature but a \emph{medium property}---one that reshapes authorship, distribution, pedagogy, and social interaction around creative code. AC extends the tradition by making the URL the primary interface: there is no menu, no file picker, no project list. You type a word and you are in the piece. The prompt \emph{is} the address bar. 192 + Creative computing environments have historically been \emph{opaque}: the state of the machine is accessible only to the person sitting in front of it. HyperCard stacks lived on a single disk. Processing sketches compiled to local executables. Scratch projects required a portal to find. The URL changes this. When every creative artifact is a URL---typeable, shareable, memorizable---the artifact escapes the machine and enters culture as an address. This paper traces a ``URL tradition'' in creative computing whose roots run deeper than the World Wide Web: from Vannevar Bush's Memex trails and Ada Lovelace's networked footnotes through Ted Nelson's Xanadu and the Negro Motorist Green Book, into the web proper, JODI's URL-as-art, single-serving sites, the tilde, Glitch's instant remix URLs, p5.js's Web Editor, and Aesthetic Computer's design decision that every piece is a top-level path. We argue that URL-addressability is not a feature but a \emph{medium property}---one that reshapes authorship, distribution, pedagogy, performance, and political claim around creative code. AC extends the tradition by making the URL the primary interface: there is no menu, no file picker, no project list. You type a word and you are in the piece. The prompt \emph{is} the address bar. 193 193 \end{quote} 194 194 \vspace{0.5em} 195 195 }] ··· 226 226 227 227 Scratch~\citep{resnick2009scratch} solved the sharing problem within its own ecosystem: every project gets a numbered URL on \code{scratch.mit.edu}. But these URLs are opaque---\code{scratch.mit.edu/projects/12345678}---and require the Scratch runtime to view. The address exists but it is not \emph{cool}: it encodes nothing about the content, and it cannot be guessed or remembered. 228 228 229 + % ============ 2.5 BEFORE THE URL ============ 230 + \section{Before the Web: Trails, Footnotes, and the Green Book} 231 + 232 + The URL did not begin in 1989. It is the operationalized fragment of a much older desire---that words and works should remain reachable across time and across the social-political terrain that words and works have to cross. Before Berners-Lee codified the URL, three traditions had already imagined the address as infrastructure for cultural memory and survival. 233 + 234 + \subsection{Bush's Trails (1945)} 235 + 236 + Vannevar Bush's \emph{As We May Think}~\citep{bush1945memex} described the Memex: a desk-sized device storing documents on microfilm and capable of preserving \emph{trails}---author-curated paths between documents that another reader could later replay. Bush's insight was that the address-by-location (this shelf, this drawer) was insufficient for thinking; what scholarship needed was the address-by-association, a way to fix a relationship between documents and hand the relationship to someone else. The trail was a portable graph of citations. The Memex was never built, but every URL is a fragment of one of its trails. 237 + 238 + \subsection{Lovelace's Footnotes} 239 + 240 + Sadie Plant traces the lineage further back~\citep{plant1997zerosones}. Ada Lovelace's 1843 footnotes on the Analytical Engine were already ``a node within a network''---each note pointing to other texts, other diagrams, other speculations. Plant argues that hypertext was \emph{immanent} to the printed page from the start; the digital network only operationalized what footnotes had always been doing. ``All, and everything is naturally related and interconnected,'' Lovelace wrote in her own footnotes. ``A volume I could write on this subject.'' The web is the volume she did not have time to write. 241 + 242 + \subsection{Xanadu (1965)} 243 + 244 + Ted Nelson named the dream Xanadu in 1965~\citep{nelson1965literary, nelson1974computer}. In Nelson's design every quotation retained a stable address linking back to its source, no matter how often it was cited. Xanadu's transclusion model is more demanding than the URL: a Xanadu link survives copying, splicing, and recontextualization because the source remains addressable. The web settled for a weaker promise---a URL points but does not transclude---but the demand is unchanged. The URL is what we got. Xanadu is what we are still owed. 245 + 246 + \subsection{The Negro Motorist Green Book (1936--1966)} 247 + 248 + While Bush, Nelson, and (later) Berners-Lee theorized address infrastructure for documents, a different address infrastructure had been in operation for human bodies. From 1936 to 1966, Victor Hugo Green published \emph{The Negro Motorist Green Book}~\citep{green1936greenbook}---an annual directory of restaurants, gas stations, hotels, and barbershops that would safely serve Black travelers crossing Jim Crow America. 249 + 250 + Andr\'{e} Brock~\citep{brock2020distributedblackness} argues that the Green Book should be read as a \emph{cultural network browser}. The US highway system was the network. The Green Book was the directory. Black drivers were the browsers. Each entry was an address that promised survival---the inverse of a Sundown Town, the affirmative dual of the redlined map. The Green Book was, Brock writes, ``one of the first cultural network browsers,'' a search engine for those seeking culturally vital information at a time when the wrong wrong turn could be fatal. 251 + 252 + This is the URL tradition's deepest root. An address is not a neutral pointer: it is a \emph{promise}, made by someone who knows the territory, that the destination exists and that you will not be turned away. The brilliance of the Green Book and the brilliance of ``cool URIs don't change''~\citep{berners-lee1998cool} are the same brilliance: addresses must be reliable across the social-political terrain they navigate. A broken URL and a missing Green Book entry both betray the same trust. 253 + 254 + When Aesthetic Computer commits to memorizable, top-level paths, it inherits from this lineage. The URL is not just a way to find a piece. It is a public claim that the piece will be there when you arrive. 255 + 229 256 % ============ 3. THE URL ENTERS CREATIVE COMPUTING ============ 230 257 \section{The URL Enters Creative Computing} 231 258 ··· 240 267 Olia Lialina's \emph{My Boyfriend Came Back from the War} (1996) existed at a specific address: \code{teleportacia.org/war/}~\citep{lialina1996boyfriend}. The work was a series of nested frames that fragmented a post-war narrative into clickable shards. You could not separate the piece from its URL. Every copy, every mirror, every screenshot was a degradation. The URL was the original. Later, Lialina documented the personal home page as a form of folk art~\citep{lialina2005vernacular}---the ``under construction'' GIF, the guest book, the hit counter---all artifacts of people learning to occupy an address. 241 268 242 269 The Art Happens Here anthology documents this moment when the address became the medium~\citep{connor2019artanthology}. What net.art understood, and what creative computing environments repeatedly forget, is that the URL is not a pointer to the work. The URL is a \emph{material} of the work, the way canvas is a material of painting. An environment that generates opaque URLs---\code{/projects/abc123}---is like handing a painter a canvas with no surface texture. Technically functional. Aesthetically dead. 270 + 271 + The decay of net.art URLs is itself part of the form. The \emph{glitchbrowser} (2005--2008), built by Beflix, Organised, and Dmtr, was a URL-rewriting tool: you typed a destination and the glitchbrowser served you the destination with its embedded JPEGs and GIFs corrupted into ribbons of color~\citep{menkman2011glitch}. The browser took itself offline in 2008. The URL where the glitchbrowser once lived now returns nothing. The work survives only as documentation. Link rot is not a failure mode of net.art---it is one of its subjects. A piece that lives at an address knows it can lose the address, and many net.art works staged that loss in advance. 272 + 273 + Olia Lialina later argued that the personal home page was ``a vernacular of file formats''~\citep{lialina2005vernacular}: a folk vocabulary built from \code{<marquee>} tags, blinking text, MIDI loops, animated buddies, and the under-construction GIF. The under-construction GIF was not embarrassing---it was honest. It admitted that the address was alive, that someone was at work behind it. The opposite of an under-construction GIF is a 404: a frozen page that betrays no one is home. 243 274 244 275 \subsection{Single-Serving Sites (2000s)} 245 276 ··· 370 401 371 402 The app store reverses this polarity. An iOS app is private by default and public only through the grace of a corporation that takes 30\% of every transaction. The URL tradition says: put it on the web, give it an address, and let anyone who knows the address walk in. No toll booth. No gatekeeper. No cut. 372 403 404 + % ============ 5.5 THE URL AS SCORE ============ 405 + \section{The URL as Score} 406 + 407 + A score, in the post-1945 sense, is not a record of a performance but its \emph{invocation}: a set of instructions that summon the piece into being. The Scores Project~\citep{gallope2025scores}---an open-access digital edition of postwar graphic and event scores edited by Michael Gallope, Natilee Harren, and Patricia Hicks---makes the argument structurally as well as polemically. The edition is itself organized by URLs: each chapter, each score image, each archival object, each time-based realization has a stable address. The reader does not just read about the score. The reader \emph{follows the URL} into the performance. 408 + 409 + Aesthetic Computer pieces extend score logic to its limit. Typing \code{aesthetic.computer/whistlegraph} is not visiting a website---it is invoking a score. The URL contains the entire performance instruction. Anyone who visits the URL re-performs the piece. Many AC pieces are explicitly score-shaped: \code{whistlegraph} is a draw-while-singing score, \code{notepat} is a notation surface, \code{wand} is a movement score for the body, \code{song} is a tap score for the voice. The URL hands you the score; the browser performs it. 410 + 411 + This is what HyperCard could never do. HyperCard's stacks were rehearsal materials trapped on a single machine. AC's URLs are world-readable scores: you receive the entire instruction by reading a single word, and the instruction begins to execute the moment you press Enter. 412 + 413 + % ============ 5.6 CASUAL CREATORS ============ 414 + \section{Casual Creators and the URL-Encoded Artifact} 415 + 416 + Compton and Mateas~\citep{compton2015casual} define \emph{casual creators} as creative systems whose users are casual---no prior domain expertise, no goal beyond exploration of a possibility space. To make their artifacts shareable, casual creators have to retrofit URL encoding. Compton's \emph{Ice-Maker} (2015) embeds an entire snowflake design into a single URL that the user can post or send; the URL becomes the artifact's bearer. Twine games encode story state into URL fragments. Generative tools from \emph{Tracery} bots to color-palette generators serialize their output into shareable links. 417 + 418 + Aesthetic Computer makes this retrofit unnecessary. Every piece is already URL-resident. When a \code{kidlisp} user saves a sketch, the source is hashed and stored at \code{aesthetic.computer/\$<code>}. When a \code{prompt} user invokes a piece with parameters, the parameters are part of the URL. The casual creator's friction---``how do I share what I just made?''---is not solved with a Save and Share button. It is dissolved by a property of the medium. The URL-encoded artifact is not a feature added to AC. It is the only thing AC produces. 419 + 420 + Compton's casual creators want their users to feel \emph{capable} after a few seconds. The URL is what makes that capability portable. Without the URL, the artifact dies on the user's screen the moment they close the tab. 421 + 422 + % ============ 5.7 THE BOT AT THE ADDRESS ============ 423 + \section{The Performer at the Address} 424 + 425 + Auslander~\citep{auslander2002cyberspace} argues that the chatterbot is the latest entry in a long history of mediated performance. Each chatterbot lives at an address: a URL, an IRC channel, an email list. The bot's identity is inseparable from where it can be reached. ELIZA at MIT was a destination; Julia on IRC was a presence. Each bot was, in Auslander's terms, a \emph{performer} at a particular \emph{location}. 426 + 427 + Aesthetic Computer extends bot-thinking to all pieces. Every AC piece is a kind of performer. \code{notepat} does the same thing every time you visit, but the \emph{thing it does} is a performance: pixels arrive in a particular order, sounds occur on a particular schedule, the screen receives the same wipe. The piece is not a static document. It is a performer waiting at an address. Visiting the URL summons it on stage. 428 + 429 + Auslander notes the politically interesting case: the bot inserted into a chatroom without identifying itself as a bot. Visiting an AC URL never produces this ambiguity. The piece declares itself by \emph{being itself}. The URL is the dressing room and the stage at once. There is no green room, no rehearsal hall, no separate venue. The address is the entire theater. 430 + 431 + % ============ 5.8 TERRITORY ============ 432 + \section{The URL as Territory} 433 + 434 + Lewis, Arista, Pechawis, and Kite argue that Indigenous epistemology must contend with cyberspace as territory~\citep{lewis2018kin}---that the ``archipelago of websites, social media platforms, shared virtual environments, corporate data stores, multiplayer video games, smart devices, and intelligent machines'' is not a separate domain from terrestrial life but situated within and alongside it. The question they raise: how do we \emph{claim} this new territory, knit it into existing life, and make it our own? 435 + 436 + The URL is the smallest unit of claim. To register a domain is to take a piece of the network and put a name on it. To publish at \code{aesthetic.computer/@<handle>/<piece>} is to claim a sub-territory inside someone else's address. The handle prefix \code{@} is a flag planted on a parcel. The platform is responsible for keeping the parcel reachable. The piece-maker is responsible for what happens once you arrive. 437 + 438 + This is not metaphor. Domain-name policy, name registries, and identifier specifications are real political infrastructure~\citep{galloway2004protocol}. The URL tradition takes a position inside that infrastructure: the address belongs to whoever can claim it; the claim should be possible to make in a single word; and the platform should not be allowed to overwrite the claim. AC's contribution is to make this politics legible at the level of every piece. 439 + 373 440 % ============ 6. THE TRADITION ============ 374 441 \section{The Tradition} 375 442 376 443 The URL tradition in creative computing runs: 377 444 378 445 \begin{enumerate} 446 + \item \textbf{Lovelace's footnotes} (1843): the printed page as a node within a network. Hypertext is immanent. 447 + \item \textbf{The Negro Motorist Green Book} (1936--1966): an address book as a network browser. The address as promise of safe arrival. 448 + \item \textbf{Memex} (1945): Bush's trails. The address-by-association, portable between readers. 449 + \item \textbf{Xanadu} (1965--): Nelson's transclusion model. Every quotation retains its address. 379 450 \item \textbf{HyperCard} (1987): cards and stacks, no address, bound to disk. 380 451 \item \textbf{The Web} (1991): every document is a URL. The address \emph{is} the work. 381 452 \item \textbf{GeoCities} (1994): the personal URL. \code{\textasciitilde{}user/page.html} as creative identity. 382 453 \item \textbf{Net.art} (1995--): artists exploit the URL as material and medium. 383 454 \item \textbf{zombo.com} (1999): the single-serving site. Domain name = content = interface. 384 455 \item \textbf{Processing} (2001): creative coding, but no native URL. Export required. 456 + \item \textbf{Scratch} (2007): project URLs, but opaque and runtime-dependent. 385 457 \item \textbf{Single-serving sites} (2008): Kottke names the form. The URL \emph{is} the joke, the tool, the artwork. 386 - \item \textbf{Scratch} (2007): project URLs, but opaque and runtime-dependent. 458 + \item \textbf{Casual creators} (2015): URL-encoded artifacts as a retrofit for shareability. 387 459 \item \textbf{Neocities} (2013): GeoCities revival. The personal URL fights back. 388 460 \item \textbf{tilde.club} (2014): the tilde as radical simplicity. One page, one person, one address. 389 461 \item \textbf{Glitch} (2017): instant URLs, forkable, live from first keystroke. ··· 427 499 % ============ 10. CONCLUSION ============ 428 500 \section{Conclusion} 429 501 430 - The URL is the most important interface in computing. It is the only universal addressing scheme that works across every device, every platform, every medium. It is the infrastructure of encounter, the minimum unit of information freedom, the material of net.art, the punchline of single-serving sites, and the identity layer of the personal web. 502 + The URL is the most important interface in computing. It is the only universal addressing scheme that works across every device, every platform, every medium. It is the infrastructure of encounter, the minimum unit of information freedom, the material of net.art, the score that summons the piece, the dressing room of the bot, and the identity layer of the personal web. 503 + 504 + The tradition this paper traces did not start with Berners-Lee. It runs from Lovelace's footnotes through Bush's trails, Nelson's Xanadu, and the Negro Motorist Green Book---each a different answer to the same question: \emph{how do words and works remain reachable across time and across the social-political terrain that words and works have to cross?} The web operationalized one answer. Aesthetic Computer extends that answer to creative computing's full surface. 431 505 432 506 Every force in contemporary computing conspires to kill the URL. Apps hide it. Platforms suppress it. Shorteners mangle it. SPAs hollow it out. Mobile browsers tuck it away. The URL tradition is not a historical curiosity---it is an active resistance. 433 507 434 - Creative computing environments that embrace the URL---that make every artifact addressable, shareable, memorizable---participate in a tradition that runs from Berners-Lee's cool URIs through net.art's material URLs, single-serving sites' domain-name-as-content, the tilde's radical personhood, and Glitch's instant forkability. 508 + Creative computing environments that embrace the URL---that make every artifact addressable, shareable, memorizable---participate in this tradition. Those that don't---that hide work behind login walls, project IDs, app stores, or native containers---break the contract that the URL is supposed to honor. 435 509 436 - AC's design makes the URL not just present but \emph{primary}. The prompt is the address bar. The piece name is the URL. The URL is the identity, the distribution channel, the pedagogical entry point, the social object, the authorship claim, and the political stance. There is nothing else. 510 + AC's design makes the URL not just present but \emph{primary}. The prompt is the address bar. The piece name is the URL. The URL is the identity, the distribution channel, the pedagogical entry point, the score, the social object, the authorship claim, and the political stance. There is nothing else. 437 511 438 512 Every AC piece is a single-serving site. Every AC user has a tilde. Every AC path is a cool URI that, by design, will never change. The URL tradition does not end. It gets typed into a prompt and pressed Enter. 439 513
+2 -3
papers/cli.mjs
··· 189 189 base: "url-tradition", 190 190 siteName: "url-tradition-26-arxiv", 191 191 title: "The URL Tradition", 192 - psycho: true, 193 192 }, 194 193 "arxiv-latency": { 195 194 base: "latency", ··· 615 614 "The Potter and the Prompt argues that AC independently converges on the core principles of John Holden's 1770 proto-cognitive music theory. It proposes AC as a computational laboratory for advancing Holden's unfinished program on grouping, attention, and the module.", 616 615 }, 617 616 "url-tradition-26-arxiv": { 618 - detail: "Addressable Creative Computing from HyperCard to Aesthetic Computer &middot; arXiv 5pp", 617 + detail: "Addressable Creative Computing from Lovelace's Footnotes to Aesthetic Computer &middot; arXiv", 619 618 abstract: 620 - "The URL Tradition traces how URL-addressability reshapes creative computing. From HyperCard's landlocked stacks to AC's prompt-as-address-bar, the paper argues the URL is not a feature but a medium property that transforms pedagogy, distribution, authorship, and social interaction.", 619 + "The URL Tradition traces address-thinking from Lovelace's footnotes, Bush's trails, Xanadu, and the Negro Motorist Green Book through net.art, single-serving sites, the tilde, Glitch, and Aesthetic Computer's prompt-as-address-bar. It argues the URL is not a feature but a medium property that reshapes authorship, distribution, pedagogy, performance, and political claim.", 621 620 }, 622 621 }; 623 622
+62 -329
system/public/papers.aesthetic.computer/index.html
··· 190 190 } 191 191 192 192 .p { 193 - padding: 0.6em 0.7em; 193 + padding: 0.35em 0.6em; 194 194 border-bottom: 1px solid var(--sep); 195 - border-radius: 4px; 195 + border-radius: 3px; 196 196 transition: background 0.15s; 197 197 cursor: pointer; 198 198 } 199 199 .p:nth-child(even) { background: var(--sep); } 200 200 .p:hover { background: var(--box-bg); } 201 201 .p a { text-decoration: none; } 202 - .p .title { font-size: 1.3em; font-weight: normal; letter-spacing: -0.01em; } 202 + .p .title { font-size: 1.02em; font-weight: 500; letter-spacing: -0.005em; line-height: 1.3; } 203 203 .p .title a { color: var(--text); } 204 204 .p:hover .title a { color: var(--cyan); } 205 - .p .detail { color: var(--dim); font-size: 0.85em; margin-top: 0.2em; line-height: 1.5; } 205 + .p .detail { color: var(--dim); font-size: 0.76em; margin-top: 0.1em; line-height: 1.4; } 206 206 .p .detail a { color: var(--purple); } 207 207 .p .detail a:hover { text-decoration: underline; } 208 208 .p .abstract { 209 209 color: var(--text); 210 - opacity: 0.68; 211 - font-size: 0.8em; 212 - margin-top: 0.25em; 213 - line-height: 1.5; 214 - max-width: 72ch; 210 + opacity: 0.6; 211 + font-size: 0.72em; 212 + margin-top: 0.15em; 213 + line-height: 1.4; 214 + max-width: 78ch; 215 215 } 216 - .p .meta-row { display: flex; gap: 1em; font-size: 0.85em; margin-bottom: 0.1em; align-items: center; flex-wrap: wrap; } 216 + .p .meta-row { display: flex; gap: 0.7em; font-size: 0.7em; margin-bottom: 0.05em; align-items: center; flex-wrap: wrap; } 217 217 .p .meta-row .hits { color: var(--cyan); } 218 218 .p .meta-row .author { color: var(--pink); font-weight: 500; } 219 219 .p .updated { color: var(--cyan); opacity: 0.85; } ··· 233 233 padding-top: 1em; 234 234 } 235 235 .p.guest .meta-row .author { color: var(--purple); } 236 - 237 - /* Platter illustration — docked at the bottom of the page, gently floats */ 238 - .platter-wrap { 239 - display: flex; 240 - justify-content: center; 241 - margin: 3em 0 1.5em; 242 - opacity: 0.7; 243 - transition: opacity 0.4s; 244 - animation: platter-float 6s ease-in-out infinite; 245 - transform-origin: 50% 60%; 246 - } 247 - .platter-wrap:hover { opacity: 1; } 248 - .platter-wrap svg { width: 180px; filter: drop-shadow(0 4px 14px rgba(120, 80, 180, 0.08)); } 249 - @media (min-width: 900px) { .platter-wrap svg { width: 220px; } } 250 - @media (min-width: 1400px) { .platter-wrap svg { width: 260px; } } 251 - @keyframes platter-float { 252 - 0%, 100% { transform: translateY(0); } 253 - 50% { transform: translateY(-6px); } 254 - } 255 - @media (prefers-reduced-motion: reduce) { 256 - .platter-wrap { animation: none; } 257 - .platter-wrap svg * { animation: none !important; } 258 - } 259 236 260 237 .colophon { 261 238 margin-top: 1em; ··· 383 360 .pals { position: fixed; bottom: 1.2em; right: 1.2em; width: 48px; opacity: 0.4; } 384 361 .pals:hover { opacity: 1; } 385 362 386 - /* Build telemetry */ 387 - .build-status { 388 - margin-top: 1.5em; 389 - border: 1px solid var(--box-border); 390 - border-radius: 6px; 391 - overflow: hidden; 392 - font-size: 11px; 393 - display: none; 394 - } 395 - .build-status.active { display: block; } 396 - .build-header { 397 - display: flex; 398 - align-items: center; 399 - gap: 8px; 400 - padding: 8px 12px; 401 - background: var(--box-bg); 402 - border-bottom: 1px solid var(--box-border); 403 - cursor: pointer; 404 - user-select: none; 405 - } 406 - .build-header:hover { opacity: 0.8; } 407 - .build-dot { 408 - width: 8px; height: 8px; 409 - border-radius: 50%; 410 - background: var(--cyan); 411 - animation: build-pulse 1.5s ease-in-out infinite; 412 - } 413 - .build-dot.done { background: #4caf50; animation: none; } 414 - .build-dot.fail { background: #e53935; animation: none; } 415 - @keyframes build-pulse { 416 - 0%, 100% { opacity: 1; } 417 - 50% { opacity: 0.3; } 418 - } 419 - .build-label { color: var(--text); font-weight: 600; flex: 1; } 420 - .build-stage { color: var(--pink); font-weight: 500; } 421 - .build-pct { color: var(--dim); min-width: 3em; text-align: right; } 422 - .build-progress { 363 + /* Top-of-page build progress bar — thin, unobtrusive */ 364 + .build-bar { 365 + position: fixed; 366 + top: 0; left: 0; 423 367 height: 2px; 424 - background: var(--sep); 425 - } 426 - .build-progress-bar { 427 - height: 100%; 428 - background: var(--cyan); 429 - transition: width 0.5s ease; 430 368 width: 0%; 431 - } 432 - .build-logs { 433 - max-height: 280px; 434 - overflow-y: auto; 435 - padding: 8px 12px; 436 - background: rgba(0,0,0,0.15); 437 - font-family: 'Berkeley Mono Variable', monospace; 438 - font-size: 10px; 439 - line-height: 1.5; 440 - color: var(--dim); 369 + background: var(--cyan); 370 + opacity: 0; 371 + transition: width 0.4s ease, opacity 0.6s ease; 372 + z-index: 9999; 373 + pointer-events: none; 441 374 } 442 - .build-logs.collapsed { display: none; } 443 - .build-log-line { 444 - white-space: pre-wrap; 445 - word-break: break-all; 375 + .build-bar.active { opacity: 0.85; } 376 + .build-bar.done { 377 + background: #4caf50; 378 + width: 100% !important; 446 379 } 447 - .build-log-line .ts { 448 - color: var(--purple); 449 - opacity: 0.6; 450 - margin-right: 6px; 451 - } 452 - .build-log-line.stderr { color: #e57373; } 453 - .build-log-line.ok { color: #4caf50; } 454 - .build-log-line.deploy { color: var(--cyan); } 380 + .build-bar.fail { background: #e53935; } 455 381 456 382 /* === MOBILE (<600px) === */ 457 383 @media (max-width: 599px) { 458 - body { padding: 0.75em 1em; } 384 + body { padding: 0.6em 0.9em; } 459 385 .logo { font-size: 1.3em; } 460 386 .lang-selector .lang-text { display: none; } 461 - .p .title { font-size: 1.15em; } 387 + .p .title { font-size: 0.98em; } 462 388 .p .detail { font-size: 0.7em; } 389 + .p { padding: 0.3em 0.5em; } 463 390 } 464 391 465 - /* === DESKTOP (900px+) — wider, larger text === */ 392 + /* === DESKTOP (900px+) — wider, dense === */ 466 393 @media (min-width: 900px) { 467 394 body { 468 395 max-width: 1100px; ··· 471 398 } 472 399 .logo { font-size: 2.2em; } 473 400 .sub { font-size: 1em; margin-bottom: 1em; } 474 - .p .title { font-size: 1.6em; } 475 - .p .detail { font-size: 0.95em; } 476 - .p { padding: 0.7em 0.5em; } 477 - .footer { font-size: 0.85em; } 401 + .p .title { font-size: 1.15em; } 402 + .p .detail { font-size: 0.82em; } 403 + .p { padding: 0.45em 0.6em; } 404 + .footer { font-size: 0.8em; } 478 405 } 479 406 480 - /* === XL (1400px+) — even wider === */ 407 + /* === XL (1400px+) — even wider, still dense === */ 481 408 @media (min-width: 1400px) { 482 409 body { 483 410 max-width: 1300px; ··· 486 413 } 487 414 .logo { font-size: 2.6em; } 488 415 .sub { font-size: 1.1em; } 489 - .p .title { font-size: 1.8em; } 490 - .p .detail { font-size: 1em; } 416 + .p .title { font-size: 1.22em; } 417 + .p .detail { font-size: 0.85em; } 491 418 .pals { width: 64px; } 492 419 } 493 420 </style> 494 421 </head> 495 422 <body> 423 + <div class="build-bar" id="buildBar"></div> 496 424 <a href="https://aesthetic.computer" class="pals"><img src="https://aesthetic.computer/purple-pals.svg" alt="AC" style="width:100%"></a> 497 425 498 426 <div class="top-bar"> ··· 695 623 <div class="meta-row"><span class="author">@jeffrey</span><span class="created" title="Created">03/21</span><span class="revisions" title="Revision count">revision 3</span><span class="updated" title="Last updated">Apr 6 22:52</span></div> 696 624 </div> 697 625 698 - <div class="p" data-paper-id="url-tradition" data-psycho="1" data-created="" data-updated="2026-04-27T22:18:35.130Z"> 626 + <div class="p" data-paper-id="url-tradition" data-created="" data-updated="2026-04-27T22:18:35.130Z"> 699 627 <div class="title"><a href="/url-tradition-26-arxiv.pdf" data-base="/url-tradition-26-arxiv">The URL Tradition</a></div> 700 - <div class="detail">Addressable Creative Computing from HyperCard to Aesthetic Computer &middot; arXiv 5pp</div> 701 - <div class="abstract">The URL Tradition traces how URL-addressability reshapes creative computing. From HyperCard's landlocked stacks to AC's prompt-as-address-bar, the paper argues the URL is not a feature but a medium property that transforms pedagogy, distribution, authorship, and social interaction.</div> 702 - <div class="meta-row"><span class="author">@jeffrey</span><span class="revisions" title="Revision count">revision 1</span><span class="updated" title="Last updated">Apr 27 22:18</span></div> 628 + <div class="detail">Addressable Creative Computing from Lovelace's Footnotes to Aesthetic Computer &middot; arXiv</div> 629 + <div class="abstract">The URL Tradition traces address-thinking from Lovelace's footnotes, Bush's trails, Xanadu, and the Negro Motorist Green Book through net.art, single-serving sites, the tilde, Glitch, and Aesthetic Computer's prompt-as-address-bar. It argues the URL is not a feature but a medium property that reshapes authorship, distribution, pedagogy, performance, and political claim.</div> 630 + <div class="meta-row"><span class="author">@jeffrey</span><span class="revisions" title="Revision count">revision 2</span><span class="updated" title="Last updated">Apr 27 22:18</span></div> 703 631 </div> 704 632 705 633 <div class="p" data-paper-id="latency" data-created="2026-04-26" data-updated="2026-04-27T17:05:10.844Z"> ··· 720 648 <div class="title"><a href="/kidlisp-els-2026.pdf">KidLisp (ELS 2026)</a></div> 721 649 <div class="detail">A Minimal Lisp for Generative Art with Social Composition &middot; ELS ACM SIGS 4pp</div> 722 650 <div class="abstract">An ELS conference version of KidLisp that emphasizes social composition. It positions the language as a shared practice rather than a solo scripting environment.</div> 723 - <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:27</span></div> 651 + <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:12</span></div> 724 652 </div> 725 653 726 654 <div class="p" data-paper-id="joss-kidlisp"> 727 655 <div class="title"><a href="/kidlisp-26-joss.pdf">KidLisp '26</a></div> 728 656 <div class="detail">JOSS Summary &middot; 3pp</div> 729 657 <div class="abstract">A compact JOSS summary of KidLisp for archival and citation purposes. It frames the language as a small but expressive tool for generative art.</div> 730 - <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:27</span></div> 658 + <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:12</span></div> 731 659 </div> 732 660 733 661 <div class="p" data-paper-id="joss-ac"> 734 662 <div class="title"><a href="/aesthetic-computer-26-joss.pdf">Aesthetic Computer '26</a></div> 735 663 <div class="detail">JOSS Summary &middot; 2pp</div> 736 664 <div class="abstract">A compact JOSS summary of Aesthetic Computer for archival and citation purposes. It distills the platform into a conventional software paper format.</div> 737 - <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:27</span></div> 665 + <div class="meta-row"><span class="created" title="Created"></span><span class="revisions" title="Revisions"></span><span class="updated" title="Last updated">Apr 27 21:12</span></div> 738 666 </div> 739 667 740 668 <!-- papers-end --> ··· 742 670 <!-- guest-start --> 743 671 <!-- guest-end --> 744 672 745 - <!-- Platter SVG moved to the bottom of the page — see .platter-wrap below colophon. --> 746 - 747 673 <div class="colophon"> 748 674 <p>Papers publishes working research on the <a href="https://aesthetic.computer" class="ac-link"><span class="logo-ac">Aesthetic<span class="logo-dot">.</span>Computer</span></a> project, typeset in LaTeX and compiled from the <a href="/platter">research platter</a>. Cards are 4&times;6 inch mobile versions. Translated into Danish, Spanish, Chinese, and Japanese.</p> 749 675 <p>By <a href="https://prompt.ac/@jeffrey">@jeffrey</a>. <a href="/feed.xml" title="Atom feed">feed</a>.</p> 750 676 </div> 751 677 752 - <!-- Platter SVG — animated, decorative; docked at the page bottom --> 753 - <a href="/platter" style="text-decoration:none" aria-label="research platter"> 754 - <div class="platter-wrap"> 755 - <svg viewBox="0 0 300 200" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="An animated research platter beneath a cloche with rising steam"> 756 - <defs> 757 - <!-- Subtle shine gradient for the cloche --> 758 - <linearGradient id="cloche-shine" x1="0" y1="0" x2="1" y2="1"> 759 - <stop offset="0%" stop-color="var(--text)" stop-opacity="0.08"/> 760 - <stop offset="40%" stop-color="var(--text)" stop-opacity="0.18"/> 761 - <stop offset="60%" stop-color="var(--text)" stop-opacity="0.06"/> 762 - <stop offset="100%" stop-color="var(--text)" stop-opacity="0.02"/> 763 - </linearGradient> 764 - <!-- Platter metallic gradient --> 765 - <linearGradient id="platter-metal" x1="0" y1="0" x2="0" y2="1"> 766 - <stop offset="0%" stop-color="var(--text)" stop-opacity="0.15"/> 767 - <stop offset="50%" stop-color="var(--text)" stop-opacity="0.08"/> 768 - <stop offset="100%" stop-color="var(--text)" stop-opacity="0.12"/> 769 - </linearGradient> 770 - <!-- Soft rim-light sweep (shifts left→right to suggest reflection) --> 771 - <linearGradient id="rim-sweep" x1="0" y1="0" x2="1" y2="0"> 772 - <stop offset="0%" stop-color="var(--text)" stop-opacity="0"/> 773 - <stop offset="45%" stop-color="var(--text)" stop-opacity="0"/> 774 - <stop offset="55%" stop-color="var(--text)" stop-opacity="0.25"/> 775 - <stop offset="65%" stop-color="var(--text)" stop-opacity="0"/> 776 - <stop offset="100%" stop-color="var(--text)" stop-opacity="0"/> 777 - <animate attributeName="x1" values="-1;0;1" dur="5s" repeatCount="indefinite"/> 778 - <animate attributeName="x2" values="0;1;2" dur="5s" repeatCount="indefinite"/> 779 - </linearGradient> 780 - </defs> 781 - 782 - <!-- === STEAM WISPS (five staggered wisps drifting upward) === --> 783 - <g class="platter-steam"> 784 - <path d="M120 52 Q115 40 120 28 Q125 16 118 6" stroke="var(--cyan)" stroke-width="1.2" fill="none" opacity="0.2" stroke-linecap="round"> 785 - <animate attributeName="opacity" values="0.05;0.35;0.05" dur="2.5s" repeatCount="indefinite"/> 786 - <animate attributeName="d" values="M120 52 Q115 40 120 28 Q125 16 118 6;M120 52 Q126 38 119 26 Q113 14 120 4;M120 52 Q115 40 120 28 Q125 16 118 6" dur="3s" repeatCount="indefinite"/> 787 - </path> 788 - <path d="M135 50 Q130 36 136 24 Q142 12 134 2" stroke="var(--cyan)" stroke-width="0.9" fill="none" opacity="0.14" stroke-linecap="round"> 789 - <animate attributeName="opacity" values="0.04;0.24;0.04" dur="3.4s" repeatCount="indefinite" begin="0.2s"/> 790 - <animate attributeName="d" values="M135 50 Q130 36 136 24 Q142 12 134 2;M135 50 Q141 34 133 22 Q127 10 136 0;M135 50 Q130 36 136 24 Q142 12 134 2" dur="3.7s" repeatCount="indefinite" begin="0.2s"/> 791 - </path> 792 - <path d="M150 48 Q145 34 150 22 Q155 10 148 0" stroke="var(--pink)" stroke-width="1" fill="none" opacity="0.15" stroke-linecap="round"> 793 - <animate attributeName="opacity" values="0.05;0.3;0.05" dur="3s" repeatCount="indefinite" begin="0.5s"/> 794 - <animate attributeName="d" values="M150 48 Q145 34 150 22 Q155 10 148 0;M150 48 Q156 32 149 20 Q143 8 150 -2;M150 48 Q145 34 150 22 Q155 10 148 0" dur="3.5s" repeatCount="indefinite" begin="0.5s"/> 795 - </path> 796 - <path d="M165 50 Q160 36 166 24 Q172 12 164 2" stroke="var(--pink)" stroke-width="0.9" fill="none" opacity="0.12" stroke-linecap="round"> 797 - <animate attributeName="opacity" values="0.04;0.22;0.04" dur="3.2s" repeatCount="indefinite" begin="0.8s"/> 798 - <animate attributeName="d" values="M165 50 Q160 36 166 24 Q172 12 164 2;M165 50 Q171 34 163 22 Q157 10 166 0;M165 50 Q160 36 166 24 Q172 12 164 2" dur="3.6s" repeatCount="indefinite" begin="0.8s"/> 799 - </path> 800 - <path d="M180 52 Q175 38 180 26 Q185 14 178 4" stroke="var(--purple)" stroke-width="1.1" fill="none" opacity="0.18" stroke-linecap="round"> 801 - <animate attributeName="opacity" values="0.06;0.34;0.06" dur="2.8s" repeatCount="indefinite" begin="1s"/> 802 - <animate attributeName="d" values="M180 52 Q175 38 180 26 Q185 14 178 4;M180 52 Q186 36 179 24 Q173 12 180 2;M180 52 Q175 38 180 26 Q185 14 178 4" dur="3.2s" repeatCount="indefinite" begin="1s"/> 803 - </path> 804 - </g> 805 - 806 - <!-- === CLOCHE (dome lid) — lifted and gently tilting === --> 807 - <g transform="translate(-8, -6) rotate(-8, 150, 100)"> 808 - <!-- Continuous subtle sway around the lifted position --> 809 - <animateTransform attributeName="transform" type="rotate" values="-10 150 100;-6 150 100;-10 150 100" dur="6s" repeatCount="indefinite" additive="sum"/> 810 - <animateTransform attributeName="transform" type="translate" values="0 0;0 -2;0 0" dur="4s" repeatCount="indefinite" additive="sum"/> 811 - <!-- Dome shape --> 812 - <path d="M80 130 Q80 55 150 50 Q220 55 220 130" fill="url(#cloche-shine)" stroke="var(--purple)" stroke-width="1.5"/> 813 - <!-- Rim of the cloche --> 814 - <ellipse cx="150" cy="130" rx="70" ry="8" fill="var(--text)" fill-opacity="0.06" stroke="var(--purple)" stroke-width="1"/> 815 - <!-- Highlight arc on dome --> 816 - <path d="M105 100 Q110 70 145 62" stroke="var(--text)" stroke-width="1.5" fill="none" opacity="0.12" stroke-linecap="round"> 817 - <animate attributeName="opacity" values="0.08;0.2;0.08" dur="5s" repeatCount="indefinite"/> 818 - </path> 819 - <!-- Handle/knob on top --> 820 - <ellipse cx="150" cy="48" rx="10" ry="5" fill="var(--purple)" opacity="0.3"/> 821 - <ellipse cx="150" cy="46" rx="7" ry="3.5" fill="var(--pink)" opacity="0.2"/> 822 - <circle cx="150" cy="45" r="2" fill="var(--cyan)" opacity="0.3"> 823 - <!-- Sparkle on the knob --> 824 - <animate attributeName="r" values="1.6;2.6;1.6" dur="2.2s" repeatCount="indefinite"/> 825 - <animate attributeName="opacity" values="0.2;0.6;0.2" dur="2.2s" repeatCount="indefinite"/> 826 - </circle> 827 - </g> 828 - 829 - <!-- === PAPERS peeking out, each paper flutters slightly === --> 830 - <g opacity="0.75"> 831 - <!-- Paper 1 (angled left) --> 832 - <g> 833 - <animateTransform attributeName="transform" type="rotate" values="-12 130 140;-9 130 140;-13 130 140;-12 130 140" dur="5.5s" repeatCount="indefinite"/> 834 - <rect x="100" y="120" width="50" height="36" rx="1" fill="var(--text)" fill-opacity="0.1" stroke="var(--purple)" stroke-width="0.6"/> 835 - <line x1="107" y1="128" x2="143" y2="128" stroke="var(--pink)" stroke-width="0.8" opacity="0.35"/> 836 - <line x1="107" y1="133" x2="140" y2="133" stroke="var(--dim)" stroke-width="0.5" opacity="0.25"/> 837 - <line x1="107" y1="137" x2="138" y2="137" stroke="var(--dim)" stroke-width="0.5" opacity="0.2"/> 838 - <line x1="107" y1="141" x2="135" y2="141" stroke="var(--dim)" stroke-width="0.5" opacity="0.15"/> 839 - <line x1="107" y1="145" x2="130" y2="145" stroke="var(--dim)" stroke-width="0.5" opacity="0.12"/> 840 - </g> 841 - <!-- Paper 2 (angled right) --> 842 - <g> 843 - <animateTransform attributeName="transform" type="rotate" values="8 175 138;10 175 138;6 175 138;8 175 138" dur="6.2s" repeatCount="indefinite" begin="0.6s"/> 844 - <rect x="148" y="118" width="50" height="36" rx="1" fill="var(--text)" fill-opacity="0.08" stroke="var(--cyan)" stroke-width="0.6"/> 845 - <line x1="155" y1="126" x2="191" y2="126" stroke="var(--cyan)" stroke-width="0.8" opacity="0.3"/> 846 - <line x1="155" y1="131" x2="188" y2="131" stroke="var(--dim)" stroke-width="0.5" opacity="0.2"/> 847 - <line x1="155" y1="135" x2="186" y2="135" stroke="var(--dim)" stroke-width="0.5" opacity="0.15"/> 848 - <line x1="155" y1="139" x2="183" y2="139" stroke="var(--dim)" stroke-width="0.5" opacity="0.12"/> 849 - </g> 850 - <!-- Paper 3 (center, slightly tilted) --> 851 - <g> 852 - <animateTransform attributeName="transform" type="rotate" values="-3 150 135;-1 150 135;-4 150 135;-3 150 135" dur="7s" repeatCount="indefinite" begin="1.2s"/> 853 - <rect x="122" y="115" width="55" height="40" rx="1" fill="var(--text)" fill-opacity="0.06" stroke="var(--purple)" stroke-width="0.5" opacity="0.6"/> 854 - <line x1="130" y1="124" x2="170" y2="124" stroke="var(--purple)" stroke-width="0.7" opacity="0.25"/> 855 - <line x1="130" y1="129" x2="168" y2="129" stroke="var(--dim)" stroke-width="0.5" opacity="0.18"/> 856 - <line x1="130" y1="133" x2="165" y2="133" stroke="var(--dim)" stroke-width="0.5" opacity="0.14"/> 857 - <line x1="130" y1="137" x2="160" y2="137" stroke="var(--dim)" stroke-width="0.5" opacity="0.1"/> 858 - </g> 859 - </g> 860 - 861 - <!-- === PLATTER BASE (oval serving tray) === --> 862 - <!-- Shadow underneath (breathes with the cloche) --> 863 - <ellipse cx="152" cy="172" rx="100" ry="14" fill="var(--text)" opacity="0.04"> 864 - <animate attributeName="rx" values="100;104;100" dur="6s" repeatCount="indefinite"/> 865 - <animate attributeName="opacity" values="0.03;0.06;0.03" dur="6s" repeatCount="indefinite"/> 866 - </ellipse> 867 - <!-- Main platter surface --> 868 - <ellipse cx="150" cy="162" rx="105" ry="16" fill="url(#platter-metal)" stroke="var(--purple)" stroke-width="1.5"/> 869 - <!-- Rim light sweep (reflection traveling across the rim) --> 870 - <ellipse cx="150" cy="162" rx="105" ry="16" fill="url(#rim-sweep)" pointer-events="none"/> 871 - <!-- Inner rim --> 872 - <ellipse cx="150" cy="161" rx="88" ry="12" fill="none" stroke="var(--purple)" stroke-width="0.6" opacity="0.3"/> 873 - <!-- Highlight on rim --> 874 - <path d="M65 158 Q100 150 150 149 Q200 150 235 158" stroke="var(--text)" stroke-width="0.8" fill="none" opacity="0.1" stroke-linecap="round"/> 875 - <!-- Platter lip/edge (bottom rim thickness) --> 876 - <path d="M45 162 Q45 170 150 178 Q255 170 255 162" fill="var(--text)" fill-opacity="0.04" stroke="var(--purple)" stroke-width="0.8" opacity="0.4"/> 877 - <!-- Decorative dots on rim — blink sequentially, like a news ticker --> 878 - <circle cx="70" cy="163" r="1.2" fill="var(--pink)" opacity="0.2"> 879 - <animate attributeName="opacity" values="0.15;0.65;0.15" dur="3.6s" repeatCount="indefinite" begin="0s"/> 880 - </circle> 881 - <circle cx="90" cy="159" r="1" fill="var(--cyan)" opacity="0.2"> 882 - <animate attributeName="opacity" values="0.15;0.6;0.15" dur="3.6s" repeatCount="indefinite" begin="0.6s"/> 883 - </circle> 884 - <circle cx="210" cy="159" r="1" fill="var(--cyan)" opacity="0.2"> 885 - <animate attributeName="opacity" values="0.15;0.6;0.15" dur="3.6s" repeatCount="indefinite" begin="1.2s"/> 886 - </circle> 887 - <circle cx="230" cy="163" r="1.2" fill="var(--pink)" opacity="0.2"> 888 - <animate attributeName="opacity" values="0.15;0.65;0.15" dur="3.6s" repeatCount="indefinite" begin="1.8s"/> 889 - </circle> 890 - <circle cx="150" cy="157" r="1" fill="var(--purple)" opacity="0.25"> 891 - <animate attributeName="opacity" values="0.2;0.7;0.2" dur="3.6s" repeatCount="indefinite" begin="2.4s"/> 892 - </circle> 893 - 894 - <!-- === LABEL === --> 895 - <text x="150" y="192" text-anchor="middle" font-family="'Berkeley Mono Variable', monospace" font-size="9" fill="var(--dim)" opacity="0.5">research platter</text> 896 - </svg> 897 - </div> 898 - </a> 899 - 900 - <div class="build-status" id="buildStatus"> 901 - <div class="build-header" id="buildHeader"> 902 - <span class="build-dot" id="buildDot"></span> 903 - <span class="build-label" id="buildLabel">building papers...</span> 904 - <span class="build-stage" id="buildStage"></span> 905 - <span class="build-pct" id="buildPct"></span> 906 - </div> 907 - <div class="build-progress"><div class="build-progress-bar" id="buildBar"></div></div> 908 - <div class="build-logs" id="buildLogs"></div> 909 - </div> 910 678 911 679 <div class="footer"> 912 680 <span><a href="https://aesthetic.computer">aesthetic.computer</a> &middot; <a href="/platter">platter</a> &middot; <a href="https://github.com/whistlegraph/aesthetic-computer/tree/main/papers">source</a> &middot; <button onclick="toggleTheme()">theme</button></span> ··· 1325 1093 } catch {} 1326 1094 })(); 1327 1095 1328 - // === BUILD TELEMETRY === 1096 + // === BUILD TELEMETRY (thin top progress bar only) === 1329 1097 const OVEN = 'https://oven.aesthetic.computer'; 1330 - const buildEl = document.getElementById('buildStatus'); 1331 - const buildDot = document.getElementById('buildDot'); 1332 - const buildLabel = document.getElementById('buildLabel'); 1333 - const buildStage = document.getElementById('buildStage'); 1334 - const buildPct = document.getElementById('buildPct'); 1335 1098 const buildBar = document.getElementById('buildBar'); 1336 - const buildLogs = document.getElementById('buildLogs'); 1337 - let logsCollapsed = false; 1338 1099 1339 - document.getElementById('buildHeader').addEventListener('click', () => { 1340 - logsCollapsed = !logsCollapsed; 1341 - buildLogs.classList.toggle('collapsed', logsCollapsed); 1342 - }); 1100 + function setBar(pct, state) { 1101 + if (!buildBar) return; 1102 + buildBar.style.width = Math.max(0, Math.min(100, pct)) + '%'; 1103 + buildBar.classList.toggle('active', state === 'active'); 1104 + buildBar.classList.toggle('done', state === 'done'); 1105 + buildBar.classList.toggle('fail', state === 'fail'); 1106 + } 1343 1107 1344 - function addLogLine(line, stream) { 1345 - const div = document.createElement('div'); 1346 - div.className = 'build-log-line'; 1347 - if (stream === 'stderr') div.classList.add('stderr'); 1348 - if (/^\s*(OK|DEPLOY)\s/.test(line)) div.classList.add(line.trim().startsWith('OK') ? 'ok' : 'deploy'); 1349 - const ts = new Date().toLocaleTimeString('en', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); 1350 - div.innerHTML = `<span class="ts">${ts}</span>${line.replace(/</g, '&lt;')}`; 1351 - buildLogs.appendChild(div); 1352 - // Keep last 200 lines 1353 - while (buildLogs.children.length > 200) buildLogs.removeChild(buildLogs.firstChild); 1354 - buildLogs.scrollTop = buildLogs.scrollHeight; 1108 + function clearBar() { 1109 + if (!buildBar) return; 1110 + buildBar.classList.remove('active', 'done', 'fail'); 1111 + buildBar.style.width = '0%'; 1355 1112 } 1356 1113 1357 1114 function connectBuildStream(jobId) { 1358 - buildEl.classList.add('active'); 1359 - buildDot.className = 'build-dot'; 1360 - buildLabel.textContent = 'building papers...'; 1361 - buildLogs.innerHTML = ''; 1362 - 1115 + setBar(2, 'active'); 1363 1116 const src = new EventSource(`${OVEN}/papers-build/${jobId}/stream`); 1364 1117 1365 1118 src.addEventListener('status', (e) => { 1366 1119 try { 1367 1120 const d = JSON.parse(e.data); 1368 - buildStage.textContent = d.stage || ''; 1369 - const pct = Math.round(d.percent || 0); 1370 - buildPct.textContent = pct + '%'; 1371 - buildBar.style.width = pct + '%'; 1372 - } catch {} 1373 - }); 1374 - 1375 - src.addEventListener('logs', (e) => { 1376 - try { 1377 - const d = JSON.parse(e.data); 1378 - for (const log of (d.logs || [])) { 1379 - addLogLine(log.line, log.stream); 1380 - } 1121 + setBar(Math.round(d.percent || 0), 'active'); 1381 1122 } catch {} 1382 1123 }); 1383 1124 ··· 1385 1126 try { 1386 1127 const d = JSON.parse(e.data); 1387 1128 const ok = d.status === 'success'; 1388 - buildDot.className = 'build-dot ' + (ok ? 'done' : 'fail'); 1389 - buildLabel.textContent = ok ? 'build complete' : 'build failed'; 1390 - buildStage.textContent = ''; 1391 - buildPct.textContent = ok ? '100%' : 'err'; 1392 - buildBar.style.width = ok ? '100%' : buildBar.style.width; 1393 - if (ok) addLogLine('publish complete — reloading in 5s...', 'stdout'); 1394 - // Auto-reload after successful build to pick up new PDFs 1395 - if (ok) setTimeout(() => location.reload(), 5000); 1129 + setBar(100, ok ? 'done' : 'fail'); 1130 + if (ok) setTimeout(() => location.reload(), 3000); 1131 + else setTimeout(clearBar, 4000); 1396 1132 } catch {} 1397 1133 src.close(); 1398 1134 }); 1399 1135 1400 1136 src.onerror = () => { 1401 - // SSE disconnected — check again in 30s 1402 1137 src.close(); 1138 + clearBar(); 1403 1139 setTimeout(pollOven, 30000); 1404 1140 }; 1405 1141 } ··· 1409 1145 const res = await fetch(`${OVEN}/papers-build`, { signal: AbortSignal.timeout(5000) }); 1410 1146 if (!res.ok) return; 1411 1147 const data = await res.json(); 1412 - // Find an active build 1413 1148 const active = data.active || data.current; 1414 1149 if (active && (active.status === 'running' || active.status === 'pending')) { 1415 1150 connectBuildStream(active.id); 1416 1151 } else { 1417 - // No active build — hide and poll again later 1418 - buildEl.classList.remove('active'); 1152 + clearBar(); 1419 1153 setTimeout(pollOven, 60000); 1420 1154 } 1421 1155 } catch { ··· 1423 1157 } 1424 1158 } 1425 1159 1426 - // Start polling for active builds 1427 1160 pollOven(); 1428 1161 1429 1162 // Theme toggle