<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Antonio Troise on Medium]]></title>
        <description><![CDATA[Stories by Antonio Troise on Medium]]></description>
        <link>https://medium.com/@levysoft?source=rss-f51021821a2------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*oogLsVBwcg6-fPFn.jpg</url>
            <title>Stories by Antonio Troise on Medium</title>
            <link>https://medium.com/@levysoft?source=rss-f51021821a2------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 21:52:56 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@levysoft/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Art Without an Audience: Creative Solipsism in the Age of AI, from Fiction to Music]]></title>
            <link>https://levysoft.medium.com/art-without-an-audience-creative-solipsism-in-the-age-of-ai-from-fiction-to-music-35ad756c7660?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/35ad756c7660</guid>
            <category><![CDATA[music]]></category>
            <category><![CDATA[philosophy]]></category>
            <category><![CDATA[art]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[solipsism]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 16:35:39 GMT</pubDate>
            <atom:updated>2026-11-12T17:50:11.203Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*AJE3C0nMFYcEPFte.png" /></figure><p>For centuries, we have regarded writing as a form of communication. Even when a writer worked in solitude, there was at least an imaginary reader on the other side of the page, whether a vast audience, a single person, or someone who might discover the text many years later. In any case, a work emerged from a relationship, one consciousness attempting to reach another. The arrival of generative AI introduces a different possibility: <strong>someone can ask a model to produce a story, modify it, read it, regenerate it, and keep it without ever showing it to another human being</strong>. <strong>The author, reader, editor, and audience all become the same person</strong>.</p><h3>1. Narrative Solipsism: When the Reader Becomes the Writer</h3><p>This is the phenomenon explored in the paper <a href="https://arxiv.org/abs/2606.22748">AI Fiction in the Wild</a>, updated on arXiv on June 23, 2026, through the figure of the <strong>solipsistic reader-writer</strong>. <strong>In philosophy, solipsism is the position that only one’s own mind can be known with certainty</strong> (the term is also used colloquially to describe egocentrism or an excessive preoccupation with oneself). The Austrian philosopher <strong>Ludwig Wittgenstein addressed the problem of solipsism in his</strong> <a href="https://wittgensteinproject.org/w/index.php/Tractatus_logico-philosophicus_%28italiano%29"><strong><em>Tractatus Logico-Philosophicus</em></strong></a>, first published in 1921. In proposition 5.63, he writes, “<strong><em>I am my world</em></strong>,” reflecting on the relationship between the subject, language, and the limits of personal experience. This is not simply an endorsement of solipsism, but a philosophical investigation into the boundaries within which we can understand and describe the world.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/836/1*Ga-Y1a0B1k8pa7ve3lqLtA.jpeg" /></figure><p>In the context of <strong>generative creativity</strong>, the term takes on a meaning that is less metaphysical and more cultural. The solipsistic reader-writer decides what kind of story they want, specifies its characters, atmosphere, and events, instructs the AI to write it, reads the result, requests corrections and new versions, and <strong>remains the work’s only audience</strong>. The distinction between creator and consumer is no longer stable: instead of choosing a work written by someone else, the reader <strong>generates the text they want to read</strong>. The process forms a closed loop (desire, prompt, generation, consumption, revision, and regeneration). The paper does not claim that all AI-generated fiction is necessarily solipsistic, since the researchers cannot know which texts were shared, published, or created collaboratively with friends. They do, however, identify a historically significant possibility: <strong>producing and consuming fiction without engaging in a reciprocal imaginative exchange with another person</strong>.</p><p>Reading a novel normally means encountering a will we cannot control. The author decides which characters to follow, which events to describe, and how the story will end. Readers can criticize, interpret, or reject those decisions, but they cannot change them in real time. <strong>Part of literature’s value comes precisely from this resistance</strong>, from a book’s ability to surprise us, irritate us, or force us to see the world from a perspective we would never have chosen ourselves. <strong>With fiction generated on demand, this narrative autonomy is drastically reduced</strong>. Readers can request a different ending, a more understanding character, the removal of an unpleasant event, or the repetition of a particular scene. They can ask for a specific atmosphere or a new version in which everything unfolds exactly as they wish. The model becomes a technological and probabilistic “other,” but it does not possess the creative autonomy of a human author. Conversational models also tend to accommodate users, adapting their responses to their expectations. The risk, therefore, is <strong>replacing an encounter with another consciousness with a generative mirror</strong>, one that introduces variations while continuing to reflect the desires of the person looking into it. The paper describes this transformation as a <strong>more isolated, restricted, and solipsistic form of reading</strong>.</p><h4>1.1. From Participatory Culture to Fiction Made to Order</h4><p>The Internet had already narrowed the distance between authors and readers. <em>Online communities, self-publishing, and collaborative writing platforms</em> enabled readers to become authors themselves, while comments, reviews, and discussions could influence a story even as it was being published. This is often described as <strong>participatory culture</strong>, in which the audience does more than receive a work and instead contributes to its development. AI takes this process a step further, opening up a possibility that moves in the opposite direction from collective participation: <strong>a fully personalized culture that can exist entirely within the private sphere</strong>.</p><p><strong>In participatory culture, many individuals contribute to the same fictional universe. In solipsistic culture, one individual generates a personal universe that may never be shared with anyone else</strong>. The progression becomes: <strong>passive reader, participating reader, reader-author, reader as their own author and audience</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9sVG8VUEJokKumzvDZcAeQ.png" /></figure><p>The final stage no longer requires a community: <strong>cultural production can take place entirely within a private conversation between a person and a model</strong>.</p><p>Traditional fiction inevitably involves a certain distance between what readers want and what they actually find. They have to look for a book, trust a review, start reading, and accept that only part of the work may correspond to their tastes. Generative models instead transform <strong>storytelling into an instant, personalized service</strong>. Users can request stories tailored to their preferences, even intervening in relationships between characters or deciding how the plot should end. Personalization can extend to details that would be unlikely to find a place in a novel intended for a broad readership. The story no longer needs to appeal to a sufficiently large community of readers to justify publication. <strong>It only needs to satisfy one person</strong>. <strong>The traditional cultural marketplace aggregates tastes, while AI can disaggregate those tastes down to the individual level</strong>.</p><p>A human author needs time to imagine, write, revise, and publish. AI dramatically reduces this waiting period: <strong>readers can obtain an almost immediate continuation of a story or a variation of a scene they have just read</strong>. The paper describes the case of a reader who used ChatGPT to generate possible continuations of a story being published in installments by a human author, rather than waiting for the next chapter. The episode illustrates how <strong>immediacy can take precedence over the relationship with the person actually writing the work</strong>. Waiting, however, is not merely a technical limitation. <strong>Waiting for a new book or chapter means acknowledging that the work depends on another person’s time and creative decisions</strong>. Eliminating that wait also means, to some extent, removing that dependence. A model does not need to rest, study, or take time to reach an artistic decision. It is available whenever the reader wants another story, and storytelling begins to resemble a continuous stream.</p><h4>1.2. The Infinite Story: Repetition, Variations, and Re-rolling</h4><p>One of the paper’s most interesting findings concerns repetition. Many users do not constantly request different stories. Instead, they <strong>generate numerous versions of the same story</strong>, changing details, dialogue, or endings. The researchers identify two main profiles: <strong>story cyclers</strong>, who remain focused on one story for a while before moving on to another, often preserving similar characters, themes, or structures; and <strong>infinite story demanders</strong>, who request the same story, or an almost identical one, over extended periods, sometimes continuing to generate variations for months. In the analyzed sample, users with at least two conversations produced <strong>repetitive or near-duplicate prompts in an average of 42% of cases, rising to 69% among power users and 85% among the ten most prolific users</strong>. Repetition should not necessarily be interpreted as a failure of the system. Sometimes users regenerate a response because it is not quite what they wanted, but in other cases <strong>the pleasure comes from exploring endless variations of a familiar structure</strong>, a story that remains recognizable without becoming entirely predictable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AuEsILk8CbXH540m9JxiwA.png" /></figure><p>Fiction has always allowed us to explore alternative lives, to wonder what would have happened if a protagonist had made a different decision, how a story might have changed because of an unexpected encounter, or what might follow from altering a single initial condition. Novels, games, and films have long experimented with branching narratives and parallel realities, but <strong>generative systems make this structure virtually inexhaustible</strong>. Readers no longer have to settle for a single alternative ending. They can <strong>explore dozens or hundreds of narrative branches</strong>. The paper draws on the concept of the <strong>multiform story</strong>, a narrative in which mutually incompatible possibilities coexist. With AI, readers can explore those possibilities directly, generating one version after another. This creates a new relationship with the work, in which <strong>the definitive version becomes less important</strong>. Every text is merely one of many possible configurations, and <strong>reading is no longer necessarily about reaching a conclusion, but about continuing to explore the space of possible variations</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8bYZvmUuF4iOW0dA8CYQbg.png" /></figure><p>The paper also uses the concept of <strong>re-rolling</strong>, borrowed from gaming. A player restarts a game or repeats an action until the desired conditions are achieved. Applied to fiction, this means <strong>regenerating a scene until the model produces the preferred combination</strong>. Readers can discard any version without consequences because it is too sad, too short, contains a character behaving badly, lacks emotional intensity in its dialogue, or ends in a way that fails to meet their expectations. Then they simply generate another one. When a satisfying variation appears, the user can incorporate parts of it into the next prompt and continue along that narrative branch, a behavior the paper observes among particularly repetitive users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LGCjMU0rVpauAQAWUyYSLw.png" /></figure><p>The users observed in the study do not always rely on generic requests. Many write <strong>long, detailed prompts</strong>, specifying names, relationships, events, and even small objects that must appear in a scene. The user makes the narrative decisions they consider most important and leaves the model to connect them through descriptions, dialogue, and intermediate passages. This creates a distinctive division of labor in which <strong>the human controls the macrostructure while the model produces the microstructure</strong>. The user is therefore neither simply a reader nor a writer in the traditional sense. <strong>They become the designer of their own narrative consumption</strong>, with the story co-produced through a sequence of instructions, evaluations, and regenerations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wjdN32rHToYxbN2jgCw2lw.png" /></figure><h4>1.3. Creating for Ourselves: Between Freedom and Solipsism</h4><p>Within a closed creative loop, the purpose of a text can change. A publicly shared story must face the judgment of others. It can be criticized, misunderstood, or ignored, and it needs at least some elements capable of interesting people beyond its author. A private story generated for personal consumption has no such obligations. It can be repetitive or excessively specific, lacking originality or making little sense outside its personal context. It may revolve around private memories and fantasies, carrying emotional significance only for the person who requested it. There is no need for <strong>the story to be good according to shared literary standards, as long as it provides the desired experience</strong>. Fiction thus moves closer to personal fantasy, with one fundamental difference: <strong>the fantasy is externalized</strong>. Something that previously existed only in the individual’s imagination <strong>is transformed into a text that can be read as though it had come from someone else</strong>.</p><p>Showing others something we have written means exposing ourselves. A human reader might judge our technique, tastes, obsessions, or the way we represent ourselves, whereas <strong>private generation almost entirely removes this risk</strong>. Users can experiment with ideas they would never publish, create characters closely connected to their personal experiences, or revisit the same situation repeatedly without having to justify themselves. This space can have genuine value, functioning as <strong>a creative laboratory, a narrative diary, or a means of personal exploration</strong>, free from the immediate judgment of an audience. Nor is private creation itself the problem. Diaries, unpublished stories, home recordings, and personal notebooks have always existed. <strong>What is new is the possibility of obtaining enormous quantities of complete, personalized, immediately consumable content</strong>, without necessarily developing a relationship with other authors, readers, or communities.</p><h4>1.4. Romanticism and the Artist Who Creates for Themselves</h4><p>There is, however, an interesting historical precedent for this kind of private creativity in <strong>Romanticism, which emerged in the late eighteenth and early nineteenth centuries</strong>. During this period, an understanding of the artist took shape in which creating art became, above all, a way of searching for oneself. In the Romantic ideal, <strong>artistic creation does not necessarily arise from a desire to reach an audience, gain recognition, or satisfy collective tastes, but from an authentic, autonomous inner necessity</strong> that finds its expression through art. The image of Beethoven composing in solitude captures this conception particularly well. The artist creates because they feel compelled to do so, regardless of whether anyone will listen to, understand, or appreciate the result. From this perspective, success can become almost an accident along the way, a possible consequence rather than the reason for creating in the first place.</p><p>Yet there is a significant difference between this ideal and generative solipsism: <strong>the Romantic artist searches within themselves to express something that emerges from their inner life, while today’s solipsistic creator can use AI to obtain something that corresponds precisely to their desires</strong>. In the first case, the work emerges from a process of personal exploration and artistic development. In the second, it may result from a process of generation, selection, and consumption. Above all, <strong>the Romantic artist can create independently of the audience’s judgment without ruling out the possibility of eventually encountering that audience</strong>. Having found their own voice, they can offer it to others, accepting that it may be welcomed, misunderstood, or rejected. Creative solipsism introduces a further possibility: a work that never needs to leave the private sphere at all. The distinction, then, is not simply about creating for oneself, but about <strong>the difference between art that emerges without concern for an audience and art that can exist without even imagining one</strong>.</p><h4>1.5. When a Work No Longer Encounters Anyone Else</h4><p>Cultural works also create <strong>relationships between readers</strong>, allowing different people to engage with the same text. A novel can become the subject of a discussion, a school course, a book club, or an online community, bringing together people with different backgrounds to compare their interpretations. For this to happen, <strong>there must be a shared cultural object</strong>. <strong>Hyper-personalized fiction</strong>, on the other hand, risks producing texts with little social relevance, perfectly suited to the person who generated them but not necessarily interesting to anyone else. The paper describes the possibility of an <strong>atomization of fiction</strong>, in which each individual receives a personal stream of stories disconnected from everyone else’s. Instead of discussing the same work, <strong>each person inhabits a private library that nobody else knows exists</strong>. This resembles a transformation already visible in algorithmic feeds, but applied directly to the creation of cultural works: <strong>personalization reaches a new level by shaping the production of content itself</strong>, rather than merely deciding which existing works to recommend.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QDvVx3HPmVE_8LWBtypdYA.png" /></figure><p>Reading has always been something we can do alone, but <strong>solitude and solipsism are not the same thing</strong>. Someone reading alone in their room may still be connected to the author, to other readers, and to a literary tradition stretching back thousands of years. The solipsistic reader gradually reduces those relationships, consuming a text constructed according to their own instructions, revised to match their preferences, and intended for no one else. The question, therefore, is not whether reading alone is harmful, but what happens when the entire creative process is organized so that <strong>a person no longer needs to encounter tastes, ideas, or decisions they did not choose</strong>. An extremely accommodating model could <strong>turn culture into a frictionless environment</strong>, and <strong>when friction disappears, so do some of the opportunities for surprise, confrontation, and personal transformation that come from encountering something genuinely external to ourselves</strong>.</p><h3>2. Musical Solipsism: When Creator and Listener Become One</h3><p>The concept proposed in the paper can be extended beyond fiction. <strong>AI music generation platforms, such as Suno, allow users to describe the music they want and obtain a complete song in seconds</strong>. These compositions can then be extended, transformed, slowed down, trimmed, or regenerated through various remixing and editing tools. On Suno, for example, <strong>generated tracks are not automatically made public. They remain accessible through a link until the user decides to publish them</strong>. It therefore becomes possible to create an entire personal discography intended exclusively for private listening. This gives rise to a new figure, <strong>the solipsistic listener-composer</strong>, someone who <strong>generates music solely to listen to it in private</strong>, without publishing it, sending it to friends, or playing it for another human being.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J4LmRjOOdy7wTj72JZn2wA.png" /></figure><p>Traditional music production involves several roles (composer, lyricist, musician, singer, producer, sound engineer, and listener), and one person can certainly fulfill more than one of them, as in the case of a singer-songwriter who writes, performs, sings, and produces their own music. With AI-powered music generation tools, however, these distinctions can collapse even further: <strong>the user does not necessarily need to perform the song, record it, or complete its arrangement</strong>. They can specify the subject, genre, voice, atmosphere, and instrumentation, then listen to the result a few seconds later. <strong>Music, in this case, is no longer created to be communicated to others, but to be consumed by the very person who requested it</strong>, in a loop involving <strong>emotional state, musical prompt, generation, listening, and regeneration</strong>.</p><p>People have always sung alone, improvised at the piano, written songs that were never released, and recorded demos that remained tucked away in a drawer. Making music purely for oneself is therefore nothing new. <strong>The real discontinuity lies in speed, quantity, and the level of polish</strong>. In the past, producing a complete song required at least some combination of musical skill, instruments, time, and technical ability. Today, someone can <strong>generate an entire private discography without knowing how to sing, play an instrument, or produce music</strong>. The historical novelty lies in the possibility of becoming <strong>the sole recipient of a potentially endless stream of complete songs</strong>, generated on demand to satisfy a specific personal need. Someone might create a song about a childhood memory or an encounter that took place many years earlier, giving that experience a significance no outside listener could fully understand. They might even set an alternative version of their own life to music, imagining something that never happened but still carries emotional weight.</p><p>Such a song might hold little value for an outside audience, yet it could possess <strong>considerable emotional power</strong> for the person who requested it. <strong>Instead of searching for an existing song that expresses their experience, the user commissions one built directly around it</strong>. At least temporarily, the world’s music catalog gives way to <strong>a custom-generated personal soundtrack</strong>.</p><h4>2.1. The Song That Is Never Quite Finished</h4><p>Alongside the <em>infinite story demanders</em>, we can imagine a corresponding category of <strong>infinite song demanders</strong>, users who continually <strong>pursue an ideal version of the same song</strong>. Perhaps they finally obtain the perfect voice, but the chorus does not quite work. They regenerate the track and get a better arrangement, only to lose the very vocal quality they had appreciated. The process can continue indefinitely because each result seems to move closer to the desired song without ever fully matching it.</p><p>Suno’s <strong>extension, prompt reuse, and remix features</strong> make this iterative process technically straightforward, and the definitive version may never arrive. In this case, <strong>the pleasure shifts from completing a song to exploring its possible versions</strong>. Every generation becomes an alternative form of a song that exists only as an idea in the user’s mind.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xqqoWQ9iTHcQwOfpkJtXQA.png" /></figure><p>The concept of <strong>re-rolling</strong> can also be applied to music. One generation produces an interesting voice but a weak chorus. The next offers a better arrangement but a disappointing ending. A third unexpectedly delivers a remarkable passage, and the user continues until a satisfying configuration appears. Rather than composing every note directly, they <strong>explore a probabilistic space of possible songs</strong> and select those that come closest to what they want. <strong>Music creation becomes a form of search</strong>: while a traditional musician constructs a piece, the generative listener-composer navigates the variations produced by the model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_4BGOuPYctTelgFw5Nvd-g.png" /></figure><p>Music is already used to shape or accompany our emotional states. We listen to particular songs to concentrate, relax, remember, exercise, or intensify a feeling. Generative music can make this process even more precise. Someone can request <strong>a song that matches their emotional state at that exact moment</strong>, incorporating personal references and highly specific musical characteristics. Instead of waiting for an artist to express that emotion, they can generate a musical response to it directly. The song thus becomes a <strong>personal emotional device</strong>, perhaps listened to only once and then forgotten, an <strong>ephemeral piece of content created to satisfy a temporary need</strong>.</p><h4>2.2. An Album Made for a Single Listener</h4><p>Suno makes it possible to imagine something that would once have been far more difficult, both technically and economically: <strong>a complete album intended for a single listener</strong>. Not an unsuccessful album, but <strong>an album deliberately never released</strong>. Ten, a hundred, or a thousand <strong>songs can remain in the user’s private library, never reviewed by a critic, never measured by a streaming platform, and never even known to exist by their friends</strong>. This archive does not necessarily represent an unfinished artistic career. <strong>It may already have fulfilled its purpose entirely, because its only goal was to accompany the person who generated it</strong>. We are accustomed to thinking of an unheard song as a failed song, but in musical solipsism, <strong>a song heard by only one person may have fulfilled its purpose perfectly</strong>.</p><p>An audience inevitably brings judgment. Musicians who release their work must contend with outside tastes, technical standards, artistic traditions, and cultural expectations. <strong>Private AI-generated music removes that confrontation</strong>. The song does not have to be innovative or stand out among thousands of other productions. It does not need to convince a record label, a playlist curator, or a group of listeners. It only needs to please its sole recipient. <strong>This freedom, however, also carries the risk of impoverishing creativity</strong>, because it is often through engagement with listeners that <strong>new perspectives emerge</strong>, prompting artists to reconsider their decisions and sometimes improve their work. Without any outside listener, <strong>music risks becoming an increasingly faithful mirror, but an increasingly less surprising one</strong>.</p><p>Streaming had already transformed music into an <strong>almost unlimited catalog</strong>. With generative models, <strong>production itself becomes potentially inexhaustible</strong>. When one song ends, the listener can immediately request another with similar characteristics. There is no longer any need to replay the same recording when it is possible to listen to <strong>a succession of new songs that evoke the same feeling</strong>. <strong>Repetition no longer depends on replaying an identical recording, but on a family of variations</strong>, the musical equivalent of multiform stories, in which the same emotional promise remains while melody, voice, lyrics, and arrangement change slightly.</p><p>Calling this practice solipsistic does not necessarily mean condemning it. Generating music for oneself can be a form of play, <strong>an audio diary</strong>, a way of <strong>turning memories into songs</strong>, an opportunity to experiment with unfamiliar genres, a source of inspiration, a relaxing activity, or a first step toward creating something that will eventually be shared with an audience. The most interesting aspect is the <strong>changing function of art</strong>: <strong>creativity no longer has to culminate in publication, but can find its fulfillment in the personal experience of generation itself</strong>. Someone might spend an entire afternoon generating songs, adjusting arrangements, and listening to different versions without saving a single one. That afternoon would not necessarily have been wasted, because <strong>the goal may already have been achieved through the creative experience itself</strong>. The final product is not always the song saved on a hard drive. <strong>Sometimes the real product is the time spent creating and listening to it</strong>.</p><h3>3. From Mass Culture to a Culture of One</h3><p>Mass culture produces works for millions of people. Digital niches produce works for smaller communities. Generative AI makes <strong>a culture intended for a single individual</strong> economically and technically possible. We are moving beyond personalized recommendations toward <strong>personal novels, personal songs, personal images, personal videos, personal characters, and personal fictional worlds</strong>. Each user can inhabit a cultural ecosystem that nobody else ever sees. The risk is <strong>a society made up of billions of private creative universes</strong>, perfectly aligned with individual desires but lacking shared works through which people can recognize one another, discuss ideas, or even argue. <strong>Culture could become more abundant while becoming less shared</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UUgIBlQCyLSWTF4Mxd1TwA.png" /></figure><p><strong>Works of art can function as mirrors or as windows</strong>. A mirror allows us to recognize ourselves, while a window shows us something we did not know. <strong>Solipsistic generation naturally tends toward the mirror</strong>, because it begins with our instructions, responds to our preferences, and adjusts itself according to our reactions. This does not mean that it cannot surprise us. The model’s randomness can introduce unexpected details, unfamiliar melodies, or interesting narrative developments. The question is how long those surprises can remain genuinely foreign to us when we can eliminate them with a simple regeneration. <strong>A human work can tell us something we did not want to hear, while a work generated on demand risks telling us exactly what we want to hear</strong>.</p><p>Creative solipsism does not necessarily imply the disappearance of public culture. <strong>The two forms can coexist</strong>. Someone can <em>generate private stories and continue reading novels</em>, or <em>create an entire personal discography without giving up the pleasure of attending a concert</em>. <strong>AI can become an individual creative laboratory</strong>, a space for free experimentation in which people choose to share only the works they believe may have something meaningful to communicate to others.</p><p><strong>The most profound change may be invisible</strong>. We will not see the unpublished stories, the albums never shared, or the fictional universes consumed by a single person. They will not appear in charts, cultural archives, or online discussions, yet <strong>they could occupy an increasingly large share of the time people devote to reading, writing, and listening</strong>.</p><p>The paper <em>AI Fiction in the Wild</em> offers a glimpse of this transformation through real user conversations. It describes more than new writing tools. It points to <strong>a new relationship between human beings and cultural production</strong>. Today, we can obtain complete works with unprecedented ease without necessarily imagining an audience. We can <strong>become the commissioner, creator, consumer, and sole keeper of what has been produced, all at once</strong>. This brings to mind a familiar philosophical thought experiment: <em>if a tree falls in a forest and no one is there to hear it, does it make a sound?</em> In our case, there is someone listening, but that person is also the one who wanted the work to exist in the first place. The question, then, is not simply whether AI-generated works qualify as art. The more radical question is this: <strong>can art exist when no other human being will ever know that the work existed at all?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*gC3RDOEldg8SukcM.jpg" /></figure><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/11/12/larte-senza-pubblico-il-solipsismo-creativo-nellera-dellai-dalla-narrativa-alla-musica/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35ad756c7660" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ChatGPT Export Resumer: How I Recovered 4 GB of Data from an Incomplete ZIP Export with curl and…]]></title>
            <link>https://levysoft.medium.com/chatgpt-export-resumer-how-i-recovered-4-gb-of-data-from-an-incomplete-zip-export-with-curl-and-7bf3448c3eaa?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/7bf3448c3eaa</guid>
            <category><![CDATA[backup]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[zip]]></category>
            <category><![CDATA[chatgpt]]></category>
            <category><![CDATA[curl]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Sun, 08 Nov 2026 15:35:57 GMT</pubDate>
            <atom:updated>2026-11-08T15:35:57.431Z</atom:updated>
            <content:encoded><![CDATA[<h3>ChatGPT Export Resumer: How I Recovered 4 GB of Data from an Incomplete ZIP Export with curl and Python</h3><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*2zx-VNdSjz-3fiQXh--ewQ.jpeg" /></figure><p>It all started with a simple need: I wanted to export my ChatGPT conversation history. Just a personal backup, nothing particularly unusual. I’ve had a habit of keeping local copies of my conversations for quite some time, so I can browse and search them with <a href="https://github.com/levysoft/llm-chat-explorer">LLM Chat Explorer</a>, a tool I developed to navigate ChatGPT and Claude exports directly in the browser, or estimate my monthly token costs with <a href="https://github.com/levysoft/chatgpt-token-cost-analysis">ChatGPT Token Cost Analysis</a>.</p><p>The ability to export our data is also a result of personal data protection laws. The GDPR, which has applied since 2018, introduced the right to data portability under Article 20. Under certain conditions, this allows individuals to receive their personal data in a structured, machine-readable format. The regulation has helped make data export tools more widespread, including on major international digital platforms. In short, there’s a little bit of Brussels behind that “Download your data” button.</p><p>Before getting to the technical problem, though, I have to admit something: I wasted time just trying to initiate the export correctly. That isn’t the main focus of this article, but since even this seemingly straightforward step gave me trouble, I’ll first share a quick walkthrough of the process and where it can go wrong. <strong>If you already have the ZIP file, you can skip straight to the next section.</strong></p><p><strong><em>Note:</em></strong><em> This article was originally written in Italian, so some screenshots show the Italian version of the ChatGPT interface. I apologize for any inconvenience. I’ve made every effort to describe each step clearly and accurately in the text, including the relevant menu options, buttons, and procedures, so you can follow along regardless of your interface language.</em></p><h3>ChatGPT’s Data Export Flow: An Almost Perfect Anti-Pattern</h3><p>First, a clarification: the behavior described in this section is what I observed during the tests I carried out when writing the article. ChatGPT’s interface is updated frequently, so it may already have changed by the time you read this. I hope this flow will be improved, with clearer verification steps and, above all, an explicit confirmation when an export request has actually been submitted.</p><p>You can access ChatGPT’s data export settings here: <a href="https://chatgpt.com/#settings/DataControls">https://chatgpt.com/#settings/DataControls</a></p><p>Start by going to <strong>Profile &gt; Settings</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*ho-ZVGjesc8sAjOW.png" /></figure><p>Then select <strong>Data Controls</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*UYdYbjyXrFw_az_M.png" /></figure><p>So far, so good. Click <strong>Export</strong>, and a confirmation dialog appears with details about the process:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*6EyVsCC9HcoA4MZM.png" /></figure><p>The dialog is clear enough: the export will include account details and conversations, an email will be sent to the address associated with the account, the download link will expire after 24 hours, and processing may take some time. All perfectly reasonable so far.</p><p>Click <strong>Confirm export</strong>, and this is where the anti-pattern begins.</p><p>Instead of returning to the settings screen with a confirmation message, ChatGPT redirects you to an identity verification screen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*ksrhP9vpO3OPBpdD.png" /></figure><p>You have to open your inbox and find the email from OpenAI containing a temporary six-digit verification code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*FJ4DND08AZB4kFjE.png" /></figure><p>Copy the code, return to the browser, and enter it:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*HqpHk6VEpWYnHkoP.png" /></figure><p>To be clear, identity verification itself isn’t the problem. It makes sense: an export can contain sensitive personal data, so asking for an email confirmation is reasonable. The problem is what happens next.</p><p>After entering the code and clicking <strong>Continue</strong>, the browser doesn’t return to the export confirmation dialog or display any obvious notification. It takes you back to the same settings screen as before, as though nothing significant had happened.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*8lcKgTrcQ3L736_C.png" /></figure><p>There’s no banner, no message saying “Export request submitted successfully.” The interface simply looks as though it’s waiting. This is where I got lost the first time. And probably the second time, too. Looking at that silent screen, the natural assumption is: “Maybe the request went through, and I’ll get an email.” So I waited a day for some kind of confirmation. Nothing arrived. I started over: clicked Export, confirmed in the dialog, went through identity verification, entered the code, and landed right back on the settings screen. Then I waited again. Still no download email.</p><p>On my third attempt, I started wondering whether I needed to click <strong>Export</strong> again. But since some time had already passed since the first verification code was requested (something I only figured out afterward), the process started from scratch. I clicked Export, selected Confirm export in the dialog, and reached the identity verification screen. I entered the new code that had just arrived (those emails do show up almost immediately). This time, instead of returning to Settings, I was taken straight back to the <strong>Confirm export</strong> dialog.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*4NXPO7-q_ofUCHxl.png" /></figure><p>That inconsistency made me suspect the interface’s behavior might depend on how quickly the verification was completed. When I entered the code promptly, the browser returned to the export confirmation dialog. When I took longer, sometimes less than a minute in my case, it sent me back to Settings instead. I can’t say for certain whether this was caused by the code expiring, the verification session, or some other internal ChatGPT mechanism, but the difference in behavior was unmistakable.</p><p>I clicked Confirm export in the dialog and, finally, a green notification appeared at the top of the page: <strong>“Data export request submitted successfully. You will receive an email with the details.”</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*vJ3UZOqIemdnLnPc.png" /></figure><p>That was the message I should have seen from the beginning.</p><p>And in the meantime, that long-awaited confirmation email finally arrived:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*dRSTceb0xi-pvUC-.png" /></figure><p>I call this flow an <strong>anti-pattern</strong> for several reasons: the lack of clear feedback after identity verification, the need to confirm the same operation twice, and the interface’s unpredictable behavior. In my case, completing verification quickly brought me back to the confirmation dialog, whereas other attempts sent me straight to Settings without indicating the request’s status. With no countdown timer or explicit error message, it wasn’t even clear whether the problem was an expired code or some other condition in the process. The result is an experience that leaves users uncertain precisely when they should receive an unambiguous confirmation.</p><p>For anyone who wants to avoid wasting time the way I did, here’s the complete procedure I observed:</p><ol><li>Go to <a href="https://chatgpt.com/#settings/DataControls">Profile &gt; Settings &gt; Data Controls</a>.</li><li>Click <strong>Export</strong>.</li><li>Read the confirmation dialog and click <strong>Confirm export</strong>.</li><li>Check your inbox right away for a temporary verification code from OpenAI.</li><li>Enter the code and click <strong>Continue</strong> without delaying.</li><li>In the flow I observed, the <strong>Confirm export</strong> dialog appeared again after verification.</li><li>Click <strong>Confirm export</strong> a second time.</li><li>Wait for the green confirmation banner at the top of the page.</li><li>Once the export is ready, you’ll receive an email with the ZIP download link. Processing can <a href="https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data">take up to seven days</a>, and the download link expires 24 hours after you receive it.</li></ol><p>Before assuming the process is complete, it’s therefore important to check that ChatGPT actually displays the export confirmation message.</p><h3>The Initial Problem: The ZIP Wouldn’t Open</h3><p>Once I received the email containing the download link and downloaded the file,</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*kzo4jAui6vnQQQdC.png" /></figure><p>my Mac refused to open it. macOS’s built-in Archive Utility displayed a generic error with no explanation. I suspected an interrupted download, so I downloaded the file again, but with no luck.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*csFLW2my6pxiWGKw.png" /></figure><p>I also tried extracting it with BetterZip, which can usually handle nonstandard or partially downloaded archives. Although I could see the contents, I still couldn’t extract the files.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*fRzAdKKTSLdtXf1k.png" /></figure><p>At that point, I brought out a Windows PC, downloaded the file there, and tried opening it with File Explorer and then 7-Zip. The result was exactly the same on Windows.</p><p>So the problem didn’t seem to be specific to my Mac. The ZIP might have been corrupted at the source or downloaded incompletely. Yet the browser appeared to complete the download, and each attempt seemed to produce a file of the same size.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*lwlR1Yg37tV4yXeV.png" /></figure><p>OpenAI explains that export links expire after 24 hours and that the download should produce a ZIP containing conversation history and other account data. So I decided to inspect the file more closely.</p><p>The unzip test failed:</p><pre>unzip -t chatgpt-export.zip</pre><p>With this error:</p><pre>Archive: chatgpt-export.zip<br>  End-of-central-directory signature not found. Either this file is not<br>  a zipfile, or it constitutes one disk of a multi-part archive.<br>unzip: cannot find zipfile directory in one of chatgpt-export.zip or<br>  chatgpt-export.zip.zip, and cannot find chatgpt-export.zip.ZIP, period.</pre><p>The file command, however, recognized it as a ZIP archive:</p><pre>file chatgpt-export.zip</pre><p>Output:</p><pre>chatgpt-export.zip: Zip archive data, at least v2.0 to extract, compression method=deflate</pre><p>So the file really <strong>did start</strong> like a ZIP. But attempting to extract it produced this error:</p><pre>End-of-central-directory signature not found.</pre><p>In fact, <strong>a ZIP file can have a valid header at the beginning without being complete</strong>. A ZIP’s central directory, the index that tells extraction tools where to find the files inside, is located near the end of the archive. If that ending is missing, file may still identify the ZIP, but unzip won&#39;t be able to open it. So while it initially looked like a corrupted ZIP, in my case <strong>the ZIP was actually incomplete</strong>. The download had stopped before the end of the file, leaving out the section containing the central directory.</p><h3>First Attempt: Downloading the Link with curl</h3><p>I tried copying the export URL from the email OpenAI had sent me</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*il-5xQsXji8a7OVM.png" /></figure><p>and storing it in a terminal variable:</p><pre>URL=&#39;FULL_EXPORT_LINK_HERE&#39;</pre><p>Then I tried a standard download:</p><pre>curl -L \<br>  --fail \<br>  --show-error \<br>  --progress-bar \<br>  --retry 5 \<br>  --retry-delay 2 \<br>  --retry-all-errors \<br>  -o chatgpt-export.zip \<br>  &quot;$URL&quot;</pre><p>The result was:</p><pre>curl: (56) The requested URL returned error: 403</pre><p>The server had refused access to the archive, preventing the download. I still needed to find out whether the problem was an expired link, an unauthenticated session, or some server-side protection mechanism.</p><h3>Diagnosing the 403: curl Was Receiving an HTML Page, Not the ZIP</h3><p>To understand what was happening, I saved the response headers and body:</p><pre>curl -L \<br>  --show-error \<br>  --verbose \<br>  -D headers-403.txt \<br>  -o body-403.txt \<br>  -w &quot;\nHTTP_CODE: %{http_code}\nCONTENT_TYPE: %{content_type}\nSIZE_DOWNLOAD: %{size_download}\nFINAL_URL: %{url_effective}\nTIME_TOTAL: %{time_total}\n&quot; \<br>  &quot;$URL&quot; 2&gt;curl-debug.log | tee curl-result.txt</pre><p>Result:</p><pre>HTTP_CODE: 403<br>CONTENT_TYPE: text/html; charset=UTF-8<br>FINAL_URL: https://chatgpt.com/auth/login?next=...</pre><p>The response headers also contained:</p><pre>cf-mitigated: challenge</pre><p>So the terminal wasn’t receiving the ZIP. It was receiving an HTML login or security-challenge page instead.</p><p>The reason was that the browser I had used to download the file was already authenticated, while curl wasn&#39;t.</p><h3>The Solution: Chrome’s Copy as cURL Feature</h3><p>The breakthrough came when I used the browser’s already authenticated request. Here’s the procedure I followed:</p><ol><li>Open Chrome. Other browsers with developer tools, such as Safari or Firefox, can also work, but I’ll use Google’s browser for this walkthrough.</li><li>Copy the export link from the email.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*6b74-CeekZeDxpGw.png" /></figure><ol><li>Open <strong>Chrome DevTools</strong> by right-clicking the page and selecting <strong>Inspect</strong>, or press Cmd + Option + I on a Mac (F12 on Windows/Linux).</li><li>Switch to the <strong>Network</strong> tab.</li><li>Enable <strong>Preserve log</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*TXbVX2Q9Ik70LsTQ.png" /></figure><ol><li>Paste the export link into the browser’s address bar. I suggest doing this rather than clicking the link directly in the email, so you can inspect the request in the DevTools tab you’ve opened.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*JeK-UHq-wCJ0a62B.png" /></figure><ol><li>While the download is in progress,</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*2Ttm3IDeWFR_mGMP.png" /></figure><p>look in the <strong>Network</strong> tab for the request beginning with content?id=..., which corresponds to the ZIP download.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*dOtGutEVnTy1h143.png" /></figure><p>The address should have a structure similar to this:</p><pre>https://chatgpt.com/backend-api/estuary/content?id=EXPORT_IDENTIFIER.zip&amp;ts=...&amp;sig=...</pre><p>This is only an illustrative URL. The real address can contain identifiers and signed parameters that authorize access to the exported file. <strong>Do not publish or share the complete URL</strong>, your session cookies, or the original contents of chrome-curl.txt.</p><ol><li>Right-click the request and select <strong>Copy &gt; Copy as cURL</strong>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*Jye-5ddfEyXrUhcI.png" /></figure><pre>Copy &gt; Copy as cURL</pre><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*2oCkBLRX2QKHZv0h.png" /></figure><ol><li>Save the copied command in a file named:</li></ol><pre>chrome-curl.txt</pre><p>This file contains the browser’s <strong>headers, User-Agent, and cookies</strong>.</p><ol><li>If the browser download keeps stopping, you can cancel it to avoid wasting bandwidth and continue with the terminal-based procedure.</li></ol><h3>The Next Problem: The Cookie Header Was Too Large</h3><p>The command copied from Chrome contained a huge cookie header, including many conv_key_* cookies, session tokens, Cloudflare cookies, and other auxiliary cookies.</p><p>When I tried running that command, curl reported:</p><pre>Warning: skipped provided cookie, the cookie header would go over 8200 bytes</pre><p>In other words, Chrome had copied too many cookies. curl was warning me that the cookie header exceeded roughly <strong>8,200 bytes</strong>, so some cookies were being skipped. That meant there was no guarantee the ones needed to authenticate the download would be retained.</p><p>The solution was to reduce the cookie list to the minimum needed for the session, authentication, and security challenge. Otherwise, curl would run into its cookie-header size limit. The main culprits in my command were cookies whose names began with:</p><pre>conv_key_...</pre><p>There were lots of them, and they weren’t needed to download the export. They were associated with conversations rather than the ZIP download. So, from the -b &#39;...&#39; block, I kept cookies with names such as:</p><pre>__Secure-next-auth.session-token.0<br>__Secure-next-auth.session-token.1<br>cf_clearance<br>__cf_bm<br>__cflb<br>_cfuvid<br>_puid<br>oai-sc<br>oai-chat-web-route<br>oai-hlib<br>oai-did</pre><p>And I removed cookies such as:</p><pre>conv_key_...<br>_dd_s<br>oai-last-model-config<br>oai_consent_analytics<br>oai_consent_marketing<br>oai-client-auth-info<br>oai-nav-state<br>_account_is_fedramp<br>__Secure-next-auth.callback-url<br>__Host-next-auth.csrf-token</pre><p>To automate the cleanup, I wrote a small helper script to filter out those cookies.</p><pre>python3 - &lt;&lt;&#39;PY&#39; &gt; cookies-minimi.txt<br>import re<br>from pathlib import Path<br><br>raw = Path(&quot;chrome-curl.txt&quot;).read_text()<br><br>m = re.search(r&quot;-b &#39;([^&#39;]*)&#39;&quot;, raw, re.S)<br>if not m:<br>    raise SystemExit(&quot;Non trovo il blocco -b &#39;cookie...&#39; nel file chrome-curl.txt&quot;)<br><br>cookie_string = m.group(1)<br>cookies = [c.strip() for c in cookie_string.split(&quot;;&quot;) if c.strip()]<br><br>keep_names = {<br>    &quot;cf_clearance&quot;,<br>    &quot;__cf_bm&quot;,<br>    &quot;__cflb&quot;,<br>    &quot;_cfuvid&quot;,<br>    &quot;_puid&quot;,<br>    &quot;oai-sc&quot;,<br>    &quot;oai-chat-web-route&quot;,<br>    &quot;oai-hlib&quot;,<br>    &quot;oai-did&quot;,<br>}<br><br>kept = []<br><br>for c in cookies:<br>    name = c.split(&quot;=&quot;, 1)[0]<br>    if name.startswith(&quot;__Secure-next-auth.session-token.&quot;):<br>        kept.append(c)<br>    elif name in keep_names:<br>        kept.append(c)<br><br>result = &quot;; &quot;.join(kept)<br>print(result)<br>print(f&quot;Lunghezza cookie: {len(result)} byte&quot;, file=__import__(&quot;sys&quot;).stderr)<br>PY</pre><p>Using the reduced cookie set, I was able to retry the download.</p><pre>URL=&#39;https://chatgpt.com/backend-api/estuary/content?id=7195b6403177abe249c69d5d1d4fa8bf5bc9d98264d6c04ea26a847a7848b395-2026-06-11-13-13-43-d92944da4f4349fdaadb6b1fa6939925.zip&amp;ts=494796&amp;p=de&amp;cid=2&amp;sig=0ed610cd9f754acdb66cc40542727c4891d944fe7ae7df6c9d877fb31a373e25&amp;v=0&#39;<br><br>COOKIES=&quot;$(cat cookies-minimi.txt)&quot;<br><br>curl &quot;$URL&quot; \<br>  -L \<br>  --compressed \<br>  --show-error \<br>  --progress-bar \<br>  -H &quot;cookie: $COOKIES&quot; \<br>  -H &#39;accept: application/zip,application/octet-stream,*/*&#39; \<br>  -H &#39;referer: https://chatgpt.com/&#39; \<br>  -H &#39;user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36&#39; \<br>  -D headers-download.txt \<br>  -o chatgpt-export.zip \<br>  -w &quot;\nHTTP_CODE: %{http_code}\nCONTENT_TYPE: %{content_type}\nSIZE_DOWNLOAD: %{size_download}\nFINAL_URL: %{url_effective}\nTIME_TOTAL: %{time_total}\n&quot; | tee result-download.txt</pre><p>At that point authentication worked: curl returned HTTP 200 with a content type of application/octet-stream. This time I was actually downloading a ZIP archive, not an HTML login or verification page. Unfortunately, the file was still unusable when the download finished.</p><pre>ls -lh chatgpt-export.zip<br>-rw-r--r--@ 1 antonio staff 2,1G 12 giu 22:02 chatgpt-export.zip<br><br>file chatgpt-export.zip<br>chatgpt-export.zip: Zip archive data, at least v2.0 to extract, compression method=deflate <br><br>unzip -t chatgpt-export.zip<br>Archive: chatgpt-export.zip <br>  End-of-central-directory signature not found. Either this file is not <br>  a zipfile, or it constitutes one disk of a multi-part archive. <br>  In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. <br>  unzip: cannot find zipfile directory in one of chatgpt-export.zip or chatgpt-export.zip.zip, and cannot find chatgpt-export.zip.ZIP, period. </pre><p>I then checked the file size and HTTP headers.</p><pre>stat -f &quot;Dimensione locale: %z byte&quot; chatgpt-export.zip<br>Dimensione locale: 2214592512 byte<br><br>echo<br>echo &quot;Header utili:&quot;<br>grep -Ei &#39;HTTP/|content-length|content-range|accept-ranges|content-type|content-encoding|etag|last-modified|x-oai-request-id|cf-ray&#39; headers-download.txt<br><br>Header utili: HTTP/2 200 content-type: application/octet-stream last-modified: Thu, 11 Jun 2026 13:17:07 GMT accept-ranges: bytes etag: &quot;0x8DEC7BBBCE6CD38&quot; x-oai-request-id: df851987-ebe8-4167-9faf-5bca95c913e0 x-content-type-options: nosniff cf-ray: a0ab6edbae75eda3-MXP</pre><p>To investigate further, I searched the last 20 MB of the file for the signatures normally found near the end of a ZIP archive.</p><pre>python3 - &lt;&lt;&#39;PY&#39;<br>from pathlib import Path<br><br>p = Path(&quot;chatgpt-export.zip&quot;)<br>data = p.read_bytes()[-20_000_000:]<br><br>signatures = {<br>    b&quot;PK\x05\x06&quot;: &quot;EOCD normale&quot;,<br>    b&quot;PK\x06\x06&quot;: &quot;EOCD ZIP64&quot;,<br>    b&quot;PK\x06\x07&quot;: &quot;ZIP64 locator&quot;,<br>}<br><br>print(f&quot;Dimensione file: {p.stat().st_size} byte&quot;)<br><br>for sig, name in signatures.items():<br>    pos = data.rfind(sig)<br>    if pos &gt;= 0:<br>        absolute = p.stat().st_size - len(data) + pos<br>        print(f&quot;Trovata firma {name} a offset {absolute}&quot;)<br>    else:<br>        print(f&quot;Firma {name} NON trovata negli ultimi 20 MB&quot;)<br>PY<br><br>Dimensione file: 2214592512 byte Firma EOCD normale NON trovata negli ultimi 20 MB Firma EOCD ZIP64 NON trovata negli ultimi 20 MB Firma ZIP64 locator NON trovata negli ultimi 20 MB </pre><p>The check found <strong>neither the standard EOCD signature nor the ZIP64 signatures within the last 20 MB</strong>. Combined with the error from unzip, this strengthened the hypothesis that the download had stopped before the archive was complete.</p><p>Rather than starting over from zero, I decided to try resuming the download from where it had stopped. Since I already had COOKIES and URL available, I used curl again, this time with the -C - option.</p><pre>COOKIES=&quot;$(cat cookies-minimi.txt)&quot;<br><br>curl &quot;$URL&quot; \<br>  -L \<br>  -C - \<br>  --show-error \<br>  --progress-bar \<br>  --retry 5 \<br>  --retry-delay 2 \<br>  --retry-all-errors \<br>  -H &quot;cookie: $COOKIES&quot; \<br>  -H &#39;accept: application/zip,application/octet-stream,*/*&#39; \<br>  -H &#39;referer: https://chatgpt.com/&#39; \<br>  -H &#39;user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36&#39; \<br>  -D headers-resume.txt \<br>  -o chatgpt-export.zip \<br>  -w &quot;\nHTTP_CODE: %{http_code}\nCONTENT_TYPE: %{content_type}\nSIZE_DOWNLOAD: %{size_download}\nFINAL_URL: %{url_effective}\nTIME_TOTAL: %{time_total}\n&quot; | tee result-resume.txt<br><br>  HTTP_CODE: 206 <br>  CONTENT_TYPE: application/octet-stream <br>  SIZE_DOWNLOAD: 2005844189 <br>  FINAL_URL: https://chatgpt.com/backend-api/estuary/content?id=7195b6403177abe249c69d5d1d4fa8bf5bc9d98264d6c04ea26a847a7848b395-2026-06-11-13-13-43-d92944da4f4349fdaadb6b1fa6939925.zip&amp;ts=494796&amp;p=de&amp;cid=2&amp;sig=0ed610cd9f754acdb66cc40542727c4891d944fe7ae7df6c9d877fb31a373e25&amp;v=0<br>  TIME_TOTAL: 182.905019</pre><p>Fortunately, the server supported resuming downloads, as confirmed by curl&#39;s output:</p><pre>HTTP_CODE: 206<br>SIZE_DOWNLOAD: 2005844189</pre><p>206 means <strong>Partial Content</strong>: the server accepted the resume request and sent only the remaining data. Initially, I had:</p><pre>2214592512 bytes</pre><p>It then added:</p><pre>2005844189 bytes</pre><p>The final total was:</p><pre>4220436701 bytes</pre><p>That’s approximately <strong>4.22 GB</strong> in decimal units, or <strong>3.93 GiB</strong>.</p><p>Finally, I checked the archive’s integrity with:</p><pre>unzip -t chatgpt-export.zip</pre><pre>stat -f &quot;Dimensione finale: %z byte&quot; chatgpt-export.zip<br>Dimensione finale: 4220436701 byte<br><br>file chatgpt-export.zip<br>chatgpt-export.zip: Zip archive data, at least v2.0 to extract, compression method=deflate<br><br>unzip -t chatgpt-export.zip<br>Archive:  chatgpt-export.zip<br>    testing: chat.html                OK<br>    testing: conversation_asset_file_names.json   OK<br>    [...]<br>    testing: library_files.json       OK<br>    testing: message_feedback.json    OK<br>    testing: shared_conversations.json   OK<br>    testing: user.json                OK<br>    testing: user_settings.json       OK<br>    testing: export_manifest.json     OK<br>No errors detected in compressed data of chatgpt-export.zip.</pre><p>The command returned:</p><pre>No errors detected in compressed data of chatgpt-export.zip.</pre><p>That confirmed the ZIP was intact.</p><p>The real issue had been an interrupted download, resolved with curl -C -, which retrieved the missing portion of the file. In some tests, I even had to repeat the resume operation two or three times.</p><p>Of course, <strong>curl isn&#39;t the only tool that can resume an interrupted download</strong>. Graphical download managers such as <a href="https://jdownloader.org/jdownloader2">JDownloader 2</a> and <a href="https://www.freedownloadmanager.org/">Free Download Manager</a> are cross-platform, support resuming downloads, and can handle authenticated requests. However, when it comes to ChatGPT exports, compatibility with signed URLs and session cookies isn&#39;t necessarily guaranteed. <strong>I chose </strong><strong>curl because it&#39;s already available on macOS and let me reproduce the HTTP request copied from Chrome and control the transfer without installing additional software.</strong> It was a straightforward, reproducible solution that I could verify step by step.</p><h3>The Python Script: ChatGPT Export Resumer</h3><p>In short, I recovered the ZIP download by using:</p><ul><li>Chrome DevTools;</li><li>Copy as cURL;</li><li>a cleanup of the cookies copied from the browser;</li><li>curl -C - to resume the download.</li></ul><p>At that point, I decided to <strong>automate the process with a Python script</strong>, which I’ve <a href="https://github.com/levysoft/chatgpt-export-resumer">published on GitHub</a>:</p><pre>chatgpt_export_resumer.py</pre><p>The script starts with chrome-curl.txt, containing the command copied from Chrome, and performs the following tasks:</p><ul><li>Reads the <strong>Copy as cURL</strong> command and extracts the required URL and cookies.</li><li>Removes unnecessary cookies and prepares a temporary curl configuration.</li><li>Downloads the ZIP archive, checks its integrity, and automatically attempts to resume an incomplete download.</li><li>Generates a diagnostic report and optionally extracts the archive and opens chat.html.</li><li>Can delete temporary and sensitive files through the --cleanup option.</li></ul><h3>Why Did This Happen?</h3><p>Looking online, I found that I wasn’t alone. On <a href="https://www.reddit.com/r/OpenAI/comments/1m60arv/please_help_my_chatgpt_data_export_zip_is/">Reddit</a> and the official OpenAI community forum, several threads describe exactly the same issue: a download that appears complete in the browser, a ZIP file saved to disk, and an error when attempting to extract it. <a href="https://community.openai.com/t/chatgpt-data-export-zip-downloads-are-incomplete-corrupted-and-cannot-be-extracted/1383110">One user</a> documented downloading the same archive three times on macOS, using both Chrome and Safari, with the same outcome every time. That made a browser- or operating-system-specific problem less likely. The discussions appeared within a relatively recent period, which is consistent with the possibility that growing export sizes are causing more users to encounter these limits for the first time. A <a href="https://community.openai.com/t/unable-to-download-full-data-export-zip-corrupted-from-privacy-portal/1367660">second thread</a> on the OpenAI forum reports similar cases and reaches comparable conclusions.</p><p>I’d never experienced this problem with previous exports, which were much smaller, usually just a few hundred megabytes. The main difference in my case was therefore <strong>the size of the archive</strong>. It was no longer a package made up almost entirely of text, JSON conversations, and a handful of metadata files. It also contained numerous .dat files, asset references, files attached to conversations, and content associated with newer ChatGPT features. With modern usage, especially when images, attachments, or multimodal features are involved, an export can become far larger than a purely text-based archive. In my case, the final file <strong>exceeded 4 GB</strong>.</p><p>Testing on both macOS and Windows made a problem specific to one browser or operating system less likely. But I still needed to understand where the transfer was being interrupted. <strong>Possible causes included timeouts, network problems, or failures in intermediate delivery systems such as proxies, CDNs, and load balancers.</strong> An archive several gigabytes in size generally takes longer to transfer, increasing the chance of encountering interruptions or limits along the way. Without access to server-side logs, however, I couldn’t identify the responsible component with any certainty.</p><p>During debugging, I also encountered this header:</p><pre>cf-mitigated: challenge</pre><p>According to Cloudflare’s documentation, this header indicates that a response has been intercepted and replaced with a <strong>challenge</strong>, meaning an <strong>automated security check</strong> designed to distinguish legitimate users from bots, for example through a CAPTCHA or a browser check before allowing access to the requested resource. In that case, I wasn’t receiving the ZIP but an HTML login or verification page. This doesn’t automatically mean Cloudflare caused the truncated download, but it does confirm that the access path involved intermediate security checks that curl couldn&#39;t get past on its own without the browser&#39;s cookies.</p><h3>If You’re Still Having Problems</h3><p>The procedure described in this article worked for me and allowed me to recover an export of more than 4 GB in full. However, I can’t guarantee that it will work in every situation or that it will continue to work over time. ChatGPT is an evolving service, and changes to authentication, cookie management, or the way export archives are delivered could require changes to both the procedure and the Python script.</p><p>If the download continues to fail despite attempts to resume it, you can contact OpenAI Support and provide technical documentation of the issue. In its <a href="https://help.openai.com/en/articles/6614161-how-can-i-contact-support">support documentation</a>, OpenAI explains that a HAR file, which records the network requests made during a browser session, can be useful for diagnosing certain problems.</p><p>HAR stands for HTTP Archive. It’s a file with a .har extension that a browser can generate, containing network requests made during a session, including URLs, headers, responses, HTTP status codes, response times, and transferred file sizes. This is exactly the kind of information that can help demonstrate that a download ended before completion and that fewer bytes were received than expected. OpenAI&#39;s <a href="https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data">data export documentation</a> can also provide useful context for a support ticket. If you need help generating a HAR file, <a href="https://www.youtube.com/watch?v=y2yanWTNxGk">this video tutorial</a>, which isn&#39;t affiliated with OpenAI, walks through the process step by step.</p><p>One important warning: HAR files can contain session cookies, authentication tokens, and signed URLs. Before attaching a HAR file to a support ticket, even an official one, you should sanitize it by removing sensitive values. OpenAI explicitly recommends doing so.</p><h3>Conclusion</h3><p>What initially looked like a corrupted ZIP archive turned out to be an incomplete download. The beginning of the file was valid, but the central directory required to extract its contents was missing.</p><p>The solution was to reuse an authenticated request captured from Chrome and resume the transfer with curl -C -. The server responded with <strong>HTTP 206 Partial Content</strong>, allowing me to download the missing bytes and fully recover an archive of more than 4 GB.</p><p>To avoid having to repeat this procedure manually every time, I developed <a href="https://github.com/levysoft/chatgpt-export-resumer"><strong>ChatGPT Export Resumer</strong></a>, a Python script that automates downloading, resuming interrupted transfers, verifying ZIP integrity, and optionally extracting the archive.</p><p>The project is available on <a href="https://github.com/levysoft/chatgpt-export-resumer">GitHub</a>, along with the source code and complete documentation in English and Italian, including installation instructions, usage examples, and details of all available options.</p><h3>Useful Links</h3><ul><li>ChatGPT Export Resumer GitHub repository: <a href="https://github.com/levysoft/chatgpt-export-resumer">https://github.com/levysoft/chatgpt-export-resumer</a></li><li>OpenAI data export documentation: <a href="https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data">https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data</a></li><li>OpenAI support and HAR documentation: <a href="https://help.openai.com/en/articles/6614161-how-can-i-contact-support">https://help.openai.com/en/articles/6614161-how-can-i-contact-support</a></li></ul><p><em>Originally published at </em><a href="https://www.levysoft.it/archivio/2026/11/08/chatgpt-export-resumer-come-ho-recuperato-4-gb-di-dati-da-un-export-zip-incompleto-con-curl-e-python/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7bf3448c3eaa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Clean Room in the Age of AI: From IBM BIOS to Software Rebuilt in Just a Few Days]]></title>
            <link>https://levysoft.medium.com/the-clean-room-in-the-age-of-ai-from-ibm-bios-to-software-rebuilt-in-just-a-few-days-e500710a0b85?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/e500710a0b85</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[cleanroom]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[ibm]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 22:13:31 GMT</pubDate>
            <atom:updated>2026-11-05T22:13:31.087Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*QtU8MLwYxPafoqao.png" /></figure><p>There’s a software development technique that dates back to the 1980s and is now making a surprising comeback thanks to AI. It’s called <strong>clean room</strong>, but it doesn’t refer to a physical space: it’s a development methodology based on separating information between those who study a program and those who rewrite it, with the aim of <strong>recreating its functionality without copying the original source code</strong>. For decades, it was a complex and expensive practice, used primarily when companies needed to build products compatible with proprietary technologies. Today, with <strong>AI agents capable of analyzing documentation, writing code, running tests, and autonomously fixing errors</strong>, the same process can be carried out much more quickly, to the point where some developers are attempting to <strong>recreate entire commercial applications in just a few weeks</strong>. This phenomenon caught my attention mainly because of its potential implications for the future of software development, licensing, and the economic value of applications. To understand what’s happening, though, we need to go back to a time when <strong>building a computer compatible with a competitor’s machine could require months of work and a team of lawyers</strong>.</p><h3>When Clean Room Development Was Used to Recreate the IBM BIOS</h3><p>In 1981, <strong>IBM introduced its first Personal Computer, the Model 5150</strong>, which would become one of the defining products of the entire computer industry. As <a href="https://www.ibm.com/history/personal-computer">IBM recalls in its own historical account</a>, the machine was designed around a relatively open architecture, largely based on commercially available components. This allowed other manufacturers to build computers with similar hardware specifications, but one fundamental obstacle remained: <strong>the BIOS (Basic Input/Output System), the firmware responsible for initializing the hardware and providing programs with the basic functions needed to communicate with the computer</strong>. The original BIOS was protected by copyright and, although IBM had published its source code in technical manuals, <strong>being able to read it did not mean having permission to copy it</strong>. Without a compatible BIOS, a computer built using similar components might still be unable to run software designed for the IBM PC correctly.</p><p>The original document is still available today: the <a href="https://www.minuszerodegrees.net/manuals/IBM_5150_Technical_Reference_6025005_AUG81.pdf"><em>Personal Computer Technical Reference</em></a>, published by IBM in August 1981, includes <strong>the complete original BIOS listing in Appendix A, written in Assembly language and accompanied by comments describing how it works</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*2jal44Gu13iIuFq4.jpg" /><figcaption><strong>The Assembly source code of the original 1981 IBM BIOS</strong>, published in Appendix A of the <em>Personal Computer Technical Reference</em> (page A-2). Source: IBM, 1981. <a href="https://www.minuszerodegrees.net/manuals/IBM_5150_Technical_Reference_6025005_AUG81.pdf#page=195">View the original document</a>.</figcaption></figure><p>It was precisely this problem that led to the widespread adoption of the clean room technique. <strong>Compaq, founded in 1982</strong>, wanted to build a computer capable of running IBM software without using the original IBM BIOS. The process it adopted required <strong>strict separation between those studying how the BIOS worked and those responsible for writing the new code</strong>. One group of engineers analyzed the original system, examined its available calls, interrupts, and outputs, and translated everything into functional specifications: for example, how a particular BIOS call was supposed to behave when reading a disk sector, which registers it used, and what values it returned when an error occurred. These specifications were also reviewed from a legal perspective before being handed over to <strong>a second group of programmers who were not allowed to access IBM’s source code</strong>. Those programmers then created an entirely new implementation based exclusively on the information they received. The resulting software had to behave like the original while being independently written.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*i8Xx-SRNV6XdoUxQ.jpg" /><figcaption>The Compaq Computer team with the company’s first portable computer. Source: <a href="https://www.marketplace.org/story/2016/03/29/silicon-cowboys-documents-rise-and-fall-compaq">Marketplace</a>.</figcaption></figure><p>This separation was carefully documented because, in the event of a legal dispute, <strong>the company needed to demonstrate that its programmers had not reproduced portions of the protected code</strong>. In the PBS documentary <a href="https://www.pbs.org/nerds/part2.html"><em>Triumph of the Nerds</em></a>, Compaq co-founder Rod Canion describes this very process, explaining the importance of behavioral analysis and legal oversight. The <strong>Compaq Portable, announced in 1982 and commercially released in 1983</strong>, demonstrated that it was possible to build a highly IBM-compatible PC using this approach.</p><p>Another decisive development came in 1984: <strong>Phoenix Technologies developed an IBM-compatible BIOS using a clean room process and began licensing it to other computer manufacturers</strong>. This was significant because PC manufacturers no longer had to undertake the entire reconstruction process themselves. They could purchase a ready-made, independently developed BIOS, <strong>helping the IBM-compatible PC market expand and gradually weakening IBM’s control over the architecture it had made popular</strong>. Phoenix founder Neil Colvin later described the methodology in the preface to <a href="https://archive.org/details/System_BIOS_for_IBM_PC-XT-AT_Computersand_Compatibles_Phoenix"><em>System BIOS for IBM PC/XT/AT Computers and Compatibles</em></a>: the engineers who had studied the original BIOS passed functional specifications to programmers who had never been exposed to its code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*avaCY_W0rmtZVzAW.jpg" /><figcaption>A Phoenix BIOS chip from 1993, installed on a Siemens Nixdorf motherboard. Phoenix Technologies helped drive the adoption of IBM-compatible PCs through an independently developed BIOS created using the clean room methodology. Photo: © Raimond Spekking, CC BY-SA 4.0, via <a href="https://commons.wikimedia.org/wiki/File:Siemens_Nixdorf_Scenic_4NC_-_motherboard_-_Phoenix_BIOS_735_C_U21-2521.jpg">Wikimedia Commons</a>.</figcaption></figure><p>The clean room approach therefore emerged from a very practical need: <strong>achieving functional compatibility while keeping the implementation independent</strong>. It was an organized form of <strong>reverse engineering</strong>, but its cost represented a substantial barrier. It required experienced professionals, many hours of analysis, testing on actual machines, and documentation rigorous enough to withstand potential legal challenges. For a company trying to reproduce a competitor’s software behavior, <strong>the time required to develop a working product was itself a considerable investment</strong>.</p><h3>From Traditional Clean Room Development to AI Agents</h3><p>More than forty years later, in October 2026, developer <strong>Brandon Thomas</strong> brought this methodology back into the spotlight with the release of <a href="https://getartcraft.com/apps">ArtCraft and its collection of free applications</a>. The project includes <strong>fifteen open-source applications</strong>, at various stages of development and written primarily in Rust, designed to offer functionality similar to that of well-known commercial software. <strong>PhotoCraft draws inspiration from Adobe Photoshop, VectorCraft from Illustrator, FilmCraft from Premiere Pro, and PdfCraft from Acrobat</strong>, while <strong>WordCraft</strong>, <strong>GridCraft</strong>, and <strong>DeckCraft</strong> recreate features associated with <strong>Word</strong>, <strong>Excel</strong>, and <strong>PowerPoint</strong>, respectively. The collection also includes <strong>SoundCraft</strong> for audio production, <strong>CADCraft</strong> for technical drawing, <strong>TextureCraft</strong> for creating and editing textures on 3D models, and <strong>Craft Anything</strong>, a tool designed to analyze how existing software works and build new applications with the assistance of AI agents. Other tools for photography, page layout, and interface design complete the collection. The applications are available for several operating systems, including Linux, and some can run directly in the browser thanks to <strong>WebAssembly</strong>. There’s also an <a href="https://craftapps.me/">independently hosted collection</a> where users can explore and launch the web-based editors.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*3L75OTdye4M6hiIE.jpg" /><figcaption>PhotoCraft: Curves and text layers, The Great Wave.</figcaption></figure><p>What makes this project particularly interesting is its development process. Thomas used <strong>AI agents, including Claude Code powered by the Claude Opus 5.5 model</strong>, to generate and modify large amounts of code, distributing the workload across multiple parallel sessions. The public repositories contain files such as PhotoCraft’s <a href="https://github.com/storytold/photocraft/blob/main/AGENTS.md">AGENTS.md</a>, which provide <strong>operational instructions that AI agents must follow during development</strong>. The document explicitly states that the behavior and appearance of proprietary programs may be studied, but <strong>prohibits copying their code, shaders, color profiles, and other protected assets</strong>. Public specifications, such as those describing the PSD file format, are preferred for implementing file compatibility, alongside technical standards and observations of the original software’s behavior. The instructions also require automated testing, document compatibility checks, error handling, and documentation updates whenever significant changes are made.</p><p>There is, however, an important technical difference compared with the clean room methodology of the 1980s. <strong>In the case of Phoenix Technologies, the team responsible for analyzing the IBM BIOS could directly examine the Assembly source code that IBM had published in its technical manuals</strong>, using it to derive functional specifications for the programmers in the second team, who were prohibited from accessing the original code. With PhotoCraft, ArtCraft claims to follow an even more demanding process during the analysis phase: <strong>AI agents must reconstruct Photoshop’s functionality by observing its behavior, analyzing the results it produces, and consulting publicly available technical documentation, without using Adobe’s proprietary source code</strong>. This means <strong>having to infer the rules governing a program’s behavior without being able to directly examine the original algorithms that implement them</strong>.</p><p>Another important aspect is that <strong>according to ArtCraft’s stated development rules, this process does not involve decompiling the original program</strong>. Decompilation is a reverse engineering technique that makes it possible to analyze executable code and reconstruct a more readable representation of it in an attempt to understand its internal logic. PhotoCraft’s approach is instead based on <strong>black-box observation of the software, using tests, output comparisons, and publicly available specifications</strong> to develop an equivalent implementation independently. The distinction matters because <strong>decompilation can reveal the instructions used to implement a program, whereas behavioral analysis requires developers to infer how it works without knowing its underlying code</strong>. However, clean room development does not inherently exclude every form of decompilation, which may be used during the analysis phase in other contexts, subject to applicable legal restrictions.</p><p>Separating analysis from implementation remains essential: AI agents can be assigned different tasks in separate processes, <strong>with one agent generating specifications and another writing code</strong>, but this separation must actually be implemented and documented. <strong>A file instructing agents not to copy original code establishes a development rule, not sufficient proof that the entire process was independent</strong>. The situation is further complicated by the fact that it is not always possible to reconstruct precisely which information the agents used or what the underlying models may have encountered during training. ArtCraft claims to follow a clean room approach and publishes extensive technical information supporting its methodology, but this does not amount to independent legal verification.</p><p>The results also need to be interpreted carefully. The fact that an application can quickly reproduce Photoshop’s interface or provide hundreds of commands <strong>does not mean it already offers the same depth of functionality</strong>. According to <a href="https://github.com/storytold/photocraft/blob/main/docs/target-app-parity.md">PhotoCraft’s official documentation</a>, updated on November 1, 2026, there is an important distinction between the number of implemented features and the application’s actual suitability for professional work: <strong>the project estimates that approximately 76% of the targeted features have been implemented, while professional readiness stands at around 45%</strong>. These are the developers’ own estimates, not independent benchmarks. Challenges remain in PSD file fidelity, performance, stability, generative features, and compatibility with Photoshop’s extension ecosystem. The speed at which the software was created is impressive, but <strong>producing an initial working implementation is a different challenge from ensuring years of reliable use with real documents, different hardware configurations, and continuous updates</strong>.</p><p>ArtCraft is not an isolated example, either. The GitHub repository <a href="https://github.com/HeyPuter/everything">HeyPuter/everything</a> pursues an even broader goal: <strong>rebuilding and distributing open-source alternatives to a wide range of proprietary applications</strong>, from office software and collaboration tools to graphics editors, CAD programs, and enterprise management systems. The project provides dozens of applications, including alternatives to Photoshop, Word, Excel, Slack, Salesforce, and AutoCAD, collected in a single repository and distributed primarily under the <strong>MIT license</strong>. Compared with ArtCraft, its approach focuses mainly on web applications, using JavaScript and integrating with the Puter ecosystem. The project also states its intention to rebuild software from scratch, but <strong>the publicly available documentation examined does not describe a procedure demonstrating strict separation between analyzing the original programs and implementing the new code</strong>. It would therefore be inaccurate to automatically classify Everything as a clean room project in the traditional technical sense. Nevertheless, it remains an important example of how ambitious projects offering open alternatives to established commercial software have become.</p><h3>Craft Anything: When Clean Room Becomes Software Itself</h3><p>Among the ArtCraft projects, <a href="https://getartcraft.com/apps/craft-anything">Craft Anything</a> may represent the most interesting evolution of the clean room concept. <strong>While PhotoCraft, VectorCraft, and the other applications are examples of software rebuilt through AI-assisted development processes, Craft Anything attempts to turn that same process into a tool that anyone can use</strong>. In other words, the methodology used to create alternatives to commercial applications becomes an open-source application itself, designed to allow other developers to repeat the experiment with different software. This is a significant step: the goal is no longer simply to rebuild a product, but to <strong>make the reconstruction process itself reusable and at least partially automated</strong>.</p><p>Developed in Rust, Craft Anything allows users to specify a website, application, or video game and describe the result they want to achieve. The system organizes the work into four stages: it analyzes the reference program, assigns an AI agent to build a new implementation, compares the result with the original, and attempts to correct the differences it identifies. In <strong>Clean Room</strong> mode, enabled by default, the analysis is limited to externally observable elements such as screenshots, visible text, component layouts, and interface behavior, without reading source code or internal files. <strong>Deep</strong> mode, on the other hand, allows the system to examine internal software components using reverse engineering tools such as Ghidra. The entire engine can be accessed through a graphical interface, a command-line interface, or an <strong>MCP (Model Context Protocol) server</strong>, making its capabilities available to other AI agents as well.</p><p><strong>The potential consequence is a kind of democratization of clean room development</strong>: a process that required separate teams of engineers, rigorous documentation, and substantial investments in the 1980s could become accessible to independent developers and small teams through automated tools. Craft Anything is still in the <em>early alpha</em> stage and, according to the developers’ published documentation, some functional checks remain incomplete, while comprehensive live demonstrations of full reconstruction in Clean Room mode have not yet been documented. Furthermore, restricting access to the original source code does not necessarily provide the strict separation of responsibilities required by the traditional methodology, nor does it automatically guarantee that the resulting implementation is legally independent. <strong>The significant development is the possibility of turning a specialized technique into a repeatable process that could become accessible to many more people, even though the technical and legal challenges of software reconstruction have not yet been fully resolved.</strong></p><h3>Is It Legal to Rebuild Software Without Copying Its Code?</h3><p>From a legal perspective, the issue is more complex than it might initially appear. The fundamental principle is that <strong>copyright protects the expression of a computer program, including its code and other protectable original elements, but does not automatically grant its developer a monopoly over every function the program performs</strong>. This distinction was clarified by the Court of Justice of the European Union in its <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:62010CJ0406">May 2, 2012 ruling in SAS Institute v. World Programming</a>. The case concerned software developed to reproduce the functionality of the SAS system without accessing its source code. The Court held that <strong>the functionality of a computer program, the programming language, and the file formats used to exploit certain functions do not, as such, constitute forms of expression protected by copyright in computer programs</strong>. This does not rule out the possibility that specific elements, such as original expressions contained in documentation or an interface, may be protected under other legal provisions.</p><p><a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32009L0024">European Directive 2009/24/EC</a> also distinguishes between two activities that are often confused. <strong>Article 5(3) allows a person entitled to use a program to observe, study, or test its functioning in order to determine the ideas and principles underlying it</strong>, while performing operations that they are authorized to carry out. <strong>Article 6, on the other hand, governs decompilation</strong>, the process of reconstructing a representation of code from an executable program, allowing it under specific conditions when it is indispensable to obtain information necessary for interoperability with independently developed software. <strong>Information obtained in this way cannot be freely used for other purposes</strong>. In 2021, in the <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:62020CJ0013">Top System ruling</a>, the Court also recognized that a lawful purchaser may decompile a program to the extent necessary to correct errors affecting its operation, subject to the conditions established by the applicable legal framework. These exceptions do not amount to general authorization to decompile any commercial product for the purpose of creating a competing copy.</p><p>In the United States, an important precedent is the <a href="https://law.justia.com/cases/federal/appellate-courts/ca9/92-15655/92-15655.html">1992 Sega Enterprises v. Accolade ruling</a>. The Ninth Circuit Court of Appeals recognized that, under the specific circumstances of the case, <strong>disassembling a program could constitute</strong> <strong><em>fair use</em></strong> <strong>when it was the only available means of accessing functional elements not protected by copyright and served a legitimate purpose, such as achieving compatibility with another system</strong>. This decision does not provide general authorization to copy competing programs either, but it confirms <strong>the importance of distinguishing between reproducing protected code and studying functionality to create an independent implementation</strong>. The legal conditions governing these activities nevertheless differ across jurisdictions.</p><p>The crucial issue, therefore, concerns <strong>the origin of the information used to write the new program</strong>. Observing how an application responds to commands and independently reconstructing its behavior is legally different from extracting its code, converting it into specifications, and having an AI agent rewrite it. In the latter case, <strong>the involvement of an AI model does not automatically eliminate the conditions and restrictions that applied to obtaining the original material</strong>. Additional issues may also arise involving patents, trademarks, trade secrets, licenses, and the reproduction of specific graphical elements. <strong>The purpose of the clean room methodology is precisely to reduce the risk of using protected material and to document the independence of the development process, but it does not, by itself, guarantee that no rights have been infringed</strong>.</p><p>A recent case illustrates how controversial this distinction can become even within the open-source community. In March 2026, the maintainer of the Python library <a href="https://github.com/chardet/chardet">chardet</a>, widely used for automatically detecting character encodings, published <strong>a completely rewritten version developed with the assistance of Claude Code, replacing the previous LGPL license with the more permissive MIT license</strong>. Mark Pilgrim, the library’s original author, challenged the change, arguing that the maintainer was deeply familiar with the previous code and that an AI-assisted rewrite was not sufficient to eliminate the obligations imposed by the original license. The maintainer defended the structural independence of the new implementation, also presenting similarity comparisons with earlier versions. The controversy, reported by <a href="https://arstechnica.com/ai/2026/03/ai-can-rewrite-open-source-code-but-can-it-rewrite-the-license-too/">Ars Technica</a> and examined in greater detail by <a href="https://lwn.net/Articles/1061534/">LWN</a>, does not automatically establish which interpretation is correct, but highlights a question that is likely to become increasingly common: <strong>how independent must a rewrite be before the resulting software can be considered a new work and distributed under a different license?</strong></p><h3>The Economic Question: If Rebuilding Software Becomes Cheap, Who Will Fund New Ideas?</h3><p>There’s another aspect that I find particularly interesting, one that goes beyond the debate over licensing. For a long time, <strong>the cost of developing a complex application provided a form of economic protection for those who had invested in creating it</strong>. A competitor could attempt to reproduce its functionality without violating copyright, but would still have to bear substantial costs to understand the product, design a new architecture, implement its algorithms, fix bugs, and achieve an acceptable level of quality. <strong>The time required for competitors to catch up often allowed the original developer to keep selling the software and finance subsequent versions</strong>.</p><p>AI agents are reducing, above all, <strong>the cost of the initial implementation</strong>. Specifications can be transformed into code much more quickly, multiple agents can work simultaneously on different components, and a substantial portion of repetitive development tasks can be automated. But projects such as Craft Anything introduce a further possibility: <strong>not only making it cheaper to rebuild an application, but turning the reconstruction process itself into a reusable tool</strong>. If this approach achieved sufficient reliability, the work required to analyze, recreate, and verify a program could be repeated across different products without having to organize the entire process from scratch each time. The cost of individual reconstructions could therefore decrease even further, encouraging the proliferation of alternatives to existing software. This remains a possibility that needs to be tested: automating certain stages does not mean eliminating the technical, legal, and organizational challenges involved in developing complex applications.</p><p>This transformation recalls the concept of <a href="https://en.wikipedia.org/wiki/Creative_destruction"><strong>creative destruction</strong></a> <strong>associated with the economist Joseph Schumpeter</strong>, in which innovation changes market dynamics by making established activities and business models less competitive. The issue, however, also concerns the incentives to fund research into new solutions. <strong>If a small software company spends two years developing an original technology and a competitor can reproduce its essential features within a few weeks, the time available to recover that investment could shrink considerably</strong>. The risk would be greater for companies whose competitive advantage depends almost entirely on a particular feature, without an established customer base or a broader ecosystem of services. This scenario reveals a potential economic imbalance: <strong>the cost of inventing a solution could remain substantially higher than the cost of rebuilding it once its behavior can be observed</strong>.</p><p>This does not necessarily mean that applications such as Photoshop, AutoCAD, or Microsoft Office will suddenly lose their markets. Their value also includes <strong>compatibility with enormous archives of documents, integration into business processes, extensions developed over many years, technical support, security, and the assurance that users will be able to keep relying on the same tools over time</strong>. For a professional, being able to open a PSD file is useful, but <strong>editing and saving it without altering layers, masks, color profiles, or information that the alternative application does not yet support is a much more demanding requirement</strong>. The same applies to an Excel spreadsheet containing complex macros or a CAD project that needs to be shared with other engineering or design firms. <strong>True interoperability requires compatibility that has been tested even in less common scenarios</strong>, the ones that tend to emerge when software is used every day.</p><p>In an <a href="https://heathermeeker.com/2026/10/13/puters-everything-project-changes-everything/">article published on October 13, 2026</a>, open-source licensing attorney Heather Meeker interpreted ArtCraft and Everything as signs of a shift in the commercial value of software. In her view, <strong>the market may increasingly reward product quality, brand reputation, user trust, and ease of distribution and use, rather than ownership of the code alone</strong>. Meeker also discloses that she is an investor in Puter, a circumstance worth considering when evaluating her enthusiasm for this model. Nevertheless, the distinction between writing software and providing the infrastructure needed to operate it over time remains particularly interesting: <strong>a reliable cloud service requires continuous availability, data protection, backups, updates, and operational responsibilities that go far beyond generating code</strong>.</p><p>There is, however, another possible consequence, and a less pessimistic one. <strong>The same tools that make it easier to rebuild existing products could also reduce the cost of experimenting with genuinely new ideas</strong>. An independent developer could combine open-source components and AI agents to create prototypes that would previously have required a much larger team. A small business could develop a tool tailored to its own processes without commissioning an entire management system from scratch. Users might request increasingly customized applications, perhaps built on existing open-source products and adapted to needs that major software vendors have little economic incentive to address. At the same time, <strong>every customization introduces maintenance, compatibility, and security challenges</strong>, particularly when the underlying software is updated. AI agents could help reduce the cost of maintaining and migrating these modifications, but the resulting software would still need to be tested to ensure that it continues to work correctly with real data and external systems.</p><p>Looking back at the history of the IBM BIOS, it seems to me that the most significant change concerns <strong>the cost of technological independence</strong>. In the 1980s, Compaq and Phoenix demonstrated that it was possible to recreate an essential component without using the original manufacturer’s code, helping establish a much broader market for compatible computers. Today, AI agents make it possible to attempt something similar on a scale that would have been difficult for individual developers or small teams to sustain in the past. Projects such as ArtCraft and Everything show how much easier it has become to initiate a software rewrite, while Craft Anything attempts to take this a step further by <strong>turning the reconstruction methodology into a technology that others can use themselves</strong>. It remains to be demonstrated how effectively this automation can handle complex products, but the direction is significant: the change may affect not only how software is written, but also how quickly the ability to develop it spreads.</p><p>Above all, one economic question remains open: <strong>if the cost of catching up with someone who has invented a new solution continues to fall, how will the incentives to invest in being first change?</strong> These same tools could encourage competition, broaden access to software development, and make applications economically viable that would not be feasible today. Yet they could also shorten the time available to recover investments in developing new features. <strong>The challenge will not simply be to make it cheaper to rebuild what already exists, but to find a balance that continues to make it worthwhile to invent what does not yet exist.</strong></p><p><em>Originally published at </em><a href="https://www.levysoft.it/archivio/2026/11/05/la-camera-bianca-nellera-dellai-dai-bios-ibm-ai-software-ricostruiti-in-pochi-giorni/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e500710a0b85" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Convert a Web Page to Markdown with a Bookmarklet]]></title>
            <link>https://levysoft.medium.com/how-to-convert-a-web-page-to-markdown-with-a-bookmarklet-c04c9c947a75?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/c04c9c947a75</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[bookmarklet]]></category>
            <category><![CDATA[agentic-rag]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[markdown]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Sat, 31 Oct 2026 10:11:35 GMT</pubDate>
            <atom:updated>2026-10-31T10:11:35.464Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-6Yw4F0c4dESrDzt8sEk5Q.png" /></figure><p>When using large language models (LLMs) such as <a href="https://chatgpt.com/">ChatGPT</a>, <a href="https://claude.ai/">Claude</a>, or <a href="https://gemini.google.com/">Gemini</a> to analyze an article, summarize technical documentation, or explore a topic found online, we often need to provide the content of a web page directly. Sometimes simply pasting the link is enough, especially when the model has tools to browse the web, but the system cannot always retrieve the text correctly or distinguish the main content from all the other elements that make up the page.</p><p>A practical solution is to convert the page into <strong>Markdown</strong>, a lightweight text <a href="https://it.wikipedia.org/wiki/Markdown">format</a> that preserves a recognizable structure through headings, paragraphs, lists, links, and code blocks, while removing much of the HTML used for visual presentation. The result is generally more compact and easier to process, although conversion does not automatically guarantee better understanding by the model: the benefit depends primarily on the quality of the extraction and the amount of unnecessary content removed. This gives us text that we can paste directly into a conversation, save as a .md document, or use in a retrieval-augmented generation (RAG) system, such as <a href="https://notebook.google.com/">Google&#39;s Gemini Notebook</a> (formerly NotebookLM).</p><p>To automate this process, we can use <strong>bookmarklets</strong>, <em>small JavaScript programs saved as browser bookmarks that perform an action on the current page</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*TMVeZ1airwAmRIn9.jpg" /></figure><p>The idea is simple: instead of repeatedly copying a website’s address, opening a conversion service, and pasting the URL manually, we can obtain the content in Markdown with a single click. Let’s see how to use two services, <em>Jina Reader</em> and <em>Markdown Download</em>, while also adding the ability to download the result directly.</p><h3>Convert a Web Page to Markdown with Jina Reader</h3><p>The first method uses <a href="https://jina.ai/reader/">Jina Reader</a>, a service that retrieves the content of a web page and converts it into a text format suitable for processing by LLMs. This technique was described in December 2024 by Stephen D. Turner in the article <a href="https://blog.stephenturner.us/p/turn-any-webpage-into-markdown-for-llm-friendly-input">Turn any webpage into markdown for LLM-friendly input</a>: simply prepend https://r.jina.ai/ to the address of the page you want to convert.</p><p>For example, starting from https://example.com, we can request the Markdown version through:</p><p>https://r.jina.ai/https://example.com</p><p>The service retrieves the resource on its own server, extracts its content, and returns a structured text representation. According to the <a href="https://docs.jina.ai/">official documentation</a>, Reader also supports PDF documents and pages that require JavaScript execution to display their content. It can also return results in different formats, including JSON, and allows certain aspects of the extraction process to be controlled through HTTP parameters and headers.</p><p>For occasional use, an API key is not required, although anonymous requests are subject to stricter limits than authenticated ones.</p><h3>The Bookmarklet for Instant Conversion</h3><p>We can make this process even faster by creating a bookmarklet that automatically adds the Jina Reader prefix to the address of the current page. Simply create a new bookmark in your browser and enter the JavaScript code in the URL field instead of a regular website address.</p><p><strong>Jina Reader: View the Markdown</strong></p><pre>javascript:(function(){window.location.href=&#39;https://r.jina.ai/&#39; + window.location.href;})();</pre><p>Once the bookmark has been saved, simply open an article and click it to be redirected to the corresponding converted version. The text can then be copied and used directly in ChatGPT or another AI model, without having to work with the original HTML.</p><h3>Automatically Download the Content as a Markdown File</h3><p>We can further improve this solution by automating the download process as well. In this case, instead of simply changing the browser’s address, the bookmarklet uses fetch to request the converted content, stores it in a Blob object, and generates a temporary link to initiate the download of the .md file.</p><p>For the document’s filename, we can use the title of the current page, properly sanitized to remove characters that are not allowed in filenames. The advantage is that we obtain a document directly, ready to be archived, edited, or uploaded to a conversation with an LLM.</p><p><strong>Jina Reader: Download the</strong> **.md** <strong>file</strong></p><pre>javascript:(async () =&gt; {<br>    try {<br>        const url = &#39;https://r.jina.ai/&#39; + window.location.href;<br><br>        const response = await fetch(url, {<br>            headers: {<br>                &#39;Accept&#39;: &#39;text/plain&#39;<br>            }<br>        });<br><br>        if (!response.ok) {<br>            throw new Error(&#39;HTTP &#39; + response.status);<br>        }<br><br>        const markdown = await response.text();<br><br>        if (!markdown.trim()) {<br>            throw new Error(&#39;Risposta vuota&#39;);<br>        }<br><br>        const filename = (document.title || &#39;pagina&#39;)<br>            .replace(/[\\/:*?&quot;&lt;&gt;|]/g, &#39;&#39;)<br>            .trim()<br>            .replace(/\s+/g, &#39;_&#39;)<br>            .slice(0, 120) || &#39;pagina&#39;;<br><br>        const blob = new Blob([markdown], {<br>            type: &#39;text/markdown;charset=utf-8&#39;<br>        });<br><br>        const downloadUrl = URL.createObjectURL(blob);<br><br>        const a = document.createElement(&#39;a&#39;);<br>        a.href = downloadUrl;<br>        a.download = filename + &#39;.md&#39;;<br><br>        document.body.appendChild(a);<br>        a.click();<br>        a.remove();<br><br>        setTimeout(() =&gt; {<br>            URL.revokeObjectURL(downloadUrl);<br>        }, 30000);<br><br>    } catch (error) {<br>        alert(&#39;Download Markdown non riuscito: &#39; + error.message);<br>    }<br>})();</pre><h3>Markdown Download: An Alternative Service</h3><p>Another option is <a href="https://markdown.download/">Markdown Download</a>, an open-source project developed by Taras Glek, initially created to make web pages easier to read on e-reader devices. The service uses main-content extraction techniques, similar to those employed by Readability-style libraries, to produce a simplified version of the page.</p><p>As explained by the author in the article <a href="https://taras.glek.net/posts/markdown.download/?utm_source=chatgpt.com">Developing markdown.download</a>, the service allows a web page to be converted by passing its address as a ?url= parameter or by appending it directly to the service&#39;s URL path. Both methods are supported, for example:</p><p>https://markdown.download/?url=https://example.com</p><p>https://markdown.download/https://example.com</p><p>This structure is particularly well suited to bookmarklets because it automates conversion without requiring us to open the service and manually enter the address each time. It is worth noting that the response may be displayed as a readable HTML page in the browser or returned directly as Markdown, depending on the format requested through HTTP headers, particularly Accept.</p><p>The project also makes its <a href="https://github.com/tarasglek/markdown-download">source code available on GitHub</a>, an interesting option for anyone who wants to study how the service works or build an independent solution.</p><h3>Bookmarklet to View the Content</h3><p>We can apply the same technique as in the first example, replacing the destination service with Markdown Download.</p><p><strong>Markdown Download: Open the Converted Version</strong></p><pre>javascript:(function(){window.location.href=&#39;https://markdown.download/?url=&#39;+encodeURIComponent(window.location.href);})();</pre><p>For Markdown Download, we can also use a variant that retrieves the converted text and saves it directly as a .md document. In this case, the fetch request specifies the Accept: text/markdown header to obtain the content in the desired format rather than an HTML representation. The project&#39;s source code explicitly supports CORS, allowing requests from different domains. However, restrictions imposed by the browser or the security policies of the page from which the bookmarklet is executed may still apply.</p><p><strong>Markdown Download: Download the</strong> **.md** <strong>file</strong></p><pre>javascript:(async () =&gt; {<br>    try {<br>        const url = &#39;https://markdown.download/?url=&#39; +<br>            encodeURIComponent(window.location.href);<br><br>        const response = await fetch(url, {<br>            headers: {<br>                &#39;Accept&#39;: &#39;text/markdown&#39;<br>            }<br>        });<br><br>        if (!response.ok) {<br>            throw new Error(&#39;HTTP &#39; + response.status);<br>        }<br><br>        const contentType = response.headers.get(&#39;content-type&#39;) || &#39;&#39;;<br><br>        if (<br>            contentType.includes(&#39;text/html&#39;) ||<br>            contentType.includes(&#39;application/json&#39;)<br>        ) {<br>            throw new Error(&#39;Il servizio non ha restituito Markdown&#39;);<br>        }<br><br>        const markdown = await response.text();<br><br>        if (!markdown.trim()) {<br>            throw new Error(&#39;Risposta vuota&#39;);<br>        }<br><br>        const filename = (document.title || &#39;pagina&#39;)<br>            .replace(/[\\/:*?&quot;&lt;&gt;|]/g, &#39;&#39;)<br>            .trim()<br>            .replace(/\s+/g, &#39;_&#39;)<br>            .slice(0, 120) || &#39;pagina&#39;;<br><br>        const blob = new Blob([markdown], {<br>            type: &#39;text/markdown;charset=utf-8&#39;<br>        });<br><br>        const downloadUrl = URL.createObjectURL(blob);<br><br>        const a = document.createElement(&#39;a&#39;);<br>        a.href = downloadUrl;<br>        a.download = filename + &#39;.md&#39;;<br><br>        document.body.appendChild(a);<br>        a.click();<br>        a.remove();<br><br>        setTimeout(() =&gt; {<br>            URL.revokeObjectURL(downloadUrl);<br>        }, 30000);<br><br>    } catch (error) {<br>        alert(&#39;Download Markdown non riuscito: &#39; + error.message);<br>    }<br>})();</pre><p>Having two different services available is useful because content extraction does not necessarily follow the same rules. A complex page containing tables, dynamic elements, or an unconventional HTML structure may produce different results depending on the tool used. It is therefore advisable to compare the resulting document with the original, especially when the text contains technical information that must be preserved in full.</p><h3>From Bookmarklets to Markdown Served Directly by Websites</h3><p>Meanwhile, the way the web makes content available to AI systems is also changing. On February 12, 2026, Cloudflare announced <a href="https://blog.cloudflare.com/markdown-for-agents/">Markdown for Agents</a>, a feature that allows websites that enable it to provide a Markdown version of their pages directly through the standard HTTP protocol.</p><p>The mechanism relies on <em>content negotiation</em>, which allows a client to indicate to the server which format it prefers to receive. When a request includes the Accept: text/markdown header, a compatible website can return the document already converted, without requiring the client to download the entire HTML and then process it independently. Cloudflare performs this transformation on its own network for websites that have enabled the service.</p><p>For example, we can request the Markdown version of a Cloudflare documentation page with a simple command:</p><blockquote>curl -H “Accept: text/markdown” \ <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/</a></blockquote><p>The result may also include structured metadata, while the response headers can provide useful information about the returned format. However, this feature is not universal: it requires the website to support this type of response and its administrator to have enabled the conversion. For pages that do not offer this capability, services such as Jina Reader continue to serve a specific purpose.</p><p>There are also tools such as <a href="https://markdown.new/">markdown.new</a>, which combine different techniques to obtain Markdown from a public URL, using the format returned directly by the website when available and otherwise falling back to converting the HTML content. In this case, too, the service’s domain can be prepended to the address of the page to be processed.</p><h3>Some Limitations to Keep in Mind</h3><p>These external services are convenient, but they have certain practical limitations. Because they access web pages through their own connections, they do not automatically have access to our browser’s authenticated session. As a result, restricted content, pages protected by anti-bot systems, or pages that load information only after specific user interactions may be incomplete or inaccessible.</p><p>Conversion also involves some compromises. Markdown represents a document’s structure well, but it may lose information related to layout, interactive elements, or visual relationships between content elements. Furthermore, a link to an image is not equivalent to providing the model with the image itself. When analyzing technical documentation, an article containing many tables, or a page with source code, it is therefore important to verify that the essential parts have been preserved correctly.</p><p>Finally, it is worth remembering that when using a remote conversion service, the requested URL is transmitted to an external infrastructure. This is something to consider when working with non-public documents, links containing access tokens, or confidential material.</p><h3>Conclusion</h3><p>The bookmarklets we have explored allow us to use services such as Jina Reader and Markdown Download directly from the page we are viewing, choosing whether to display the converted content or download it as a .md file. I find this solution particularly convenient for collecting articles and documentation to use in my own research and analysis with AI models or simply for building a personal archive of documents that are easy to consult and reuse. The more recently introduced ability to obtain Markdown directly through HTTP could simplify this process even further, at least for websites that support this feature. For all other pages, conversion services remain useful tools, especially when we want to retrieve content quickly without repeatedly copying and pasting URLs.</p><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/10/31/come-trasformare-una-pagina-web-in-markdown-con-un-bookmarklet/"><em>https://www.levysoft.it</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c04c9c947a75" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows, Tabs, and Sessions: How Restoration Works When You Reopen an App on macOS]]></title>
            <link>https://levysoft.medium.com/windows-tabs-and-sessions-how-restoration-works-when-you-reopen-an-app-on-macos-dc5d8244fdde?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/dc5d8244fdde</guid>
            <category><![CDATA[terminale]]></category>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[tips]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[tabs]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 07:29:47 GMT</pubDate>
            <atom:updated>2026-10-29T08:36:27.621Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*iXNLgBT3Xt-_Estw.jpg" /></figure><p>Some macOS features remain in place for years, surviving new versions, interface changes, and even name changes until they become almost invisible. We have seen them dozens of times in <em>System Settings</em>, perhaps enabled them years ago to solve a specific problem, and then completely forgotten about them. What makes things more complicated is that some of these features are not particularly easy to find in Apple’s documentation, or are described with a name that tells only part of the story. When their effects resurface much later, it is natural to look for the cause inside the application that appears to be misbehaving.</p><p>That is exactly what happened to me with tab restoration. For some time, I have been using <a href="https://nova.app/">Nova</a> primarily as an editor, with several Markdown files open simultaneously, and I noticed that after quitting the app with ⌘Q, the tabs were no longer restored. So I started looking through Nova&#39;s settings for something equivalent to the &quot;<em>Continue where you left off</em>&quot; option found in browsers, convinced that the editor was failing to remember my previous session. Nova lets you configure many aspects of the Workspace, but it does not provide a simple switch that says &quot;<em>reopen the tabs from the last session</em>&quot;.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*J2Ojyp36SY6c5113.jpeg" /></figure><p>The fact that Nova has a restoration mechanism is confirmed by <a href="https://help.nova.app/support/troubleshooting/">Panic’s own documentation</a>. Among the suggestions for troubleshooting crashes at launch, it recommends <strong>holding down Shift while opening Nova</strong>. This prevents the application from restoring its previous state, explicitly including <strong>open projects and tabs</strong>. Interestingly, <a href="https://support.apple.com/102318">Apple also recommends holding down Shift</a> as a temporary way to prevent an application from restoring windows from the previous session. It is one of those long-standing macOS behaviors that continue to exist for years without being particularly visible in the interface.</p><p>The cause, however, was outside Nova. It was an old global macOS setting under <strong>System Settings → Desktop &amp; Dock → Windows</strong>, where I had somehow enabled the option <strong>“Close windows when quitting an application”</strong>, probably years ago. All I had to do was turn it off, quit Nova with the tabs still open, and launch it again. Every tab returned exactly where I had left it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*liq2TCPDOeUO1G_V630clg.jpeg" /></figure><p>A simple solution, hidden behind <strong>one of the least intuitive macOS setting names I have ever encountered</strong>.</p><h3>Resume Has Been Around Since OS X Lion</h3><p>What happened to me can be traced back to a feature that <strong>Apple introduced in 2011</strong> with <strong>OS X 10.7 Lion</strong>, called <strong>Resume</strong>. The idea was to bring the behavior of Mac applications closer to what Apple was developing on the iPhone and iPad: <strong>quitting an application should not necessarily mean losing your working context</strong>. If you quit a program with several windows open, those windows could reappear in the same positions and states the next time you launched it.</p><p>The <a href="https://www.macworld.com/article/213243/osx_lion_review.html">original Macworld review of Lion</a> described precisely this behavior: when you quit an application with multiple windows open and launched it again, Lion brought those windows back to the screen just as you had left them. <strong>Resume worked alongside Auto Save and was designed to make quitting and subsequently reopening an application almost seamless</strong>.</p><p>The wording of the setting was also much clearer back then: <strong>“Restore windows when quitting and re-opening apps”</strong>. If the checkbox was selected, macOS preserved the state of the windows. If it was deselected, the application started with a clean slate.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*vU28c_PZp6WCLcAl.png" /></figure><p>With <strong>OS X 10.8 Mountain Lion</strong>, in 2012, Apple changed its approach and replaced the option with what is now known as <strong>“Close windows when quitting an application”</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*t0TN1gVBYV8u81tx.jpg" /></figure><p>The underlying behavior remained essentially the same as Resume, but the interface began describing the opposite scenario. To enable restoration, you therefore have to leave an option about closing windows <strong>turned off</strong>.</p><h3>How This Setting Works</h3><p><a href="https://support.apple.com/guide/mac-help/mchl834d18c2/mac">Apple’s current documentation</a> explains the behavior quite clearly, although you first need to know that the setting exists to find the relevant explanation: if an application has windows open when you quit it, those windows can be displayed again the next time you launch it. To prevent this, you need to enable <strong>“Close windows when quitting an application”</strong>.</p><p>The distinction between closing a window and quitting an application is important. <strong>On macOS, clicking the red Close button closes the window, but the application normally remains running. Pressing </strong><strong>⌘Q, on the other hand, quits the application.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*OurSzNcIP3JkHWBc.jpg" /></figure><p>Resume records the state of the windows that exist when the application quits. If you deliberately close those windows beforehand, you cannot expect them to be recreated as though they had been left open.</p><p>The setting is global and, under the hood, is associated with the NSQuitAlwaysKeepsWindows preference. The <a href="https://macos-defaults.com/misc/nsquitalwayskeepwindows.html">macOS defaults</a> project documents the default value as:</p><p>NSQuitAlwaysKeepsWindows = true</p><p>The name of the key makes the mechanism clearer than the graphical interface does: true means macOS preserves windows when an application quits. Since the checkbox in System Settings is expressed in the opposite way, this corresponds to having <strong>&quot;Close windows when quitting an application&quot; turned off</strong>.</p><p>You can also check the current value from Terminal using:</p><p>defaults read NSGlobalDomain NSQuitAlwaysKeepsWindows</p><p>On a configuration that normally preserves windows, you would therefore expect 1 or true. The same preference can be changed using defaults, but adjusting it through System Settings is still preferable: it is a <strong>global preference</strong>, and its effect extends to every application that participates in the macOS restoration system.</p><p>This also explains why it would not be a good idea for Nova to change the setting on its own. If Panic modified that preference to let Nova restore its tabs, it would simultaneously change the behavior of other applications on the Mac. Nova could, however, detect the configuration and inform users that restoration depends on this particular macOS setting, perhaps by adding a note directly to its Workspace settings.</p><p>A message such as “<em>To restore windows and tabs the next time you launch Nova, make sure ‘Close windows when quitting an application’ is turned off in System Settings → Desktop &amp; Dock</em>” would have saved me quite a bit of time.</p><h3>It Is Not Just About Windows</h3><p>The name Apple chose makes an important aspect of this setting less obvious: what macOS can restore is not necessarily limited to a simple window. <strong>The state an application entrusts to the system can also include open documents, tabs, sessions, and parts of the interface layout</strong>. That is precisely why, in my case, I initially looked for the solution inside Nova. The editor’s tabs had disappeared, so there was no intuitive reason for me to connect the problem to the application’s windows.</p><p><a href="https://support.apple.com/102192">Safari is probably the most obvious example</a>: Apple explicitly documents that the browser can reopen windows and tabs from the previous session and identifies <strong>“Close windows when quitting an application”</strong> as one of the settings that control this behavior.</p><p>Something similar happens with Terminal, where tabs failing to reopen after ⌘Q can be traced back to the same global macOS preference. In fact, this is where it becomes even more apparent how misleading the setting&#39;s name can be. You do not even need multiple tabs open: with just one window and one session, leaving <strong>&quot;Close windows when quitting an application&quot;</strong> turned off means that <strong>Terminal can also recover the text and state of the previous session the next time it opens</strong>. Apple documents a feature called <strong>&quot;Restore text when reopening windows&quot;</strong> in Terminal&#39;s profile settings and specifies that these options are ignored when the global macOS preference for closing windows is enabled. In my test, when I reopened Terminal, the previous scrollback reappeared along with the message Restored session, and the shell was back in the directory where I had left it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*E5nw96PFFG-U1Qw_.jpg" /></figure><p>From this perspective, <strong>the word “windows” in System Settings describes only one visible part of the mechanism</strong>. For users, the consequences may appear elsewhere: <em>Safari loses its open pages, Terminal loses its tab sessions, a document-based application may forget its workspace layout, and an editor like Nova may reopen without the tabs you were working on</em>.</p><h3>Two Different Settings That Are Easy to Confuse</h3><p>There is another macOS preference that looks similar but comes into play at a different moment: <strong>“Reopen windows when logging back in”</strong>, displayed when you shut down, restart, or log out of your Mac.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*CnPgPdAySwNLWXSZ.jpg" /></figure><p>That option determines whether applications that were open before shutdown should be launched again during the next macOS session. <strong>“Close windows when quitting an application”</strong>, on the other hand, controls what happens when you quit and subsequently reopen an individual application. Lion introduced both ideas as part of the same Resume philosophy, which still contributes to making the two mechanisms seem more closely related than they actually are in everyday use.</p><h3>An Old Feature That Is Easy to Forget</h3><p>In the end, the problem was not Nova, but an old macOS setting that I had probably enabled years ago and completely forgotten about. What misled me most was its name: I was looking for a feature related to the editor’s tabs and sessions, while macOS kept referring simply to “windows”.</p><p>In my case, the final solution turned out to be incredibly simple: <strong>System Settings → Desktop &amp; Dock → Windows → turn off “Close windows when quitting an application”</strong>. Since then, I can leave the Markdown files I am working on open in Nova, press ⌘Q, and find them all waiting for me the next time I launch the editor.</p><p>This experience also made me realize how easy it is to lose sight of features that macOS has preserved for years, especially when their names do not make it immediately clear how they can affect the behavior of applications.</p><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/10/29/finestre-tab-e-sessioni-come-funziona-il-ripristino-quando-riapri-unapp-su-macos/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dc5d8244fdde" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Customize Spaces on a Multiuser Mac with Your Name Using GeekTool]]></title>
            <link>https://levysoft.medium.com/customize-spaces-on-a-multiuser-mac-with-your-name-using-geektool-699cb8228fc1?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/699cb8228fc1</guid>
            <category><![CDATA[imac]]></category>
            <category><![CDATA[geektool]]></category>
            <category><![CDATA[mac-tips]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[tips]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Mon, 26 Oct 2026 06:58:12 GMT</pubDate>
            <atom:updated>2026-10-29T08:20:05.044Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2T_ic_FDLG8z-hdS.png" /></figure><p>In a home or work environment where several people share the same Mac, especially an <strong>iMac located in a common area</strong>, it’s easy to forget which user account is currently logged in. This situation can create confusion and lead to mistakes when managing personal files or user-specific settings.</p><p>The solution I’d like to share is the one I use at home: <strong>permanently displaying the current user’s name directly on the desktop</strong> using <a href="https://www.tynsoe.org/geektool/"><strong>GeekTool</strong></a>, a free application that allows you to integrate dynamic information into the macOS desktop environment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BZuVg1fv9zIsoEbI.png" /></figure><h3>What Is GeekTool?</h3><p><a href="https://www.tynsoe.org/geektool/">GeekTool</a> is the digital <strong>Swiss Army knife</strong> that every geek, beginner or experienced, should have in their macOS toolbox. Like a faithful companion on your computing adventures, it transforms the desktop from a simple “virtual desk” into a fully customized command center. If your desktop is your digital home, GeekTool is the interior designer that truly makes it yours: no more bare walls with a few scattered icons, but a living environment filled with useful information that adapts to your needs like a tailored suit. <em>With a simple drag and drop, you can display temperatures, weather forecasts, CPU usage, quotes of the day, or simply your username.</em></p><p><a href="https://www.tynsoe.org/geektool/">GeekTool</a> is a macOS application that can be downloaded <strong>for free</strong> from its official website. Once installed, the application features a clean and intuitive interface that makes it easy to create and manage your own <strong>Geeklets</strong>, small configurable widgets that blend seamlessly into your desktop background and allow you to display information from different sources:</p><ul><li><strong>Shell commands</strong>: Output from Terminal commands</li><li><strong>Text files</strong>: Content from local or remote files</li><li><strong>Images</strong>: Charts, photos, and dynamic icons</li><li><strong>Log files</strong>: Real-time monitoring of log files</li></ul><h3>The id -F Command: The Key to Our System</h3><p>One of the <strong>great advantages of macOS is its solid Unix/BSD foundation</strong>, a legacy Apple has maintained since the introduction of Mac OS X. This feature is not just an interesting technical detail, but a real treasure for those who know how to take advantage of it, because it gives us access to the full power of Unix commands, tested and refined over decades of development. GeekTool becomes the <strong>perfect bridge between these two worlds: the raw power of Unix commands and the visual elegance of the macOS desktop</strong>. We no longer have to choose between functionality and beauty. We can have both.</p><p>To solve my problem, I borrowed one of the basic commands of Unix systems: id. The id command is one of the historical pillars of Unix systems, dating back to the early versions in the 1970s. While the better-known whoami command simply returns the account username (for example, &quot;antonio&quot;), the id command has a more ambitious purpose: displaying complete information about the current user&#39;s identity within the system, a fundamental concept in a multiuser environment like Unix. When you run id without any parameters, you get a line packed with information:</p><p><em>uid=501(antonio) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin)…</em></p><p>But if you add the -F option, the command becomes</p><pre>id -F</pre><p>and <strong>simply returns the full name of the currently logged-in user</strong>, the one you configured in macOS <strong><em>System Preferences</em></strong>. This can be just your first name, the classic first and last name combination, a nickname that represents you, or any other combination you prefer.</p><p>Using the id -F command does not pose any privacy risks because it does not access sensitive information, does not send data externally, does not require administrator privileges, and works completely offline.</p><h3>Step-by-Step Configuration</h3><h4>1. Launching GeekTool</h4><p>After installing GeekTool, launch it from the Applications folder. The main interface displays four available types of Geeklets: <strong>Shell</strong>, <strong>Web</strong>, <strong>Log</strong>, and <strong>Image</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/780/0*07EoAb6G-_trXCcH.png" /></figure><h4>2. Creating the Shell Geeklet</h4><p>To display the username, we’ll use a <strong>Shell Geeklet</strong>:</p><ol><li>Drag the “Shell” icon from the main panel onto the desktop</li><li>The properties window will open automatically</li><li>In the “<strong>Command</strong>” field, enter: id -F</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/311/0*uIhq74SEKNOEnRhL.png" /></figure><p>The properties window offers numerous customization options:</p><h4>Basic Settings</h4><ul><li><strong>Name</strong>: Assign a descriptive name (e.g., “Username”)</li><li><strong>Position</strong>: Define the X and Y coordinates for positioning</li><li><strong>Size</strong>: Set the width and height of the display area</li></ul><h4>Automatic Refresh</h4><ul><li><strong>Refresh every</strong>: Set the refresh interval in seconds (since the username is a static value, you can set it to 0 seconds)</li><li><strong>Timeout</strong>: Maximum time allowed for the command to execute (you can also set this to 0 seconds)</li></ul><h4>Visual Customization</h4><p><strong>Fonts and Sizes</strong>:</p><p>Choose a readable font with an appropriate size. Consider Arial or Helvetica for maximum readability. Recommended sizes are 14–18 pt for optimal visibility.</p><p><strong>Colors</strong>:</p><p>Choose a color that contrasts well with your desktop background. White or black are safe choices for most backgrounds. In particular, for <strong>dark backgrounds</strong>, use white text or light colors. For <strong>colorful backgrounds</strong>, consider adding a shadow or outline to ensure readability, while for <strong>patterned backgrounds</strong>, position the text in areas with consistent colors.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/330/0*DPBVtSeGiqZtJU3Y.png" /></figure><p><strong>Positioning</strong>:</p><p>I recommend placing it <strong>in the upper-right or upper-left corner</strong> (a classic, unobtrusive choice), or at the top center for maximum visibility.</p><h4>Advanced Options</h4><p><strong>Output Encoding</strong>: Keep UTF-8 to support special characters and accents (important for names containing non-ASCII characters).</p><p><strong>Alignment</strong>: Left, center, or right, depending on your chosen position. Right alignment works particularly well in the upper-right corner.</p><h4>3. Managing Groups</h4><p>GeekTool allows you to <strong>organize Geeklets into groups</strong>. Create a group called “<em>Desktop</em>” to organize all your informational widgets. This is useful for creating different profiles for different users and for easily enabling or disabling multiple Geeklets at once directly from the menu bar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/191/0*Ydx60PPWtFBl9IMu.png" /></figure><h3>Advanced Customizations</h3><h4>Advanced Visual Styling</h4><p>For a more refined appearance, consider these options that display additional information.</p><p>Command with the computer name:</p><pre>echo &quot;👤 $(id -F) | 💻 $(hostname)&quot;</pre><p>Command with the current time (in this case, set a refresh interval of 60 seconds and avoid excessively short intervals that could affect performance):</p><pre>echo &quot;$(id -F) • $(date &#39;+%H:%M&#39;)&quot;</pre><p>Command with the date and time:</p><pre>echo &quot;👤 $(id -F) | 🕐 $(date &#39;+%H:%M&#39;) | 📅 $(date &#39;+%m/%d&#39;)&quot;</pre><p>Command with available disk space:</p><pre>echo &quot;👤 $(id -F) | 💾 $(df -h / | awk &#39;NR==2{print $4}&#39;) free&quot;</pre><p>Command with CPU usage:</p><pre>echo &quot;👤 $(id -F) | 🖥️ $(top -l 1 | grep &quot;CPU usage&quot; | awk &#39;{print $3}&#39;) CPU&quot;</pre><h3>Conclusions</h3><p>Implementing a <strong>user identification system with GeekTool</strong> is an elegant and practical solution for multiuser macOS environments. The simplicity of the id -F command, combined with GeekTool&#39;s flexibility, offers endless customization possibilities, <strong>transforming the desktop from a simple collection of icons into a customizable information dashboard</strong>.</p><p>Implementing this system provides <strong>immediate and tangible benefits</strong>. From a practical standpoint, it helps prevent mistakes when managing personal files and sensitive documents, and instantly eliminates confusion about which account is currently active. This is particularly useful in <strong>family environments where parents and children share the same iMac or MacBook</strong>, in <strong>offices with shared workstations</strong>, in <strong>computer labs and educational environments</strong>, or for anyone who wants a more informative and personalized desktop.</p><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/10/26/personalizzare-gli-spazi-su-macos-multiutente-col-proprio-nome-usando-geektool/"><em>https://www.levysoft.it</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=699cb8228fc1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WP Curl Terminal: The WordPress Plugin for Reading Articles Directly from the Terminal with cURL]]></title>
            <link>https://levysoft.medium.com/wp-curl-terminal-the-wordpress-plugin-for-reading-articles-directly-from-the-terminal-with-curl-5eab62a505ac?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/5eab62a505ac</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[curl]]></category>
            <category><![CDATA[wordpress]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[wordpress-plugins]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Sun, 25 Oct 2026 15:20:54 GMT</pubDate>
            <atom:updated>2026-10-25T15:20:54.343Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BRsXahpLB5yqfCgr-dhiNA.png" /></figure><p>A few days ago, while browsing <a href="https://news.ycombinator.com/item?id=50093612">Hacker News</a>, I came across an article titled <a href="https://nytpu.com/gemlog/2026-03-18">Fancy Curl Sites</a>, written by Alex, better known online as <em>nytpu</em>. The article described a rather curious experiment: <strong>making a website accessible directly from the terminal using</strong> curl, the command-line tool we normally use to make HTTP requests, download files, or query APIs. I opened Terminal on my Mac and typed curl nytpu.com, <strong>only to find myself looking at a homepage completely different from the one displayed in a browser</strong>: a large ASCII logo, colored text, a short introduction to the author, and a series of commands for exploring other sections of the website. What made it particularly interesting was that I could simply request a blog post using the same command and read its contents directly in the terminal, with headings, paragraphs, and links formatted for readability.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*FULF2R2EQADqiEFF.jpg" /></figure><p>In his article, Alex explains that he manually created some of the pages, writing the ANSI control sequences used by terminals to manage colors and formatting directly into the files. For his blog posts, however, he took advantage of a feature of <em>Gemroff</em>, the markup language he had developed years earlier, which already supported generating text with <a href="https://en.wikipedia.org/wiki/ANSI_escape_code">ANSI escape codes</a> to preview drafts in the terminal. This made it relatively straightforward to add the format to his static site generator, which was already publishing content over HTTP, Gemini, and Gopher. Alex himself acknowledges that the original idea was not his: he explicitly credits the earlier experiments at <a href="https://trinkey.com/">trinkey.com</a> and <a href="https://proot.party/">proot.party</a>, which inspired his implementation.</p><p>What I particularly liked was how a <strong>website could adapt to the program being used to access it</strong>. We are accustomed to thinking of web pages as HTML documents intended for browsers, complete with CSS, JavaScript, images, and graphical components, whereas in this case <strong>the same URLs become accessible through a text-based interface that preserves only the information needed for reading</strong>. There is also a nostalgic element that reminded me of the days of BBS systems and text-based interfaces, when a screen full of characters and a few colors were enough to give a service its own recognizable identity. That led me to wonder <strong>whether I could do something similar with Levysoft, which runs on WordPress and is hosted on an ordinary shared hosting service</strong>, where I can upload files via FTP but have neither SSH access nor permission to modify the web server configuration.</p><h3>The WordPress Plugin</h3><p>The solution came from combining PHP with the WordPress plugin system. I developed <strong>WP Curl Terminal</strong>, a small <strong>plugin that intercepts requests to the website and checks whether they originate from</strong> curl, by examining the HTTP User-Agent header. When it recognizes the client, <strong>WordPress returns a text-based representation of the content, using ANSI codes for colors</strong>; requests from regular browsers, meanwhile, continue to be handled by the theme without any changes. The entire mechanism <strong>works through ordinary HTTP and HTTPS connections</strong>, without opening additional ports, enabling Telnet services, or installing software on the server.</p><p>You can try it directly from macOS or Linux by typing:</p><pre>curl -L https://www.levysoft.it/</pre><p>Instead of the traditional homepage, an ASCII logo of Levysoft appears, accompanied by the motto <em>Rev0lut1on 3.0 of my mind engine</em>, followed by a list of the latest published posts, their dates, and the URLs needed to read them. The titles are retrieved directly from the WordPress database through its native functions, so every newly published post automatically appears in the terminal version as well.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*2jee6Mbmp1FQwcke.jpg" /></figure><p>The first implementation, however, had an obvious drawback: by attempting to convert the entire HTML page generated by the theme, it ended up including menus, widgets, categories, previews, author information, and repeated links. A simple request to the homepage produced more than 500 lines of text, most of which were of little use. I therefore changed the plugin’s logic so that it would <strong>retrieve post data directly, bypassing the graphical structure of the theme</strong>. The homepage became much more compact, with a configurable number of posts and a small section containing commands for exploring the blog.</p><p>For <strong>full-length articles</strong>, the behavior is slightly different. When requesting a post URL with curl, the plugin <strong>reads the content stored in WordPress and converts it into text</strong>, preserving the original structure as much as possible: headings and subheadings are distinguished from paragraphs, while <strong>unordered lists</strong> (ul) and <strong>ordered lists</strong> (ol) retain their structure and are highlighted using ANSI colors.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*bbWZOby-lnNYKDUe.jpg" /></figure><p><strong>Blockquotes also receive specific formatting, while code blocks preserve their indentation</strong>, a particularly important detail for a blog like Levysoft, where I frequently publish PHP and Python examples, along with terminal commands.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*tywoK3Q3sMT7kyf1.jpg" /></figure><p><strong>HTML links are converted into text accompanied by their corresponding URLs, while images can be represented through their alternative text</strong>. To improve readability, <strong>paragraphs are also wrapped to approximately 76 columns</strong>, leaving code blocks untouched.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*09ggAglUeTtN_ZCE.jpg" /></figure><p>The conversion inevitably has some limitations: interactive components, content dynamically generated by plugins, and particularly elaborate layouts cannot always be faithfully represented in a terminal. I also decided to avoid executing shortcodes and dynamic blocks during conversion, keeping this mode as focused as possible on reading already published content.</p><h3>Why Use the -L Option with cURL</h3><p>The -L option used in the previous commands <strong>allows cURL to automatically follow HTTP redirects</strong>, which is particularly useful when a website <strong>redirects requests from HTTP to HTTPS</strong>. Without this option, cURL simply displays the server&#39;s response, without necessarily reaching the requested content. For example, when trying to access a Levysoft page over HTTP:</p><pre>curl http://www.levysoft.it/<br><br>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;<br>&lt;html&gt;&lt;head&gt;<br>&lt;title&gt;301 Moved Permanently&lt;/title&gt;<br>&lt;/head&gt;&lt;body&gt;<br>&lt;h1&gt;Moved Permanently&lt;/h1&gt;<br>&lt;p&gt;The document has moved &lt;a href=&quot;https://www.levysoft.it/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;<br>&lt;hr&gt;<br>&lt;address&gt;Apache Server at www.levysoft.it Port 80&lt;/address&gt;<br>&lt;/body&gt;&lt;/html&gt;</pre><p>By adding -L, however, cURL follows the redirect and reaches WordPress, allowing WP Curl Terminal to return the formatted content.</p><p>The same problem occurs when simply typing curl levysoft.it without specifying the protocol, because cURL normally attempts an HTTP connection. When using curl https://www.levysoft.it/ directly, however, the content is displayed correctly even without -L, since the requested address is already the final destination. I nevertheless decided to keep this option in the examples: when no redirects are involved, it does not generate additional HTTP requests and makes the commands usable on WordPress websites with different configurations.</p><h3>Paginating cURL Output in macOS Terminal Using less Instead of more</h3><p>When browsing WordPress blog posts directly from Terminal through <strong>WP Curl Terminal</strong>, you may <strong>come across particularly long articles</strong> that scroll quickly across the screen, making them difficult to read. The most obvious solution would be to append | more to the command, allowing the text to be displayed one screen at a time:</p><pre>curl -L https://www.levysoft.it/ | more</pre><p>Unfortunately, there is a drawback: on macOS, more <strong>may display the ANSI control sequences used by the plugin to color headings, section titles, and other text elements literally</strong>. As a result, you may end up with output resembling this:</p><p>% Total % Received % Xferd Average Speed 100 3434 0 3434 0 0 2682 ESC[1;36m# ##### # # # # #### ### ##### #####ESC[0m ESC[1;33mLevysoftESC[0m ESC[2;37mRev0lut1on 3.0 of my mind engineESC[0m ESC[1;33mULTIMI ARTICOLIESC[0m ESC[1;33m 1 19/10/2026 AnthemScore 6: dall’audio allo spartito…ESC[0m</p><p>The strings ESC[1;36m, ESC[1;33m, and ESC[0m represent the <strong>ANSI sequences that the terminal normally interprets</strong> to apply colors and text attributes. When displayed as ordinary characters, however, they <strong>make the output harder to read</strong> and defeat much of the formatting provided by the plugin. That is why I prefer using less <strong>instead of</strong> more, adding the -R option, which allows ANSI color sequences to be interpreted correctly:</p><pre>curl -L https://www.levysoft.it/ | less -R</pre><p>This way, <strong>the content retains its original color formatting and becomes much easier to navigate</strong>: we can move forward and backward through the screens using Space and b, scroll one line at a time with the arrow keys, search for a word by typing / followed by the desired term, and immediately jump to the beginning or end of the article with g and G. To exit, simply press q.</p><p>There is, however, a small inconvenience: when we exit less by pressing q, Terminal generally restores the previous screen, causing the content we were reading to disappear. <strong>If we want to keep the displayed text visible</strong> even after exiting less, <strong>we can add the</strong> -X <strong>option</strong>:</p><pre>curl -L https://www.levysoft.it/ | less -RX</pre><p>The -X option prevents less from using the terminal initialization and restoration sequences, generally allowing the displayed content to remain visible after the program closes.</p><p>Alternatively, you can replace curl -L with curl -fsSL: the -s option hides the transfer progress meter, -S keeps error messages visible, -f makes cURL fail on HTTP error responses such as 404 and 500, normally without displaying their response bodies, while -L, as explained earlier, automatically follows redirects.</p><pre>curl -fsSL https://www.levysoft.it/ | less -RX</pre><p>Ultimately, <strong>this command makes reading long articles from the terminal much more convenient for me</strong>: I can take my time, quickly search for the passages I am interested in, and preserve WP Curl Terminal’s ANSI colors without having to deal with uninterpreted control sequences.</p><h3>The Same URL, Different Ways to Read</h3><p>One feature I wanted to preserve from nytpu’s experiment was the <strong>ability to explicitly request the original HTML version</strong>. By using:</p><pre>curl -L -H &quot;X-Original: true&quot; https://www.levysoft.it/</pre><p>the plugin allows WordPress to return the normal web page. The same result can be obtained by specifying Accept: text/html, while the ANSI version can be explicitly requested using Accept: text/x-ansi, regardless of automatic client detection. A plain-text version without color sequences is also available by running:</p><pre>curl -L &#39;https://www.levysoft.it/?terminal=plain&#39;</pre><p>which is useful when reading the output in an environment that does not interpret ANSI codes.</p><p>I also added more refined formatting, several color schemes, and text-based navigation that makes it possible to access articles, categories, and search results. The plugin also supports WordPress archives.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*GxUiN9Y_V_4D0W8l.png" /></figure><p>When a nonexistent URL is requested, WP Curl Terminal also returns a 404 error message formatted for the terminal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*Uz8v4zZs-gFDOw1H.jpg" /></figure><p>Another feature I particularly cared about was the <strong>ASCII logo</strong>, which I initially created specifically for Levysoft, but which would have been a problem for anyone wanting to use the plugin on their own blog. I therefore introduced a system that <strong>automatically generates the banner from the website title configured in WordPress, adapting it to an ASCII representation</strong> and using a simpler heading when the name is too long or contains unsupported characters. This way, every installation has its own identity, without requiring any changes to the PHP code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*W7xJ61LTlCNABOau.jpg" /></figure><h3>Plugin Settings</h3><p>Everything is <strong>configurable through a settings page in WordPress</strong>, where you can enable automatic curl detection, choose the color scheme, specify how many posts to display on the homepage, and decide whether to show full URLs. Preferences are stored in the WordPress options table using a single record identified as wct_settings, allowing them to be preserved during updates and plugin deactivation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1001/1*wLpyG_oVH8Pme0sY_TBCOQ.jpeg" /></figure><p>I also implemented an <strong>uninstallation procedure</strong> through uninstall.php: when the plugin is deleted from the WordPress administration panel, its settings are removed from the database, preventing unused data from being left behind. The procedure also takes multisite installations into account, where options may belong to multiple websites within the same WordPress network.</p><p>To make WP Curl Terminal usable beyond Levysoft, I <strong>introduced multilingual support</strong>, initially for Italian and English, taking advantage of WordPress’s built-in internationalization system. English is the plugin’s original language, while Italian translations are <strong>distributed through the standard</strong> .po <strong>and</strong> .mo <strong>files, accompanied by a</strong> .pot <strong>file that can be used as a template for additional translations</strong>. Interface strings are handled through native WordPress functions and the wp-curl-terminal <em>text domain</em>, so <strong>the language is selected automatically according to the WordPress installation&#39;s language settings</strong>, without requiring a separate language selector in the plugin settings. Translation covers the administration panel, messages, headings, and navigation instructions displayed in the terminal; article titles and content naturally remain in the language in which they were published. I chose this approach also <strong>to allow other developers to contribute additional translations</strong> without modifying the PHP logic directly.</p><p>From a technical standpoint, the plugin uses the standard WordPress mechanisms to select the appropriate response template, <strong>without modifying theme files or</strong> .htaccess <strong>rules</strong>. <strong>It does not create permanent copies of articles or require additional database tables</strong>: the <strong>text-based representation is generated when the request is received</strong>. I also implemented HTTP headers to distinguish responses intended for different clients and limit their caching. This aspect still requires attention when using CDNs or server-level caching systems, because a cache that intercepts requests before WordPress executes could return the wrong version of the page.</p><p><strong>Using the terminal does not provide remote access to the machine hosting the website</strong>. curl remains a normal HTTP client and receives only a response generated by the server; there is no interactive session in which a visitor can execute commands. The usual security considerations for any PHP plugin still apply, from verifying which content is publicly accessible to controlling automated requests, which is particularly important on shared hosting.</p><h3>Plugin Download and Source Code</h3><p>I decided to release <strong>WP Curl Terminal as an open-source plugin</strong>, so it can also be installed on other WordPress blogs. The plugin is independent of the website’s name, automatically generates its own ASCII logo, and includes Italian and English translations. It does not require any special server configuration and is compatible with WordPress 6.0 or later and PHP 7.4 or later.</p><p>For anyone who wants to try it, I have prepared a ready-to-install ZIP package, which can be downloaded directly here: <a href="https://www.levysoft.it/plugin_levysoft/wp-curl-terminal-v1.2.1.zip">wp-curl-terminal-v1.2.1.zip</a>.</p><p>Simply open the WordPress administration panel, go to <strong>Plugins → Add New Plugin → Upload Plugin</strong>, select the downloaded file, and activate it. The options are available under <strong>Settings → Curl Terminal</strong>, which can also be accessed through the direct link in the list of installed plugins.</p><p>I have also published the <a href="https://github.com/levysoft/wp-curl-terminal">source code on GitHub</a>, together with documentation in Italian and English, translation files, and instructions for using the plugin. The latest available version can be downloaded from the <a href="https://github.com/levysoft/wp-curl-terminal/releases/latest">Releases</a> section, while anyone wishing to contribute to development or report problems can do so directly through the repository.</p><p>The project is distributed under the <strong>GPL-2.0-or-later</strong> license. As with the other plugins I have developed for Levysoft, I also made sure that settings are removed from the database when the plugin is permanently deleted from WordPress, so that no unused data remains after uninstallation.</p><h3>Conclusion</h3><p>The discussion on <a href="https://news.ycombinator.com/item?id=50093612">Hacker News</a> also introduced me to other interpretations of the same idea. Some developers have created curl-compatible pages using only static files and ANSI sequences that take advantage of the terminal’s alternate screen buffers, achieving similar results even on services such as GitHub Pages, where PHP code cannot be executed. Others prefer to make their content available in Markdown through the HTTP Accept header, making it easily readable by programs that do not use a browser. These are different approaches, all based on the possibility of delivering the same content in representations suited to different tools.</p><p>For me, <strong>WP Curl Terminal was born primarily out of curiosity about whether Alex’s experiment could be reproduced on an existing WordPress installation</strong>, without changing the infrastructure or maintaining two separate versions of the blog. The answer was yes: Levysoft continues to work normally in browsers, while <strong>terminal users can explore its articles through a dedicated interface</strong>, one that is more streamlined and closer to the style of old text-based services. Making the plugin independent of the website’s name and language also allows me to share it with other WordPress bloggers who want to experiment with the same way of accessing content, even on ordinary shared hosting.</p><p>The experiment also gave me an opportunity to revisit an aspect of the Web that we tend to take for granted: <strong>HTTP allows content to be separated from its representation, and a single URL can be useful to very different kinds of programs</strong>. In Levysoft’s case, I used this capability to <strong>add a small alternative interface to the blog</strong>, which I intend to keep using, if only for the pleasure of being able to read my own articles directly from a Terminal window.</p><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/10/25/wp-curl-terminal-il-plugin-wordpress-per-leggere-gli-articoli-dal-terminale-con-curl/"><em>https://www.levysoft.it</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5eab62a505ac" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AnthemScore 6: From Audio to Sheet Music, How AI Can Help Us Rediscover Written Music]]></title>
            <link>https://levysoft.medium.com/anthemscore-6-from-audio-to-sheet-music-how-ai-can-help-us-rediscover-written-music-590000d0a458?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/590000d0a458</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[music]]></category>
            <category><![CDATA[mp3]]></category>
            <category><![CDATA[midi]]></category>
            <category><![CDATA[suno-ai]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Mon, 19 Oct 2026 14:44:09 GMT</pubDate>
            <atom:updated>2026-10-20T17:05:33.098Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*EdNo3WIJxnNn56rS.jpg" /></figure><p>For some time now, I’ve been interested in exploring an aspect of music production that is becoming particularly fascinating with the growing popularity of generative AI tools: the <strong>possibility of recovering an editable musical representation from an audio recording</strong>. Today, we can generate a composition, modify its sound, create arrangements, and produce a complete audio track without necessarily writing down individual notes. The problem arises when we want to reverse the process, perhaps because we like a melody and would like to <strong>learn to play it on the piano</strong>, modify its chords, or study its structure. An MP3 file contains the audible result of a performance, but it does not explicitly preserve which notes were played, how long they lasted, or how they were distributed among different instruments. It was precisely this transformation, from audio to its musical representation, that led me to explore <a href="https://lunaverus.com/">AnthemScore 6</a>, an application developed by Lunaverus that <strong>uses AI models to recognize the notes in a recording</strong> and reconstruct them as <strong>sheet music, MIDI, or MusicXML</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*EwP-lfcC8vW4wDrz.png" /></figure><h3>How Music Transcription Works</h3><p><a href="https://lunaverus.com/">AnthemScore</a> is available for <strong>Windows, macOS, and Linux</strong> and can analyze recordings in the most common formats, including <strong>MP3, WAV, FLAC, and OGG</strong>. The application can <strong>run locally on your computer</strong>, without requiring you to upload songs to a remote service, a valuable feature when working with <strong>personal compositions or unreleased material</strong>.</p><p>After importing a file, the program analyzes the audio content and <strong>represents its frequencies through a spectrogram</strong>, a visualization in which the horizontal axis represents time, the vertical axis represents frequency, and signal intensity is indicated by color.</p><p>The <strong>recognized notes are overlaid on this representation, where they can be added, deleted, moved, or adjusted in duration</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*AMNa0UGV-_6H8Z-y.png" /></figure><p>The advantage is that you can continuously compare what the program has identified with what is actually present in the recording, <strong>listening to the original track, the reconstructed notes, or both simultaneously</strong>.</p><p>The technical principle behind note recognition is particularly interesting and is clearly explained in an <a href="https://lunaverus.com/cnn">in-depth article published by the developer in 2016</a>: <strong>music transcription was described as a problem similar to image recognition</strong>, because a spectrogram contains visual patterns corresponding to the fundamental frequencies and harmonics produced by musical instruments. A <strong>convolutional neural network</strong> can learn to recognize these patterns and associate them with specific musical pitches, even when multiple notes are played simultaneously.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*cqXu_c-J_bo536hm.png" /></figure><p>The architecture described at the time had been trained using approximately 2.5 million examples derived from 3,000 MIDI files, which were synthesized into audio to obtain training data with known reference notes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*shWJp8-FCsgWtbX7.jpg" /></figure><p>There is also an additional challenge related to the physics of sound. When a piano plays <strong>middle C</strong>, the string produces a <strong>fundamental frequency of approximately 261.6 Hz</strong>, along with a series of harmonics, including frequencies close to 523.3 Hz and 784.9 Hz. Some of these coincide with the fundamental frequencies of other musical notes: a recognition system must therefore avoid interpreting every spectral peak as a note that was actually played. The situation becomes more complicated when chords, reverb, sustain pedal, overlapping instruments, or compressed recordings are involved. <strong>Two notes may share some of their harmonics</strong>, while the lingering sound of a previous note may still be present even after the musician has changed chords. <strong>The fact that AnthemScore displays the spectrogram during editing makes this problem at least possible to inspect</strong>, allowing musicians to intervene when the results are uncertain.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*lEUDKyyby58n5JAf.jpg" /></figure><p>With the <a href="https://www.reddit.com/r/anthemscore/comments/1tasgv6/anthemscore_60_release/">release of AnthemScore 6 in May 2026</a>, Lunaverus introduced <strong>a new note recognition model</strong>, continuing its efforts to improve the musical transcription algorithms. Subsequent updates also focused on reconstructing the musical structure of a piece: <a href="https://lunaverus.com/versionHistory">version 6.2</a>, released in September 2026, introduced <strong>a new neural network for detecting beats, bar boundaries, and time signatures</strong>, while version 6.3 improved melody recognition, rhythmic note alignment, and the distribution of piano parts.</p><p>Lunaverus has not yet published a technical explanation of its current neural network architectures as detailed as the one from 2016, but the <a href="https://lunaverus.com/versionHistory">version history</a> shows how development has increasingly focused on the quality of musical notation, which is essential for turning recognized notes into a genuinely readable score. <strong>The Lunaverus team has also confirmed to me that a further improvement in melody recognition is planned</strong>, although they have not yet provided a specific release date.</p><h3>From Suno to AnthemScore: The Desire to Play and Preserve Your Own Creations</h3><p>One of the creative activities I’ve particularly enjoyed recently is making songs with <a href="https://suno.com/">Suno</a>, experimenting with lyrics, musical genres, arrangements, and increasingly precise prompts. I often get compositions that surprise me with the quality of their melodies, chord progressions, or certain instrumental passages, to the point where I want not only to listen to them again but also to <strong>play them myself on the piano and preserve them as sheet music</strong>. This is exactly what led me to AnthemScore: I want to <strong>recover the musical structure of my creations</strong>, ideally <strong>through a solo piano arrangement that preserves the main melody</strong>, harmony, and rhythmic characteristics while removing unnecessary elements of the original arrangement.</p><p>With Suno, I can try to achieve this through the <a href="https://help.suno.com/en/articles/2872257">Cover</a> feature, asking it to reinterpret an existing song using an acoustic piano, without vocals, percussion, or other instruments, while attempting to preserve the original melody and chord progression. Prompts can also be used to discourage virtuoso passages, ornaments, complex chords, and excessively fast sections, particularly when the goal is to produce a recording that can be transcribed easily. For example, <strong>to isolate a simple melodic line</strong>, I use instructions such as these:</p><blockquote>solo piano melody, clean acoustic grand piano, right hand melody only, monophonic melody, single notes only, one note at a time, no chords, no harmony, no accompaniment, no left hand, no bass notes, no arpeggios, no ornaments, no improvisation, beginner friendly, easy to play, simple melodic phrases, 120 BPM, fixed tempo, strict metronome, 4/4 time signature, quantized notes, constant velocity, precise note timing, clear note separation, no overlapping notes, no sustain pedal, no reverb, no delay, no effects, no background noise, no other instruments, no percussion, MIDI compatible, easy MIDI transcription</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*XbhWYV8sA24Cuyqh.png" /></figure><p>The <a href="https://help.suno.com/en/articles/3161921">Exclude</a> feature allows you to specify additional elements to leave out, although the result remains probabilistic: Suno may change some notes, introduce harmonic variations, or alter the rhythm, making it necessary to compare different versions to identify the most faithful one. An alternative is <a href="https://help.suno.com/en/articles/13925185">stem extraction</a>, which separates individual audio components such as vocals, drums, bass, and keyboards. This solution is useful when a song already contains an interesting piano part, but isolating an instrument is not the same as reducing an entire arrangement to piano: if the main melody is carried by the vocals, for example, it may not appear in the keyboard track. In that case, a musical reinterpretation is needed to transfer the vocal melody to the piano and reorganize the accompaniment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*tGCROXc66-_n0GiH.png" /></figure><p>You can also <strong>start completely from scratch</strong>, asking Suno to <strong>compose a piano piece specifically designed for someone learning to play</strong>. In this case, the prompt can specify duration, tempo, technical difficulty, and how the notes should be distributed between the hands: for example, a composition lasting approximately 30 seconds, between 65 and 75 BPM, with a simple melody played mainly by the right hand and a left-hand accompaniment limited to a few bass notes, avoiding complex chords, arpeggios, and excessively wide intervals. These are, of course, approximate guidelines that Suno is not guaranteed to follow precisely. One prompt I use for this type of experiment is the following:</p><blockquote>Compose a beautiful 30-second solo piano piece, catchy and engaging, specifically designed for an absolute beginner. Slow tempo (65–75 BPM), simple and memorable melody, mainly single notes played with the right hand, very easy left-hand accompaniment with occasional single bass notes. Use only a few notes, small intervals, simple rhythms, and no fast passages, complex chords, arpeggios, or difficult techniques. Make the melody immediately recognizable, sweet, playful, and emotionally engaging. Clear pauses between phrases, gentle dynamics, and a satisfying ending. Acoustic piano only, no vocals, no other instruments.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*jtJpFlCJnhJgfDL2.png" /></figure><p>Once I have a satisfactory recording, <a href="https://lunaverus.com/">AnthemScore 6</a> comes into play: <strong>the goal is to recognize the notes actually played, their durations, the musical tempo, and their distribution between the right and left hands, while limiting manual work to the corrections that are truly necessary</strong>. Through the <strong>MusicXML</strong> format, I can transfer the score to <a href="https://musescore.org/">MuseScore</a>, refine the notation, key signature, and measures until I obtain a printable <strong>PDF</strong>, while <strong>MIDI</strong> allows me to edit individual notes or play them using other virtual pianos. Having an <strong>editable score also means being able to study difficult passages, slow them down, and simplify chords</strong> when the generated composition turns out to be more challenging than expected. AnthemScore also offers <strong>different arrangement levels</strong> that can make a piece more accessible without excessively compromising its recognizability.</p><p>I’m also interested in <strong>building a personal collection of sheet music from my most successful compositions</strong>, preserving the PDF, MIDI, MusicXML, and perhaps the original recording for each one. <strong>An audio file documents a particular performance, while a corrected score allows the same composition to be studied, reinterpreted, and played using different instruments</strong>. What I particularly like is the idea of printing a melody that originated from a prompt, placing it on the music stand, and trying to perform it myself, without depending on the recording generated by Suno.</p><p>It is worth noting that <a href="https://help.suno.com/en/articles/13670529">Suno Studio 2.0</a> already supports converting audio tracks into MIDI, but this feature is reserved for <strong>Premier</strong> subscribers. Suno Pro users, on the other hand, can export recordings in WAV format and extract stems, then rely on AnthemScore for transcription to obtain MIDI, MusicXML, and PDF files without subscribing to the higher-tier plan. It would be interesting to compare the results of the two systems in the future, evaluating which one recognizes notes more accurately, preserves their rhythmic structure, and requires fewer corrections to produce a readable score. For now, <strong>I want to understand how much AnthemScore can help me transform compositions created with Suno into musical material that I can study and preserve</strong>, knowing that sustain pedal, complex chords, and expressive variations may still require manual adjustments.</p><h3>Putting AnthemScore 6 to the Test: From MP3 to Sheet Music</h3><p>To put <a href="https://lunaverus.com/">AnthemScore 6</a> to the test, I decided to start with a <strong>piano composition created specifically with Suno</strong>, titled <em>Little Keys, Big Dreams</em>, with the intention of producing a simple, pleasant melody that could ideally be played even by someone learning the piano.</p><p>Listen to: <a href="https://www.levysoft.it/wp-content/uploads/2026/10/Little-Keys-Big-Dreams.mp3"><em>Little Keys, Big Dreams</em></a></p><p>The result was an MP3 recording lasting approximately 56 seconds, which I initially opened in <a href="https://www.ocenaudio.com/">ocenaudio</a> to examine its waveform and overall structure.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*1mV6yCYF43e4Pbqk.png" /></figure><p>At this stage, I was mainly interested in using the recording exactly as it had been generated, without manually reconstructing the notes or making preliminary changes to the musical content, to see what AnthemScore could produce from the audio alone.</p><p>The first step in AnthemScore is quite straightforward: using the <strong>Open command</strong>, you select the file to analyze and access a window where you can choose whether to process the entire song or only a specific time interval, defining its start and end points.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*vCEzxGCRpMz02L-8.png" /></figure><p>This option can be useful with particularly long recordings or when you only want to transcribe a specific passage, avoiding unnecessary use of memory and processing power. The same window contains three processing options: <em>Find Notes</em>, which starts musical note recognition; <em>Automatic Instrument Detection</em>, which attempts to distinguish the different instrumental components in the recording; and <em>Percussion Detection</em>, dedicated to identifying rhythmic sounds such as kick drums, snares, and cymbals. In my case, since I was working with a solo piano piece, I selected the entire song and left only note recognition enabled. For recordings containing multiple instruments, the other two options can help organize the recognized material into separate parts, although their effectiveness depends on the complexity and quality of the original audio signal.</p><p><strong>Processing is performed using the computer’s own resources, and the time required depends on the length of the recording</strong>, the complexity of the audio content, and the analyses being performed. For a short piano piece like the one chosen for this test, processing is relatively manageable, while longer recordings or particularly complex arrangements may require more processing time and computing resources.</p><p>Once processing is complete, AnthemScore presents a rather technical interface, which at first glance may resemble a MIDI editor but actually contains much more information.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*zWVESLI_OsVllojO.png" /></figure><p>The central area of the window is occupied by the <strong>spectrogram</strong>, with time arranged horizontally and frequencies organized vertically according to a musical scale. On the left is a <strong>piano keyboard that makes it easy to associate each vertical position with a specific pitch</strong>. The <strong>colored regions show the energy present at different frequencies</strong>: in the Rainbow color palette used during my test, <strong>the display ranges from blue shades in less intense areas to brighter colors corresponding to more prominent sound components</strong>. Over this representation, <strong>AnthemScore places the notes identified by the algorithm, displaying them as horizontal bars that indicate pitch, starting time, and duration</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*I7sCuOQndfUQEhiX.png" /></figure><p>This overlay is one of the features I find most interesting about the program because it allows you to <strong>observe the audio signal and its musical interpretation at the same time</strong>. A bright line in the spectrogram may correspond to the fundamental frequency of a note, but it could also represent one of its harmonics, and the system must determine which components correspond to musical events that were actually performed. In a piano piece, particularly when the sustain pedal is used or chords overlap, the frequencies of one note may remain present even after the next note begins. AnthemScore attempts to reconstruct these events, but <strong>still allows you to visually check where a note has been placed and whether its duration appears consistent with the recording</strong>. The vertical lines crossing the spectrogram represent the detected temporal structure, divided into beats and measures: this is the information the program uses to derive the rhythmic notation of the score.</p><p>On the left is a control panel that, when advanced mode is enabled, provides several tools for adjusting the results. The <strong>playback section allows you to listen to the original file, the reconstructed notes through a MIDI synthesizer, or both sources simultaneously</strong>. The latter mode is particularly useful because it makes it possible to directly compare the recording with the transcription, identifying missing notes or sounds that have been added incorrectly. You can <strong>change the playback speed without affecting pitch</strong>, adjust the volumes separately, and restrict playback to a selected region. You can also <strong>enable continuous repetition of a passage (Loop)</strong> by selecting a region of the spectrogram, choosing the appropriate playback mode, and activating the button identified by two circular arrows in the side panel. I find this especially useful for <strong>examining a difficult musical phrase: listening to it repeatedly while observing the spectrogram makes it easier to identify possible errors and understand where adjustments are needed</strong>. The selection can also be restricted to a specific frequency range, allowing you to use the <em>Selected Frequencies</em> option to focus, for example, on the lower register of the piano while reducing the higher-frequency components of the recording. These tools are reminiscent of those traditionally used for music transcription by ear, where slowing down, repeating, and isolating specific passages helps identify individual notes and reconstruct the musical structure.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*yCk90P319kldxbR8.png" /></figure><p>The <em>Editor</em> section is divided into three modes, dedicated to notes, measures, and percussion respectively. <strong>In the first mode</strong>, you can <strong>work directly on the bars recognized by the system, adding a missing note, removing a nonexistent one, or changing its position and duration</strong>. Notes can also be selected in groups, copied, moved, or assigned to different instruments through note groups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*XBa4L2jrLR7UJ8Co.png" /></figure><p>One of the most interesting controls is the slider that adjusts the <strong>note recognition threshold</strong>, allowing you to change how many musical events the program considers to be actually present in the audio. A threshold that is too permissive risks introducing nonexistent notes, perhaps interpreting some harmonics as independent sounds, while a threshold that is too restrictive may remove quieter notes, such as those in a softly played accompaniment. The program also allows this adjustment to be applied to a single selected region, avoiding unnecessary changes to the entire composition. According to the <a href="https://lunaverus.com/documentation">Lunaverus documentation</a>, manually applied corrections can also be used to update the recognition of other notes, a feature that should be used carefully because it may affect musical events in different passages. Continuous comparison between the original audio and the reconstructed notes therefore becomes essential to determine whether the changes have actually improved the result.</p><p>In other words, this is not simply a matter of passively accepting a transcription produced by AI: <strong>AnthemScore provides an environment where the algorithm’s decisions can be examined and corrected directly</strong>, without having to immediately export the material to another application.</p><p><strong>The second editor mode</strong> focuses on the <strong>metrical structure of the piece</strong>. Here, you can correct beat positions, measure boundaries, tempo, key signature, and time signature. In my example, AnthemScore detected a tempo of 66 BPM and a 4/4 time signature, values that also appear at the beginning of the generated score. The interface allows you to <strong>manually move the beat lines</strong> if they do not match the performance and choose the grid resolution, including <strong>fine subdivisions such as thirty-second notes</strong>. Controls are also available for editing chords, which can be recognized automatically and then corrected or entered manually.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*t4mzVHpyMqn8T3zj.png" /></figure><p>This is an important step because <strong>a transcription may contain the correct notes but still be difficult to read if their onsets are associated with the wrong beats</strong>, or if small expressive variations are interpreted as unnecessarily complicated rhythmic figures. A pianist, for example, may play a note slightly early, delay a chord, or use <em>rubato</em>, freely modifying the duration of musical phrases. These variations are part of the interpretation, but they do not always need to be reproduced literally on the staff. <strong>AnthemScore allows you to adjust the timing grid and quantization</strong>, the process of rounding musical events to regular rhythmic subdivisions, to obtain a more organized representation when the goal is to produce sheet music that can be read and played.</p><p><strong>The third mode</strong>, identified by a drum icon, is <strong>dedicated to percussion and allows you to edit recognized rhythmic events, such as kick drum, snare, or cymbal hits</strong>. Using the musical grid, you can add or remove individual hits, select and copy entire rhythmic sequences, and adjust their intensity through a MIDI velocity value ranging from 0 to 127.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*rnhU92xPOiRWPNUE.png" /></figure><p>Unlike melodic notes, <strong>percussion events occupy a single position on the grid, while their rhythmic value in the score is derived from the distance between hits</strong>. In my case, since I was working with a solo piano composition, I had disabled percussion recognition during import, which is why the corresponding panel contained no elements to edit.</p><p>Another panel allows you to <strong>configure the spectrogram display</strong>, adjusting its horizontal and vertical scales, intensity levels, and overlaid information. You can <strong>show or hide various graphical elements</strong> to focus, depending on your needs, either on the signal frequencies or on the notes already recognized. The <strong>choice of color palette</strong> can also help distinguish certain sound components, especially in passages where several notes overlap. These are controls that someone who simply wants to generate a PDF quickly will probably use very little, but they become useful when checking a complex transcription and comparing the algorithm’s decisions with the actual content of the recording.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*0OBmsbe6QjzK38nv.png" /></figure><h3>From Recognized Notes to a Musical Score</h3><p>Once you are satisfied with the recognition results, you can <strong>open the sheet music in the built-in viewer</strong>. In the case of <em>Little Keys, Big Dreams</em>, AnthemScore <strong>generated a piano score organized on two staves, one primarily intended for the right hand and the other for the left, using treble and bass clefs</strong>. At the beginning, the score shows <strong>a 4/4 time signature and a tempo of 66 BPM, while chord symbols are also displayed above the measures</strong>.</p><p>In the opening measures, for example, the program identified a harmonic progression including F (F major), G7 (G dominant seventh), Em7 (E minor seventh), Am7 (A minor seventh), and Dm7 (D minor seventh), followed by chords such as Csus4 and Gsus4, respectively C and G with a suspended fourth. The symbols follow <strong>international chord notation</strong>, in which <strong>the letters A through G identify the musical notes</strong>, while additional symbols indicate specific chord characteristics: the letter <em>m</em> identifies a minor chord, the number 7 indicates the presence of a seventh, and <em>sus4</em> means that the third has been replaced by the fourth. Suspended chords have a distinctive sound because, without the third, they are neither strictly major nor minor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*UbeDpvdp-zTqFvsR.png" /></figure><p>It is interesting to see how a recording initially available only as an MP3 can be transformed into a musical document containing notes, rests, durations, measures, and harmonic information, although its accuracy still needs to be checked against the original audio. The result thus becomes <strong>a usable representation for studying the composition</strong>, even if the quality of the transcription must be evaluated by comparing the score with what is actually played in the recording.</p><p>The viewer does more than display a static page. At the bottom, there are <strong>controls for playing the composition, adjusting the speed, and choosing whether to listen to the reconstructed score, the original recording, or both versions</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*QMcjJseUWAXv1YVV.png" /></figure><p>During playback, a vertical line follows the progress of the piece, and measures can be highlighted as they are played. You can <strong>select a specific section of the score</strong>, as I did with the eighth measure, <strong>to focus on a passage without having to restart from the beginning each time</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*oSFc74TfS2huOGK-.png" /></figure><p>The repeat button allows you to listen to the same fragment several times, which is useful both for identifying possible errors and for practicing individual phrases on the piano.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*WkrS6nsvhMm-WC7E.png" /></figure><p>The viewer settings also allow you to <strong>show or hide chord symbols</strong>, adjust the zoom level, and choose between US Letter and A4 page formats, the latter being more suitable for everyday printing in Italy.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*AhcIzBHt_ucqMTTJ.png" /></figure><p>Looking at the resulting score, another important aspect becomes apparent: <strong>although the piece was intended to be an accessible piano composition, the notation contains some passages with closely spaced groups of notes, ties, and rhythmic subdivisions that require careful reading</strong>. This does not necessarily mean that AnthemScore recognized the wrong notes, because the version generated by Suno itself may contain more elaborate passages than those requested in the prompt. However, it clearly demonstrates the importance of distinguishing musical content recognition from its graphical organization: <strong>a sequence of notes may be accurate in relation to the audio and still be awkward to read or perform</strong>. This is why <strong>correction, quantization, and arrangement simplification features play an important role</strong> in transforming an automatic transcription into sheet music suitable for practice.</p><h3>Exporting, Instruments, and Available Formats</h3><h4>Which Format Should You Choose: PDF, MIDI, or MusicXML?</h4><p>AnthemScore allows you to export the results directly in <strong>PDF, MIDI, and MusicXML</strong> formats, which are also available through the viewer’s <em>Download</em> button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*BtBz3ESMmgL_DLCa.png" /></figure><p>The distinction matters because each format preserves different information. A <strong>PDF contains the graphical representation of the score</strong>, suitable for reading, printing, and studying, but it does not allow you to edit individual notes directly as you would in a music editor. <strong>MIDI stores musical events</strong>, including note pitch, duration, velocity, and starting time, and can be imported into a <strong>DAW</strong> such as <a href="https://www.apple.com/it/logic-pro/">Logic Pro</a> or <a href="https://www.apple.com/it/mac/garageband/">GarageBand</a> to modify the arrangement, change sounds, or use different virtual instruments. <strong>MusicXML</strong>, on the other hand, describes the musical score through measures, rests, rhythmic values, clefs, and ties, allowing you to continue working on the notation in applications such as <a href="https://musescore.org/">MuseScore Studio</a> or <a href="https://aviditalia.it/prodotti/sibelius/">Sibelius</a>.</p><p>The problem arises when you want to transform a musical performance into an easily readable score: a pianist may play some notes slightly early or late to make the melody more expressive, but reproducing these variations exactly on the staff can make the notation unnecessarily complicated. This is why <strong>quantization</strong> is useful, as it aligns notes to a regular rhythmic grid without necessarily changing the character of the piece. If the goal is to <strong>study a composition on the piano</strong>, it is therefore advisable to <strong>export the score in MusicXML</strong>, refine it if necessary with MuseScore Studio, and save it as a PDF for printing. <strong>MIDI remains useful for editing or playing notes through virtual instruments</strong>.</p><p>The desktop application’s export menu also includes a <strong>CSV</strong> format containing timing information about beats and notes, which may be interesting for anyone wishing to analyze the results programmatically or compare them with a reference MIDI file.</p><h4>Customizing the Score and Instruments</h4><p>The export window offers several customization options, starting with the choice of which musical parts to include, distinguishing pitched notes from percussion and configuring the organization of instruments and staves.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*e8m_uvmPtT4qvcfT.png" /></figure><p>In my example, AnthemScore identified <strong>three note groups</strong>, which I was able to assign to the same instrumental part, the piano, specifying for each group whether the notes should be placed on the treble staff, the bass staff, or both. Note groups represent editable collections of musical events, while parts correspond to the instruments that will appear in the final score: for a piano, it is therefore possible to use multiple groups while maintaining a single two-staff part, correcting the distribution of notes between the hands when necessary. With more complex recordings, the same system allows you to organize separate instrumental parts and assign different MIDI sounds to them.</p><p>You can also <strong>assign a title to the composition, remove empty measures at the beginning and end, include chord symbols, and transpose the piece</strong> by a specified number of semitones or octaves. Transposition can be useful for adapting a melody to a more comfortable key or correcting differences in register.</p><h4>Arrangements for Beginners and Advanced Players</h4><p>One feature I find particularly interesting is the possibility of choosing different <strong>arrangement levels</strong>, adapting the complexity of the score to the performer’s abilities. For this test, I initially used <strong>4. Advanced Version</strong>, but AnthemScore also allows you to generate simpler arrangements or keep the <em>Original</em> mode, without applying the changes introduced by the simplification feature. According to the <a href="https://lunaverus.com/documentation">Lunaverus documentation</a>, the <strong><em>Beginner</em></strong> version applies the most substantial simplifications, while the <strong><em>Advanced</em></strong> version tends to preserve more of the original material.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*WHHiFpBsTVgByQBt.png" /></figure><p>This feature is particularly interesting to me when thinking about compositions created with Suno, because <strong>simplifying a score is different from transcribing it faithfully</strong>. Transcription should reconstruct the notes actually present in the recording, while an arrangement can intentionally modify their distribution and complexity to make the piece more accessible. For my purposes, I would therefore prefer to obtain a representation that is as faithful as possible to the original composition first, and then adapt it to my piano-playing abilities when necessary.</p><p>In this <strong>infographic</strong>, I summarized the <strong>main differences between the beginner and advanced arrangements</strong> of <em>Little Keys, Big Dreams</em>, showing <strong>how the complexity of the piano writing changes</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bEvDKRsGtuIk6GYaNTcz4Q.png" /></figure><p>In the <strong>beginner version</strong>, the accompaniment is more essential, with less movement in the left hand, more sustained chords, and a lower density of notes in several passages. The <strong>advanced arrangement</strong>, on the other hand, retains more elaborate writing, with a more developed accompaniment and a richer distribution of notes. The main melody and chord progression remain recognizable in both versions, while the amount of work required from the pianist changes. The comparison therefore shows how simplification can make a composition more accessible without necessarily compromising its essential musical elements.</p><h4>Saving the Project and Refining the Score</h4><p>The work does not necessarily have to end with exporting. AnthemScore also allows you to <strong>save the project in its native ASDT format</strong>, preserving the information needed to reopen the transcription and continue editing it later. This is useful when working on complex recordings or preparing multiple versions of the same piece, keeping the working project separate from the final scores.</p><p>However, it is important to remember that <strong>AnthemScore does not completely replace a professional music notation editor</strong>. The <a href="https://lunaverus.com/documentation">official documentation</a> explains that vocal melody recognition covers sung notes but does not include automatic transcription of lyrics, just as dynamic markings such as <em>piano</em>, <em>forte</em>, or <em>crescendo</em> are not added automatically. To complete these elements, adjust the page layout, or define specific musical articulations, the most practical workflow remains exporting to MusicXML and making further changes in a dedicated application.</p><p>Another documented limitation concerns recordings that do not use standard tuning with A at 440 Hz: in these cases, Lunaverus recommends correcting the pitch beforehand with an external tool such as <a href="https://www.audacityteam.org/">Audacity</a>, preventing an overall tuning difference from compromising note recognition.</p><h3>Preferences, Performance, and Privacy</h3><p>The <strong>Preferences</strong> panel also provides several useful controls for adapting AnthemScore to your needs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*A6sFRmX7NhDIpJ0C.png" /></figure><p>You can set the <strong>default save folder</strong>, choose whether to <strong>open sheet music in the built-in viewer or an external application</strong>, define the paper format, and customize mouse button behavior. You can also choose how notes are named, <strong>switching between international A, B, C notation and Italian Do, Re, Mi notation</strong>, and configure the MIDI velocity of new notes, using a fixed intensity or allowing the program to manage it automatically.</p><p>Regarding performance, <strong>AnthemScore allows you to specify how many processor cores to use during processing</strong>. On my Mac, the panel shows 12 available cores, with a slider that allows me to reduce the number to limit resource usage. This is particularly useful when transcribing long recordings or when you want to continue using other applications, considering that greater parallelism may also require more memory.</p><p>I also found the presence of several <strong>privacy and diagnostic settings</strong> interesting. The program can check for and install updates, automatically send error reports, and share usage information to help improve the software. There is also a separate option that authorizes the upload of edits and the song’s audio to improve transcription accuracy. In the configuration shown during my test, this feature is disabled, a choice I prefer to maintain when working with personal compositions. It is an <strong>important detail for anyone using original or unreleased material</strong>, especially since the desktop edition with a perpetual license allows files to be processed locally, without necessarily uploading them to an online service.</p><h3>Final Thoughts</h3><p>My test with <em>Little Keys, Big Dreams</em> allowed me to start from a simple MP3 generated with Suno and arrive at an editable piano score, complete with notes, measures, and chords. This is precisely what I find most interesting about AnthemScore 6: <strong>the ability to recover the musical structure of a recording and transform it into material that can be read, edited, and played</strong>, even when the original sheet music is unavailable.</p><p>There are many possible applications, and they are not limited to AI-generated music. I think of someone who would like to <strong>learn to play a melody heard in a recording on the piano</strong>, a musician who wants to <strong>analyze a particularly interesting passage</strong>, a <strong>teacher preparing educational material</strong>, or <strong>someone who has old recordings of their own compositions and would finally like to recover a written version of them</strong>. The ability to export the results in MIDI and MusicXML further expands these possibilities, allowing the material to be reworked with other musical tools.</p><p>Of course, <strong>automatic transcription does not mean obtaining a perfect score that is immediately ready to perform</strong>: especially with complex recordings, overlapping instruments, or highly expressive performances, it is still necessary to check the recognized notes and refine the notation. <strong>But it is precisely in the combination of automatic recognition and manual intervention that AnthemScore demonstrates its usefulness</strong>, providing a concrete starting point for work that might otherwise take a great deal of time. For me, it also represents a way to give a second life to compositions created with Suno, <strong>bringing them beyond the audio file and transforming them into music that I can study, preserve, and try to play myself</strong>.</p><h3>Where to Get the App</h3><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*8y1bidmZ9FOxviYt.png" /></figure><p><a href="https://lunaverus.com/">AnthemScore 6</a> is developed by <strong>Lunaverus</strong> and is available for <strong>macOS, Windows, and Linux</strong>, downloadable directly from the <a href="https://lunaverus.com/download">official website</a>, without going through the respective platform stores. The desktop version is distributed with a perpetual license, purchased through a one-time payment, and comes in three editions, as detailed in the <a href="https://lunaverus.com/compareEditions">official feature comparison</a>:</p><ul><li><a href="https://lunaverus.com/purchase"><strong>AnthemScore 6 Lite</strong></a>, priced at <strong>$29</strong>, allows you to transcribe an unlimited number of complete songs, view sheet music, and save or print it as a PDF. It does not include advanced note editing tools or MIDI and MusicXML export.</li><li><a href="https://lunaverus.com/purchase"><strong>AnthemScore 6 Professional</strong></a>, priced at <strong>$39</strong>, adds all editing features, playback controls, and export to PDF, MIDI, MusicXML, and ASDT formats. It is probably the most interesting edition for anyone who wants to transform an audio recording into musical material that can be edited and played.</li><li><a href="https://lunaverus.com/purchase"><strong>AnthemScore 6 Studio</strong></a>, priced at <strong>$99</strong>, includes all Professional features, adding batch processing of multiple recordings and <strong>free lifetime updates</strong>, including future major versions. This is the edition that Lunaverus kindly provided me with for this review.</li></ul><p>The official edition comparison does not indicate any differences in the accuracy of the recognition algorithms: the distinctions mainly concern editing and export tools, batch processing, and update policies. There is therefore no evidence to suggest that Studio produces more accurate transcriptions than Lite or Professional.</p><p>The desktop licensing model involves a <strong>one-time payment, with no recurring subscription</strong>. The Lite and Professional editions include one year of free updates, while Studio guarantees them for life. After the first year, Lite or Professional users can continue using the version they purchased at no additional cost or buy another period of updates. The license can initially be activated on four computers, with the possibility of adding one more for each full year elapsed since purchase. Prices are listed in US dollars and may vary depending on the currency and taxes applied at checkout.</p><p>A <a href="https://lunaverus.com/download"><strong>free trial version</strong></a> is also available, with no registration required, allowing users to explore the program and try the features of the different editions, with a limit of <strong>the first 30 seconds of each song and 100 transcriptions in total</strong>. This is a useful opportunity to evaluate the effectiveness of music recognition on your own recordings before purchasing a license.</p><p>On macOS, <strong>macOS 11 Big Sur or later</strong> is required; for Windows, installers are available for Windows 10 and 11, along with a separate package for Windows 7, while Linux users can download an AppImage version, officially tested on Ubuntu 20.04 and later. The program requires a 64-bit operating system and at least <strong>4 GB of RAM</strong>, although more memory is recommended for recordings longer than three minutes. The perpetual license requires an Internet connection for initial activation, but afterward <strong>processing can take place entirely offline</strong>, without having to upload your compositions to external servers.</p><p>Alongside the desktop application, there is also <a href="https://lunaverus.com/transcribe"><strong>AnthemScore Web</strong></a>, which can be used directly from a browser, including on smartphones and tablets, without installing any software. The free plan allows transcription of 30-second fragments and offers a 14-day trial for processing complete songs. The <strong>Plus</strong> plan starts at <strong>$8.33 per month when billed annually</strong>, includes 30 songs per month with a maximum duration of six minutes each, and supports PDF, MIDI, and MusicXML exports. The <strong>Pro</strong> plan starts at <strong>$24.99 per month when billed annually</strong>, increases the allowance to 100 songs per month with a maximum duration of ten minutes each, and also includes access to the desktop application for as long as the subscription remains active. In this case, unlike the perpetual license, the desktop program requires an Internet connection to perform transcriptions.</p><p>Choosing between the desktop and Web versions also involves considerations about <strong>the privacy of musical material</strong>. As specified in the <a href="https://lunaverus.com/privacy">Lunaverus privacy policy</a>, the online service collects and stores uploaded content, including audio recordings, transcriptions, settings, and edits. The desktop application with a perpetual license, on the other hand, allows recordings to be processed locally, although some communications related to licensing, updates, and diagnostics are still supported, with settings available to disable certain data transfers. Anyone working with unpublished compositions or confidential recordings should consider this difference, especially when using AI-based music tools that normally require files to be uploaded to the cloud.</p><p>Personally, I find the possibility of purchasing a perpetual license and working directly on my own computer particularly appealing, as it allows me to retain control over my recordings and musical projects. For my purposes, which mainly involve recovering the notes of compositions created with Suno, correcting them, and exporting them as sheet music to study or preserve, the Professional edition probably represents the best balance between price and features, while Studio becomes interesting for those who process many songs or want to continue receiving all future versions without additional purchases.</p><p><em>Originally published on</em> <a href="https://www.levysoft.it/archivio/2026/10/19/anthemscore-6-dallaudio-allo-spartito-come-lai-puo-aiutarci-a-riscoprire-la-musica-scritta/"><em>Levysoft</em></a> <em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=590000d0a458" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When Google Translate Turns LLMs Into Law Graduates and AI Models Into Fashion Models]]></title>
            <link>https://levysoft.medium.com/when-google-translate-turns-llms-into-law-graduates-and-ai-models-into-fashion-models-192b8acbe2cb?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/192b8acbe2cb</guid>
            <category><![CDATA[google]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[chrome]]></category>
            <category><![CDATA[google-translate]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Sun, 18 Oct 2026 12:56:06 GMT</pubDate>
            <atom:updated>2026-10-18T15:52:30.061Z</atom:updated>
            <content:encoded><![CDATA[<p><em>From LLMs becoming law graduates to passkeys turning into passwords, a collection of translation errors that are sometimes hilarious and sometimes surprisingly misleading.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HhMpIa5RloPRjHLp.jpg" /></figure><p>For a while now, I’ve been noticing some rather peculiar translations produced by Google Chrome’s built-in webpage translation feature. It all started with the acronym <strong>LLM</strong>, which, instead of referring to a <em>Large Language Model</em>, was being interpreted as an academic qualification in law. At first, I thought it was just an amusing linguistic accident, but as I continued reading English-language articles and discussions through Chrome’s automatic translation, I began encountering increasingly strange results: some genuinely funny, others capable of changing the meaning of what I was reading.</p><p>To be fair, <strong>LL.M.</strong> is also the traditional abbreviation for <em>Master of Laws</em>, a postgraduate law degree, so the ambiguity is understandable. What makes these examples particularly interesting is that they appear on websites entirely devoted to AI, where the surrounding context should make the intended meaning reasonably obvious. And as I kept collecting examples, I realized the problem extended well beyond acronyms: company names were being replaced with other company names, technical terminology was being interpreted as everyday language, and concepts that should have remained distinct were sometimes merged into something entirely different.</p><p>Most of the examples I originally encountered involved translating English webpages into Italian. Since the mistranslations themselves are often in Italian, I’ll include their original wording where it matters and explain their meaning in English, so readers unfamiliar with Italian can appreciate what actually happened. I’ve also included links to all the original pages, allowing anyone to repeat the experiment using Chrome’s translation feature. The results may change over time as translation systems are updated, but the examples described here are based on the translations I observed.</p><h3>When LLMs Become Law Graduates</h3><p>The first example appeared in Colin Breck’s article, <a href="https://blog.colinbreck.com/i-dont-want-to-read-what-you-didnt-write/"><em>I Don’t Want to Read What You Didn’t Write</em></a>, published on September 20, 2026. The original English sentence included the expression <em>“the quality of writing from LLMs has plateaued”</em>, but Chrome’s Italian translation referred instead to the writing quality of <strong>“laureati in giurisprudenza”</strong>, literally <em>law graduates</em>.</p><p>In the very same article, I encountered an even better example. The original sentence was:</p><blockquote><em>Ask an LLM what the reliable formula is for falling in love.</em></blockquote><p>Chrome translated it into Italian as:</p><blockquote><em>Chiedete a un laureato in giurisprudenza qual è la formula infallibile per innamorarsi.</em></blockquote><p>In English, that effectively means:</p><blockquote><em>Ask a law graduate what the foolproof formula for falling in love is.</em></blockquote><p>Apparently, a postgraduate degree in law now qualifies someone to explain the mysteries of romantic relationships. What makes this even more amusing is that the very next sentence begins with <em>“In AI-generated writing”</em>, so the intended context could hardly be clearer.</p><p>Once I started paying attention, I found other examples of the same confusion.</p><p>In a <a href="https://news.ycombinator.com/item?id=49823664">Hacker News discussion about arXiv and AI-generated academic papers</a>, a commenter wrote that it was ironic how LLMs, which had benefited so much from reading older arXiv papers, were now being used to pollute the platform. Chrome interpreted those LLMs as <strong>“master in giurisprudenza (LLM)”</strong>, essentially turning the language models into people with postgraduate law degrees who were somehow responsible for polluting the scientific literature.</p><p>Another <a href="https://news.ycombinator.com/item?id=49811484">Hacker News discussion about Grammarly</a> produced one of my favorite translations. The original comment read:</p><blockquote><em>I loved Grammarly. But it has changed post LLM boom.</em></blockquote><p>Chrome rendered this as:</p><blockquote><em>Adoravo Grammarly. Ma è cambiato dopo il boom dei master in giurisprudenza.</em></blockquote><p>Back in English, that becomes:</p><blockquote><em>I loved Grammarly. But it changed after the boom in law master’s degrees.</em></blockquote><p>An unexpected expansion of the legal education industry that I must somehow have missed.</p><p>The same problem appeared in a <a href="https://techcrunch.com/2026/09/29/america-gov-gets-really-weird-when-you-ask-it-about-minecraft-but-its-not-a-glitch/">TechCrunch article about the America.gov chatbot</a>. The author wrote <em>“I don’t think an LLM will ever be able to write something ‘good’”</em>, but Chrome produced an Italian sentence referring to <strong>“un master in giurisprudenza”</strong>, or a Master of Laws graduate, never being able to write something good. Once again, the article itself was explicitly about chatbots and AI-generated content.</p><p>Even <a href="https://no-sloptober.com/">No Sloptober</a>, a website encouraging people to spend October without using LLM-based tools, wasn’t immune. Its phrase <em>“Even if you find LLMs useful”</em> became:</p><blockquote><em>Anche se i Master in Diritto (LLM) si rivelano utili.</em></blockquote><p>Which means something like:</p><blockquote><em>Even if you find Master of Laws graduates useful.</em></blockquote><p>In this particular example, Chrome didn’t simply choose the wrong meaning. It expanded the acronym into an academic qualification while keeping the original abbreviation in parentheses, as if it were helpfully explaining the terminology.</p><h3>Three Different Meanings on the Same Page</h3><p>Perhaps the most revealing example comes from a <a href="https://discourse.haskell.org/t/how-to-keep-enjoying-programming-in-a-world-of-llms/14705">long discussion on the Haskell community forum</a>, where Chrome encountered the acronym LLM several times within the same article and managed to interpret it in three completely different ways.</p><p>When the author discussed how LLMs can have very large context windows but still lose information, Chrome translated the acronym as <strong>“sistemi di gestione delle attività”</strong>, or <em>task management systems</em>. A little further down, a passage about the ethical concerns surrounding frontier LLMs operated by large technology companies turned them into <strong>“programmi di Master in Leadership di base”</strong>, roughly <em>basic Master’s programs in Leadership</em>. And when the author complained that LLMs were much worse at producing readable code than advertised, they suddenly became <strong>“software di modellazione lineare”</strong>, or <em>linear modeling software</em>.</p><p>All three interpretations appeared on the same page, which was explicitly discussing programming and AI.</p><p>This is particularly interesting because it suggests that Chrome wasn’t simply applying a fixed substitution such as LLM → Master of Laws. The acronym was being interpreted differently depending on the surrounding text, often with its supposed expanded form followed by the original abbreviation in parentheses.</p><p>There is actually a translation technique known as <a href="https://aclanthology.org/2024.wmt-1.129/"><em>Parenthetical Terminology Translation</em></a>, in which a translated or expanded technical term is accompanied by its original form to help readers recognize it. I haven’t found documentation confirming that Chrome uses this particular approach, but the way it expands acronyms while preserving the original abbreviation in parentheses looks remarkably similar.</p><p>The irony is that, in many of these cases, <strong>leaving LLM untranslated would have produced a more accurate result</strong>. The apparent attempt to clarify the terminology is precisely what introduces the error.</p><h3>When Other Words Lose Their Meaning Too</h3><p>The problem doesn’t stop with LLMs. As I continued collecting examples, I encountered similar mistakes involving ordinary English words, company names, and relatively recent technical expressions.</p><p>In <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev">TypeSafe AI’s article <em>Introducing System One Models &amp; Jev</em></a>, the original sentence read:</p><blockquote><em>Models have been superhuman at chat for years, so where is all the automation?</em></blockquote><p>Chrome translated the beginning into Italian as:</p><blockquote><em>Le modelle sono da anni superumane nelle chat…</em></blockquote><p>Which effectively means:</p><blockquote><em>Fashion models have been superhuman at chatting for years…</em></blockquote><p>Here the ambiguity is different. The English word <em>models</em> can refer to mathematical or computational models, but also to people working in the fashion industry. Chrome chose the latter, and specifically the feminine form, even though the article discusses language models and software automation.</p><p>An even stranger example appeared in a <a href="https://www.joinhorizon.ai/p/new-post-cef3">Horizon AI newsletter covering Anthropic</a>. In a report about a US court decision, <strong>Anthropic was translated as Anthropologie</strong>.</p><p>This is especially peculiar because Anthropologie isn’t a translation of Anthropic. It’s the name of an entirely different American company, a fashion and home goods retailer. In other words, Chrome replaced one company’s name with another company’s name, even though proper names generally shouldn’t require translation in this context.</p><p>Then there’s <em>slop</em>, a term that has become increasingly common in discussions about low-quality, mass-produced AI content. In a <a href="https://news.ycombinator.com/item?id=49841912">Hacker News comment</a>, someone wrote:</p><blockquote><em>Slop, if you hadn’t guessed by the .ai domain.</em></blockquote><p>Chrome translated the first word as <strong>“Patatine”</strong>, which means <em>potato chips</em> in Italian. The resulting sentence effectively meant:</p><blockquote><em>Potato chips, in case you hadn’t guessed from the .ai domain.</em></blockquote><p>What makes this particularly entertaining is that the .ai domain was right there in the sentence. The term <em>slop</em> has also become mainstream enough for the <a href="https://americandialect.org/2025-word-of-the-year-is-slop/">American Dialect Society to select it as its 2025 Word of the Year</a>, specifically noting its association with low-quality AI-generated content.</p><p>Some mistakes are more traditional. In a <a href="https://link.springer.com/article/10.1186/s40623-025-02211-y">scientific article published by Springer</a>, Chrome translated the standard academic heading <strong>Abstract</strong> as <strong>“Astratto”</strong>, the Italian adjective meaning <em>abstract</em>, rather than <em>Riassunto</em> (summary), <em>Sintesi</em> (synopsis), or, at a stretch, <em>Estratto</em> (excerpt). It could also have simply retained the term <em>Abstract</em>, which is commonly used in Italian academic publications. Given that the word appears as a section heading immediately after the title and authors, the structure of the page itself should make its intended meaning reasonably clear.</p><p>Finally, in a <a href="https://news.ycombinator.com/item?id=50049872">Hacker News discussion about Doory, an open-source alternative to Canva</a>, a commenter wrote:</p><blockquote><em>I’m pretty sure a good portion of Canva is vibe-coded too.</em></blockquote><p>Chrome rendered this as:</p><blockquote><em>Sono abbastanza sicuro che anche una buona parte di Canva sia caratterizzata da un’atmosfera particolare.</em></blockquote><p>A back-translation would be:</p><blockquote><em>I’m pretty sure a good portion of Canva has a particular atmosphere too.</em></blockquote><p>Unfortunately, <em>vibe-coded</em> has nothing to do with the atmosphere of a product. In software development, <em>vibe coding</em> describes an approach in which developers rely heavily on AI to generate code from natural-language instructions. And the original discussion was explicitly about software development with Claude, making the mistranslation particularly revealing.</p><h3>When Passkeys Become Passwords</h3><p>One example that struck me as substantially more important came from the Substack article <a href="https://nonfunctional.substack.com/p/passkeys-are-a-trap-do-not-use-them"><em>Passkeys are a trap. Do not use them</em></a>, published on October 10, 2026.</p><p>The original title is perfectly straightforward, but Chrome translated it into Italian as:</p><blockquote><em>Le password sono una trappola. Non usatele.</em></blockquote><p>Which means:</p><blockquote><em>Passwords are a trap. Do not use them.</em></blockquote><p>At first glance, this may look like a simple terminology mix-up. But the article discusses passkeys as an alternative to traditional passwords and examines the implications of using them. These are distinct authentication concepts, so confusing the two changes the central message of the article.</p><p>I became curious about how widespread the problem was and decided to count the occurrences of both terms in the original English text and the Italian translation displayed by Chrome.</p><p>In the original English article, I counted <strong>117 occurrences of “passkey” or “passkeys”</strong>, compared with just <strong>30 in the Italian translation</strong>. Meanwhile, occurrences of <strong>“password” or “passwords” increased from 24 in the original to 88 in the translated version</strong>.</p><p>According to my counts, occurrences of <em>passkey</em> dropped by <strong>87</strong>, while occurrences of <em>password</em> increased by <strong>64</strong>. That leaves a difference of 23 occurrences between the two changes, which means we cannot automatically reconstruct every individual substitution. Some terms may have been omitted, rephrased, or translated differently, so these numbers should be treated as observations from the displayed text rather than a precise word-by-word mapping.</p><p>Still, the pattern is striking. The confusion wasn’t limited to the headline but appeared throughout the article, repeatedly blurring the distinction on which the author’s argument depended.</p><p>And this is where translation errors become considerably less amusing. If an LLM becomes a law graduate, most readers will probably recognize that something has gone wrong. But if <em>passkeys</em> quietly become <em>passwords</em> in an article about authentication security, the mistranslation may sound perfectly plausible to someone who isn’t already familiar with the technology.</p><h3>I’m Not the Only One Seeing These Problems</h3><p>After collecting these examples, I started wondering whether other people had noticed similar behavior. A little research led me to a Reddit discussion describing almost exactly the same problem, but involving a completely different target language.</p><p>On June 16, 2026, a user posted <a href="https://www.reddit.com/r/googletranslate/comments/1u7ip9n/google_translate_is_now_silently_changing_meaning/"><em>Google Translate is now silently changing meaning, not just mistranslating</em></a> in r/googletranslate, describing translations that sounded fluent and convincing while substantially altering the original meaning.</p><p>Among the examples was one that could have come straight from my own collection.</p><p>According to the post, on April 28, 2026, the user encountered the English headline:</p><blockquote><em>Google DeepMind paper argues LLMs will never be conscious</em></blockquote><p>When translated into Russian through Chrome, the resulting meaning was essentially:</p><blockquote><em>A Google DeepMind paper argues that people with a Master of Laws degree will never become conscious.</em></blockquote><p>The resemblance to my English-to-Italian examples is remarkable. The very same collision between <em>Large Language Model</em> and <em>Master of Laws</em> was occurring in another language, in a headline explicitly mentioning Google DeepMind.</p><p>The user also reported another case in which <em>“enhances LLM outputs by fetching external knowledge”</em> was transformed into a description of improving learning in a master’s degree program by retrieving external information.</p><p>Other examples in the Reddit thread illustrate different kinds of semantic confusion. The technical expression <em>“Concrete failure reproducer”</em>, referring to a concrete example that reproduces a software failure, was interpreted as something resembling the reproduction of concrete destruction, as though <em>concrete</em> referred to the construction material rather than a specific or tangible example. Another translation reportedly changed an instruction about writing in Russian into one about writing in English. Additional users described similar meaning-altering substitutions in translations involving Japanese and German.</p><p>These are personal reports rather than independently reproduced experiments, but their significance lies in the similarity of the behavior: the resulting text isn’t necessarily grammatically broken or obviously nonsensical. Sometimes it reads perfectly naturally, and that’s precisely what makes the altered meaning difficult to notice.</p><p>I found another curious report in the GitHub repository <a href="https://github.com/fenxer/llm-things">fenxer/llm-things</a>, a collection of LLM-related observations and oddities. The author notes that Google Translate has interpreted LLM as <em>Master of Laws</em> and PNG as <em>Papua New Guinea</em> when translating into Chinese, rather than recognizing the intended technical meanings of those acronyms.</p><p>Again, this is an anecdotal report rather than a systematic evaluation, but together with the Russian example and my Italian translations, it suggests that acronym ambiguity can surface across different language pairs. It doesn’t tell us how common these mistakes are, or whether they all have the same underlying cause, but it makes the phenomenon harder to dismiss as a peculiarity of Italian translation alone.</p><h3>What Research Says About These Translation Errors</h3><p>Perhaps the most interesting discovery is that the problem of translating technical acronyms is well known in machine translation research.</p><p>In September 2024, Richard Yue, John Ortega, and Kenneth Church published <a href="https://aclanthology.org/2024.amta-research.6/"><em>On Translating Technical Terminology: A Translation Workflow for Machine-Translated Acronyms</em></a> at the AMTA conference. The study examines the difficulties machine translation systems encounter when recognizing and translating technical acronyms.</p><p>Focusing on French-to-English translation, the researchers found that acronym translation error rates could reach <strong>50% under the conditions of their experiments</strong>, including evaluations involving systems such as Google Translate. That figure doesn’t mean Google Translate gets half of all acronyms wrong in general. It refers to the specific data and evaluation conditions used in the research.</p><p>The underlying problem is easy to understand: an acronym can have several legitimate expansions, and a translation system needs to determine which one matches the context. Knowing that LLM can mean <em>Master of Laws</em> isn&#39;t enough. In an article about ChatGPT, arXiv, or code generation, that interpretation is almost certainly inappropriate.</p><p>The researchers therefore proposed a translation workflow incorporating explicit acronym recognition and disambiguation, supported by external information retrieval, and reported improvements over their baseline systems.</p><p>Another relevant question is <strong>how much context a translation system actually considers when deciding what a word means</strong>.</p><p>In 2023, Christian Herold and Hermann Ney published <a href="https://aclanthology.org/2023.codi-1.15/"><em>Improving Long Context Document-Level Machine Translation</em></a>, a study examining how machine translation systems can make better use of context across longer documents.</p><p>The researchers discuss the limitations of systems that rely on relatively small context windows, sometimes incorporating only one or two preceding sentences. While this may help resolve local ambiguities, it doesn’t necessarily provide enough information to preserve consistent terminology throughout an entire document.</p><p>Increasing the amount of context isn’t automatically a solution, either. It can introduce additional computational costs and, depending on the architecture and how that context is used, even degrade translation performance. The study explores ways to identify and exploit the most relevant contextual information without indiscriminately processing the entire document.</p><p>This immediately reminded me of the Haskell forum discussion, where the same acronym became a task management system, a leadership degree, and linear modeling software within a single page.</p><p>We don’t know whether Chrome’s translation system processes isolated sentences, paragraphs, or larger sections of text in these particular cases. But the observed behavior is consistent with the broader challenge of maintaining terminological coherence across a document, especially when individual words or acronyms have multiple possible meanings.</p><p>There is also another, related phenomenon worth considering: translations that introduce meanings substantially disconnected from their source material.</p><p>As early as 2018, Google researchers published <a href="https://research.google/pubs/hallucinations-in-neural-machine-translation/"><em>Hallucinations in Neural Machine Translation</em></a>, investigating how neural translation systems can generate apparently plausible output that isn’t adequately supported by the original text.</p><p>So the problem didn’t suddenly appear with today’s generative language models. Neural machine translation systems have been known to produce this kind of behavior for years.</p><p>It’s useful, however, to distinguish between <strong>disambiguation errors</strong>, where a system chooses a possible but contextually incorrect meaning, and <strong>hallucinations</strong>, where the translation introduces information that isn’t properly grounded in the source. Turning LLMs into law graduates is primarily a disambiguation problem, while some of the more drastic meaning changes reported by users may resemble the latter phenomenon.</p><p>None of these studies proves exactly why Chrome produced the particular errors I observed. What they do show is that the underlying difficulties are neither new nor trivial. Technical terminology, ambiguous acronyms, document-level consistency, and the relationship between linguistic fluency and factual fidelity have all been active research topics for years.</p><h3>It’s Not Just About an Outdated Vocabulary</h3><p>Looking at these examples together, I find it difficult to attribute everything to a translation model that simply hasn’t caught up with recent technological vocabulary.</p><p>That explanation might make sense for relatively new expressions such as <em>vibe-coded</em> or <em>slop</em>, but it becomes less convincing when dealing with established words such as <em>models</em>, the academic heading <em>Abstract</em>, or proper names like Anthropic.</p><p>The common thread seems to be the difficulty of <strong>selecting the appropriate meaning of a word based on its context</strong>, and sometimes recognizing when a term would be better left untranslated.</p><p>Research on acronym disambiguation and document-level translation offers possible explanations, but it wouldn’t be accurate to assume that any particular algorithm or model is responsible for the mistakes described here.</p><p>Google has used several generations of translation technology over the years, from statistical machine translation to neural systems and more recent language-model-based approaches. However, the output visible in Chrome doesn’t reveal exactly which model or internal component produced a particular translation, or whether the browser always uses the same translation pipeline as the standalone Google Translate service.</p><p>All the English-to-Italian examples in this article were observed using Google Chrome’s built-in webpage translation feature. I’ve included the original links so that readers can try the same translations themselves, although updates to the underlying systems may produce different results over time. The reports from other users should likewise be understood as individual observations rather than statistical evidence of how widespread the problem is.</p><p>Some of these errors are harmless enough to be entertaining. If an LLM becomes a law graduate, the absurdity is usually easy to spot. But when a passkey becomes a password in an article comparing the two technologies, or when a fluent translation silently changes an instruction or the meaning of a sentence, the consequences become considerably more interesting.</p><p>What struck me most as I continued collecting examples was how misleading a perfectly natural translation can be. We’re accustomed to thinking that machine translation errors reveal themselves through awkward grammar or bizarre wording, when sometimes the result reads smoothly, sounds entirely reasonable, and tells us something different from what the author originally wrote.</p><p>Still, I have to admit that my personal favorite remains the Italian translation of this sentence:</p><blockquote><em>Ask an LLM what the reliable formula is for falling in love.</em></blockquote><p>Which, according to Chrome, becomes:</p><blockquote><em>Ask a law graduate what the foolproof formula for falling in love is.</em></blockquote><p>Maybe Google Translate knows something we don’t. 😄</p><p><em>Adaptation note: This article is an English-language adaptation of an original piece written in Italian for </em><a href="https://www.levysoft.it/"><em>Levysoft</em></a><em>. Since most of the translation errors were originally observed while translating English webpages into Italian, I have included English explanations and back-translations where necessary to make the examples understandable to an English-speaking audience. The original observations, sources, and technical considerations have been preserved.</em></p><p><em>Originally published at </em><a href="https://www.levysoft.it/archivio/2026/10/18/google-translate-pensa-che-gli-llm-siano-laureati-in-giurisprudenza-e-i-modelli-diventano-modelle/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=192b8acbe2cb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ASD-STE100 and ELI5: 20 Ways to Get Better Explanations from LLMs]]></title>
            <link>https://levysoft.medium.com/asd-ste100-and-eli5-20-ways-to-get-better-explanations-from-llms-9d0661e46e19?source=rss-f51021821a2------2</link>
            <guid isPermaLink="false">https://medium.com/p/9d0661e46e19</guid>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[karpathy]]></category>
            <dc:creator><![CDATA[Antonio Troise]]></dc:creator>
            <pubDate>Thu, 08 Oct 2026 14:28:12 GMT</pubDate>
            <atom:updated>2026-10-08T16:51:59.670Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*8ECap70BW1dkeGfs.jpg" /></figure><p>On October 2, 2026, Andrej Karpathy <a href="https://x.com/karpathy/status/2105819303471976479">published a post</a> based on a very simple prediction: <strong>we will spend more and more time trying to understand what language models produce</strong>. If an increasing share of our work is delegated to systems capable of writing code, analyzing documents, conducting research, and producing complex artifacts, <strong>part of our job inevitably shifts toward supervising and understanding those results</strong>. The first technique suggested by Karpathy focuses precisely on how we ask an LLM to write: try asking for an explanation in <strong>ASD-STE100</strong>, a controlled language originally developed for aerospace technical documentation. When the result becomes too rigid, he even suggests a curiously precise formulation: <strong>ask the model to go about “80% of the way to ASD-STE100”</strong>.</p><p>The idea made me think about how often we use an LLM by simply writing “explain this to me” or “explain it better”. <strong>These are very vague instructions, because <em>better</em> can mean simpler, shorter, more technical, more concrete, more visual, or better suited to our existing knowledge</strong>. In fact, <strong>there are many ways to specify the kind of explanation we want</strong>. Some come from education and learning research, others from science communication, and still others are simply conventions that emerged on the Internet and that language models have learned to interpret remarkably well. The difference becomes clear when we keep the subject unchanged and modify only the prompt.</p><p>I will use the same question throughout:</p><p>Explain the for loop in Python.</p><h3>1. ASD-STE100: controlling the language first</h3><p><a href="https://www.asd-ste100.org/"><strong>ASD-STE100</strong></a>, or <strong>Simplified Technical English</strong>, is a <em>controlled natural language</em>, meaning <strong>a version of English governed by specific rules designed to reduce ambiguity and complexity</strong>. It originated in the late 1970s in aerospace documentation, when European airlines called for a form of technical English that would be easier for non-native speakers to understand. The first AECMA Simplified English Guide appeared in 1986, <strong>while in 2025, with Issue 9, ASD-STE100 became an international standard</strong>. The current version contains 53 writing rules along with a controlled dictionary.</p><p>The principle goes further than simply saying “use easy words”. <strong>When several synonyms exist, a single term is selected whenever possible</strong>. For example, STE uses <em>start</em> and excludes alternatives such as <em>begin</em>, <em>commence</em>, <em>initiate</em>, and <em>originate</em>. Word meanings are also controlled, so <strong>the same word generally has only one permitted meaning</strong>. The rules also govern syntax: active voice whenever possible, one instruction per sentence, procedural sentences of no more than 20 words, descriptive sentences of no more than 25 words, one topic per paragraph, and consistent terminology for the same object. Ultimately, the goal is to ensure that <strong>the same term retains the same meaning and that instructions are short, explicit, and difficult to misinterpret</strong>.</p><p>When applied to an LLM, the mechanism becomes immediately apparent. A Python explanation might look like this:</p><blockquote><em>The </em><em>for statement enables sequential iteration over the elements contained within a collection, making the current element available during each iteration.</em></blockquote><p>Now imagine requesting a formulation inspired by ASD-STE100 with a prompt such as:</p><p>Explain the for loop in Python using a style that is approximately 80% inspired by ASD-STE100. Use short sentences, active voice, consistent terminology, and only one main idea per sentence.</p><p>The answer would take a form similar to this:</p><blockquote><em>The </em><em>for loop reads one element from the list. The code block uses that element. Then the loop reads the next element.</em></blockquote><p>The technical information is almost identical, but in the second case <strong>the model has less freedom to hide a simple concept behind a more sophisticated linguistic construction</strong>. Compared with a generic answer, <strong>many unnecessary expressions disappear</strong>. The model consistently uses element instead of alternating between terms such as value, object, or component, and it makes clear who performs each operation.</p><p>However, we must distinguish writing <strong>inspired</strong> by ASD-STE100 from actual compliance with the standard. The Simplified Technical English Maintenance Group itself has <a href="https://www.asd-ste100.org/STE_downloads.html">published</a> <strong>a document about the use of AI, warning that generated text may appear clear and consistent with STE while incorrectly applying its rules or vocabulary</strong>. An LLM receiving the prompt “write in ASD-STE100” can imitate many of its characteristics, but this does not amount to formal compliance verification. Karpathy’s suggested “80%” should be understood in exactly this sense: it is an informal stylistic request, not a measurable percentage of compliance with the standard.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*nJo-HGMnlDYCn8PU.jpg" /></figure><p>There is another important detail for those who write in languages other than English: <strong>ASD-STE100 applies specifically to English</strong>. When we ask an LLM to “explain it in Italian using ASD-STE100”, we are actually asking it to transfer some of the standard’s principles, such as short sentences, consistent terminology, active voice, and reduced ambiguity. We are not producing “Italian ASD-STE100”. For a broader perspective, there is also <a href="https://committee.iso.org/standard/78907.html?browse=tc"><strong>ISO 24495–1:2023 Plain language</strong></a>, a standard applicable to most written languages that starts with the reader: information must be relevant, easy to find, understandable, and usable. It is a less prescriptive approach than STE and can be extremely useful when we want to make a text accessible without turning it into aerospace documentation.</p><h3>2. ELI5: explain it like I’m five</h3><p>Another widely known way to control an LLM’s response is <strong>ELI5</strong>, short for <em>Explain Like I’m Five</em>. The expression became popular mainly through Reddit and the <em>r/explainlikeimfive</em> subreddit. The name can be misleading: according to the <a href="https://support.reddithelp.com/hc/it/articles/205313845-Cosa-significano-queste-espressioni">community guidelines</a>, <strong>the reference to being five years old is intended as a figure of speech</strong>. The goal is <strong>to produce an explanation accessible to non-specialists, avoiding unexplained technical terms and without assuming specialized knowledge</strong>.</p><p>The prompt becomes:</p><p>ELI5: explain the for loop in Python.</p><p>And it might produce:</p><blockquote><em>Imagine having a box with five candies and wanting to look at each candy one at a time. The </em><em>for loop tells Python: &quot;Take the first candy and do something with it. Then take the second candy and do the same thing. Keep going until you have looked at all of them.&quot;</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*lbdKUjOg8M56-u2U.jpg" /></figure><p>Here, <strong>the model almost completely abandons formal precision and builds a mental image first</strong>. The advantage is immediate accessibility, while <strong>the limitation is equally clear: a metaphor can help explain the general idea without actually explaining what iterables, iterators, or loop variables are</strong>.</p><h3>3. ELI10 and ELI12: simple, but without going back to kindergarten</h3><p>Variants such as <strong>ELI10</strong>, <strong>ELI12</strong>, and other intermediate ages have emerged naturally from ELI5. They are not educational standards with precise rules. Instead, they mainly serve as a quick way to indicate the desired level of complexity to the model. <strong>ELI10 is now also used by websites and tools that promise jargon-free explanations based on concrete examples and analogies, while ELI12 even appears as a mode for simplifying complex documents</strong>.</p><p>The prompt:</p><p>ELI10: explain the for loop in Python.</p><p>might produce:</p><blockquote><em>A </em><em>for loop is useful when you want to perform the same operation on multiple elements. If you have a list of names, Python can take one name at a time and run the same code for each one:</em></blockquote><pre>nomi = [&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;]for nome in nomi:    print(nome)</pre><blockquote><em>Python first takes </em><em>&quot;Anna&quot;, then </em><em>&quot;Luca&quot;, and finally </em><em>&quot;Marco&quot;.</em></blockquote><p><strong>The childish metaphor has already disappeared</strong>. Simple language remains, but actual code comes into play. <strong>For many technical subjects, ELI10 or ELI12 can be more useful than ELI5 precisely because they simplify the explanation without moving too far away from the real mechanism</strong>.</p><h3>4. Feynman style: explaining to check whether we really understand</h3><p>The so-called <strong>Feynman Technique</strong> operates on a different level. It is generally described as a process in which we try to explain a concept in simple words as if we were teaching it to someone else, identify the points where the explanation becomes vague, and return to studying those specific parts. The four-step version commonly shared today is a later formalization, not a method published by Richard Feynman under that name. However, its most interesting aspect has strong connections with research on <strong>self-explanation</strong>: a 2018 meta-analysis based on 64 studies found an average positive effect on learning (g = 0.55) when students were encouraged to generate explanations and conceptual connections.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*HDhOgOl1ztFgpajt.jpg" /></figure><p>The prompt can therefore become:</p><p>Explain the for loop in Python using the Feynman method. Use simple words. Then ask me to explain it back in my own words and identify anything I have not understood.</p><p>The answer might begin like this:</p><blockquote><em>A </em><em>for loop lets you take the elements of a collection one at a time and execute the same code for each one. If you have three names, Python takes the first one, executes the code block, takes the second one, and continues until the end.</em></blockquote><blockquote><em>Now it’s your turn: explain in your own words what happens when Python executes </em><em>for nome in nomi:.</em></blockquote><p>The difference compared with ELI5 is important: <strong>here, simplification is primarily used to verify understanding</strong>. The model should not merely explain something to us. <strong>It should help us discover where our own explanation stops making sense</strong>. <strong>When studying a subject, this approach can be more useful than passively reading a perfect explanation</strong>.</p><h3>5. Step by step: seeing every step</h3><p><strong>Step by step</strong> simply means that we want to see <strong>the process broken down into its intermediate steps</strong>. It is particularly useful when the difficulty comes from an explanation skipping operations that are obvious to the author but not yet obvious to the reader.</p><p>Prompt:</p><p>Explain the for loop in Python step by step, without skipping any steps.</p><p>Response:</p><blockquote><em>Consider </em><em>for nome in [&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;].</em></blockquote><ol><li>Python finds the list.</li><li>It takes the first element, &quot;Anna&quot;.</li><li>It assigns &quot;Anna&quot; to the variable nome.</li><li>It executes the code inside the loop.</li><li>It returns to the beginning of the loop.</li><li>It takes &quot;Luca&quot; and assigns it to nome.</li><li>It repeats the process.</li><li>After &quot;Marco&quot;, it finds no more elements and ends the loop.</li></ol><p>It is an elementary technique, but extremely <strong>effective for code, algorithms, mathematics, protocols, and operational procedures</strong>. It allows us to observe what would normally be compressed into a single sentence.</p><h3>6. Beginner-friendly: starting without assuming prior knowledge</h3><p><strong>Beginner-friendly</strong> means asking the model not to take previous knowledge for granted. <strong>Compared with ELI5, it maintains an adult tone and can use technical terms, provided they are introduced when needed</strong>.</p><p>Prompt:</p><p>Explain the for loop in Python in a beginner-friendly way. Assume I only know variables and print().</p><p>Response:</p><blockquote><em>A Python list can contain multiple values:</em></blockquote><pre>nomi = [&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;]</pre><blockquote><em>If you want to print all the names, you could write three </em><em>print() statements. The </em><em>for loop avoids this repetition:</em></blockquote><pre>for nome in nomi:    print(nome)</pre><blockquote><em>The variable </em><em>nome holds each element of the list in turn.</em></blockquote><p><strong>Specifying what the reader already knows can be even more effective</strong> than simply writing “beginner-friendly”. For example, I am a PHP developer learning Python gives the model a much more precise starting point.</p><h3>7. Explain with analogies: connecting something new to something familiar</h3><p><strong>Analogies</strong> attempt to <strong>explain a new concept by relating it to a structure we already know</strong>. Analogical learning has long been studied in cognitive psychology. It can help transfer relationships from a familiar domain to an unfamiliar one, provided the analogy is not confused with the actual phenomenon.</p><p>Prompt:</p><p>Explain the for loop in Python using an analogy from everyday life.</p><p>Response:</p><blockquote><em>Imagine a mail carrier standing in front of a row of mailboxes. They go to the first mailbox, deliver the letter, move to the second one, and repeat the same operation. The list is the row of mailboxes, the </em><em>for loop is the mail carrier moving from one mailbox to the next, and the code block is the operation performed for each mailbox.</em></blockquote><p>A good prompt can also add tell me where the analogy stops working. This forces the model to separate the simplified mental model from the actual technical behavior.</p><h3>8. Examples first: seeing before defining</h3><p>With <strong>examples first</strong>, <strong>the usual order of an explanation is reversed</strong>. The model <strong>shows a concrete case first and introduces the theory only after we have seen the mechanism in action</strong>. This approach is related to research on <strong>worked examples</strong>, which has shown that, during the early stages of learning, <strong>following fully worked-out examples can reduce the cognitive effort required</strong> compared with immediately trying to solve a problem without an existing structure to follow.</p><p>Prompt:</p><p>Explain the for loop in Python using examples first. Show me an example before explaining the theory.</p><p>Response:</p><pre>frutti = [&quot;mela&quot;, &quot;pera&quot;, &quot;banana&quot;]for frutto in frutti:    print(frutto)</pre><blockquote><em>The program prints:</em></blockquote><pre>melaperabanana</pre><blockquote><em>Now we can see what happened: </em><em>for took one element of the list at a time, assigned it to the variable </em><em>frutto, and executed </em><em>print(frutto).</em></blockquote><p>For people who learn programming by writing code, this order often feels more natural than the sequence of definition, syntax, exceptions, and example.</p><h3>9. Visual explanation: turning a concept into space</h3><p>We can ask the model for a <strong>visual explanation</strong>, meaning <strong>a representation in which position, connections, and movement make relationships visible</strong>. For some concepts, <strong>a visual representation can be more immediate than text alone</strong>, especially when we need to follow a sequence, observe relationships between elements, or understand how something changes over time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*QY__u7hnIyPcYdk3.jpg" /></figure><p>Prompt:</p><p>Explain the for loop in Python using a very simple visual explanation.</p><p>Response:</p><pre>[&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;]    |    v  &quot;Anna&quot;  -&gt; print(&quot;Anna&quot;)    |    v  &quot;Luca&quot;  -&gt; print(&quot;Luca&quot;)    |    v &quot;Marco&quot;  -&gt; print(&quot;Marco&quot;)    |    v   FINE</pre><blockquote><em>The </em><em>for loop goes through the list from beginning to end. At each step, it assigns the current element to the variable and then executes the code block.</em></blockquote><p>With an agent capable of creating files, we can go further and directly request an SVG diagram or a small HTML animation, moving toward one of the developments suggested by Karpathy.</p><h3>10. Cheat sheet: keeping everything at a glance</h3><p>A <strong>cheat sheet</strong> does not necessarily aim to teach a concept from scratch. Instead, <strong>it compresses the most important information into a format that can be consulted quickly</strong>. It is therefore particularly <strong>useful after we have already understood the basics</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*-Hdl06qQSHXgDpTg.jpg" /></figure><p>Prompt:</p><p>Explain the for loop in Python as a cheat sheet.</p><p>Response:</p><blockquote><strong><em>Syntax</em></strong></blockquote><pre>for elemento in sequenza:    istruzioni</pre><blockquote><strong><em>List</em></strong></blockquote><pre>for nome in nomi:    print(nome)</pre><blockquote><strong><em>Range</em></strong></blockquote><pre>for n in range(5):    print(n)</pre><blockquote><strong><em>Stop the loop:</em></strong><em> </em><em>break<br></em><strong><em>Skip an iteration:</em></strong><em> </em><em>continue<br></em><strong><em>Index + value:</em></strong><em> </em><em>enumerate()</em></blockquote><p>The value of a cheat sheet lies in its <strong>information density</strong> and the ability to <strong>find something again in just a few seconds</strong>. It is <strong>more of a reference format than a teaching method</strong>.</p><h3>11. TL;DR: just tell me what I need to know</h3><p><strong>TL;DR</strong>, short for <em>Too Long; Didn’t Read</em>, <strong>asks for the exact opposite of an in-depth explanation</strong>. Its purpose is to compress a topic into its central idea.</p><p>Prompt:</p><p>TL;DR: explain the for loop in Python.</p><p>Response:</p><blockquote><em>for repeats a block of code once for each element in a sequence:</em></blockquote><pre>for nome in nomi:    print(nome)</pre><p><strong>In two lines, we have enough information</strong> to remember what for is used for, <strong>but not enough to learn it from scratch</strong>. A TL;DR <strong>works well for recalling a concept we already know</strong> or deciding whether it is worth exploring further.</p><h3>12. Socratic style: make me think instead of giving me the answer</h3><p>The <strong>Socratic method</strong> uses questions to reveal assumptions, contradictions, and logical steps. The tradition naturally goes back to <strong>Plato’s dialogues</strong> and the Socratic <em>elenchus</em>, in which <strong>a sequence of questions is used to test the consistency of answers</strong>.</p><p>Prompt:</p><p>Teach me the for loop in Python using Socratic style. Ask me one question at a time and do not give me the answer immediately.</p><p>The response might begin like this:</p><blockquote><em>You have a list:</em></blockquote><pre>nomi = [&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;]</pre><blockquote><em>If you wanted to print all three names using only </em><em>print(), how would you do it?</em></blockquote><p>After our answer, the model might ask:</p><blockquote><em>Do you notice anything that repeats across the three statements?</em></blockquote><p>and only later introduce the for loop. In this mode, <strong>the model almost stops being an encyclopedia and takes on the role of a tutor</strong>.</p><h3>13. Rubber Duck Debugging: explain it to the duck</h3><p><strong>Rubber Duck Debugging</strong> comes from the world of programming and became famous thanks to <em>The Pragmatic Programmer</em>: <strong>when a programmer cannot find a bug, they try explaining their code line by line to a rubber duck</strong>. The duck does not respond, and that is precisely part of the mechanism, because <strong>verbalizing what the program is supposed to do forces us to make explicit the steps and assumptions that remained implicit in our minds</strong>. Very often, <strong>the inconsistency becomes apparent while we are explaining it</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*CN1ERom6pXqc1S9P.jpg" /></figure><p>With an LLM, we can turn the rubber duck into a conversational partner that deliberately remains minimally intrusive.</p><p>Prompt:</p><p>Act as my rubber duck while I try to understand the for loop in Python. Do not explain it to me immediately. Let me describe what I think is happening, and intervene only when you find an error, a contradiction, or a step I have not verified.</p><p>The conversation might begin like this:</p><blockquote><strong><em>Me:</em></strong><em> I think </em><em>for nome in nomi puts the entire list into </em><em>nome.</em></blockquote><blockquote><strong><em>LLM:</em></strong><em> If </em><em>nome contained the entire list, what would you expect </em><em>print(nome) to display during the first iteration?</em></blockquote><blockquote><strong><em>Me:</em></strong><em> Probably the whole list.</em></blockquote><blockquote><strong><em>LLM:</em></strong><em> Try comparing that prediction with what the program actually prints. If you get only </em><em>&quot;Anna&quot;, what can you conclude about the value of </em><em>nome at that moment?</em></blockquote><p>The difference compared with Socratic style is subtle but useful. In the Socratic method, the model actively constructs a sequence of questions to guide us toward the concept, while <strong>with the rubber duck, we are mainly the ones speaking and building the explanation. The model intervenes when something we say does not add up</strong>. This approach is particularly <strong>suitable for debugging</strong>, but it can also work when we want to <strong>verify the mental model we have built around a subject</strong>.</p><h3>14. From zero to expert: gradually increasing the depth</h3><p><strong>From zero to expert</strong> asks for a <strong>layered explanation</strong>: first the essential mental model, then intermediate details, and finally advanced aspects. Instead of receiving all the complexity at once, we can explore the same topic through successive levels. In fact, <strong>complex material can be easier to process when divided into manageable segments rather than presented all at once</strong>.</p><p>Prompt:</p><p>Explain the for loop in Python from zero to expert. Start with the basics and progressively increase the depth.</p><p>The response might begin with:</p><blockquote><strong><em>Level 1:</em></strong><em> </em><em>for repeats an operation over multiple elements.</em></blockquote><blockquote><strong><em>Level 2:</em></strong><em> </em><em>for can iterate over lists, tuples, strings, dictionaries, and other iterable objects.</em></blockquote><blockquote><strong><em>Level 3:</em></strong><em> Python obtains an iterator by calling </em><em>iter() on the object.</em></blockquote><blockquote><strong><em>Level 4:</em></strong><em> At each iteration, Python conceptually calls </em><em>next() on the iterator until </em><em>StopIteration is raised.</em></blockquote><blockquote><strong><em>Level 5:</em></strong><em> You can create custom iterable objects by implementing the iterator protocol or using generators.</em></blockquote><p>The original question remains exactly the same, but the result provides a ladder that we can stop climbing once we have reached the necessary depth.</p><h3>15. Progressive disclosure: showing complexity only when needed</h3><p><strong>Progressive disclosure</strong> originated mainly in interface design. Instead of immediately displaying every available feature and option, an interface initially presents only what is necessary and makes advanced details accessible when the user needs them. Applied to an explanation, the idea is similar: <strong>the model should not immediately dump everything it knows about a subject, but reveal complexity one level at a time</strong>.</p><p>Prompt:</p><p>Explain the for loop in Python using progressive disclosure. Initially show me only the essential concept. Introduce additional details only when I ask you to continue.</p><p>The first response might be:</p><blockquote><em>The </em><em>for loop is used to perform the same operation on multiple elements, one at a time.</em></blockquote><pre>for nome in nomi:    print(nome)</pre><blockquote><em>Here, Python takes one name at a time and prints it.</em></blockquote><p>If we reply continue, the model might introduce range() and enumerate(). With another continue, it could explain break and continue, while iterables, iter(), next(), and StopIteration would appear only much later.</p><p>This may seem similar to from zero to expert, but the way we receive information changes. From zero to expert presents a complete progression already organized into levels, while progressive disclosure <strong>intentionally hides what we do not need yet</strong>. It is particularly useful with LLMs because it avoids those technically correct but overly dense responses in which an explanation of an elementary concept ends up dragging in an entire chapter of a manual.</p><h3>16. No jargon: removing vocabulary that gets in the way</h3><p><strong>No jargon</strong> asks the model to <strong>avoid specialized terminology or define it immediately</strong>. It has something in common with ASD-STE100 and <em>plain language</em>, but it is much less structured: <strong>the request is mainly about vocabulary</strong>.</p><p>Prompt:</p><p>Explain the for loop in Python without technical jargon. If you need to use a technical term, explain it immediately.</p><p>Response:</p><blockquote><em>A </em><em>for loop allows Python to take a series of things one at a time and perform the same operation on each one. This series is often called a </em><strong><em>sequence</em></strong><em>, meaning a collection of values arranged in a specific order.</em></blockquote><p>Here, we can still introduce the correct terminology while avoiding explanations that require readers to already know the vocabulary being used to explain the concept.</p><h3>17. Technical deep dive: I want to know what happens underneath</h3><p><strong>Technical deep dive</strong> communicates the opposite intention: <strong>we want the model to use technical vocabulary and reveal the underlying mechanism</strong>. This approach is <strong>useful when simplification starts hiding precisely the details we are interested in</strong>.</p><p>Prompt:</p><p>Give me a technical deep dive into the for loop in Python. I already know the basic syntax and want to understand what happens internally.</p><p>Response:</p><blockquote><em>Python’s </em><em>for loop operates through the iterator protocol. Given:</em></blockquote><pre>for x in oggetto:    corpo</pre><blockquote><em>conceptually, the interpreter first obtains an iterator through:</em></blockquote><pre>iterator = iter(oggetto)</pre><blockquote><em>and then repeatedly calls:</em></blockquote><pre>x = next(iterator)</pre><blockquote><em>Iteration ends when </em><em>next() raises </em><em>StopIteration. An object can therefore be used in a </em><em>for loop if it exposes the behavior required by the iteration protocol.</em></blockquote><p>The same subject that involved candies in ELI5 now introduces iter(), next(), and StopIteration. The model&#39;s level of knowledge has not changed. We have simply changed which part of that knowledge we ask it to make visible.</p><h3>18. Practical only: show me how to use it</h3><p>With <strong>practical only</strong>, we tell the model that <strong>theory should be reduced to the bare minimum and that we mainly want to learn through concrete use</strong>.</p><p>Prompt:</p><p>Explain the for loop in Python using a practical-only approach. Keep theory to a minimum and immediately show me examples I can use.</p><p>Response:</p><blockquote><em>Print all elements:</em></blockquote><pre>for nome in nomi:    print(nome)</pre><blockquote><em>Repeat something five times:</em></blockquote><pre>for i in range(5):    print(&quot;Ciao&quot;)</pre><blockquote><em>Get the position number as well:</em></blockquote><pre>for indice, nome in enumerate(nomi):    print(indice, nome)</pre><blockquote><em>Filter while looping:</em></blockquote><pre>for numero in numeri:    if numero &gt; 10:        print(numero)</pre><p>This kind of response is useful when our immediate goal is not to understand the iterator protocol, but to write a working program.</p><h3>19. 80/20: the minimum that produces the maximum result</h3><p>The reference here is the <strong>Pareto principle</strong>, according to which <strong>in many phenomena, a small proportion of causes is responsible for a much larger proportion of effects</strong>. The <strong>famous 80/20 ratio is an empirical rule rather than a universal law</strong>, so applying it to learning simply means asking which few concepts deliver most of the practical value.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*HPVfXUtbhYaRTMQt.jpg" /></figure><p>Prompt:</p><p>Explain the for loop in Python using the 80/20 approach. Tell me the small set of things I need to know to use it effectively in most situations.</p><p>Response:</p><blockquote><em>To use </em><em>for in most programs, you only need four ideas.</em></blockquote><blockquote><em>for elemento in sequenza takes one element at a time.</em></blockquote><pre>for nome in nomi:    print(nome)</pre><blockquote><em>Use </em><em>range() when you want to repeat something a certain number of times:</em></blockquote><pre>for i in range(10):    print(i)</pre><blockquote><em>Use </em><em>enumerate() when you need both position and value:</em></blockquote><pre>for i, nome in enumerate(nomi):    print(i, nome)</pre><blockquote><em>Use </em><em>break when you want to end the loop early.</em></blockquote><p>The advantage over TL;DR is that <strong>we are not necessarily asking for the shortest possible answer. We are asking the model to select what provides the greatest practical benefit</strong>.</p><h3>20. First principles: rebuilding the concept from its foundations</h3><p><strong>First principles</strong> reasoning attempts to <strong>break a problem down into its fundamental elements and rebuild the solution from those elements</strong>, initially avoiding analogies, conventions, or ready-made formulas. In a technical explanation, it is useful because it shifts the question from “<em>how does this thing work?</em>” to “<em>what fundamental problem does it need to solve, and what are the minimum operations required to solve it?</em>”.</p><p>Prompt:</p><p>Explain the for loop in Python starting from first principles. Break the problem down into fundamental operations and then reconstruct how the loop works.</p><p>The response might be:</p><blockquote><em>We have a collection of values:</em></blockquote><pre>nomi = [&quot;Anna&quot;, &quot;Luca&quot;, &quot;Marco&quot;]</pre><blockquote><em>We want to perform the same operation on each value. We could do it manually:</em></blockquote><pre>print(nomi[0])print(nomi[1])print(nomi[2])</pre><blockquote><em>This solution works only if we know the number of elements in advance, and it requires us to repeat the same instruction manually.</em></blockquote><blockquote><em>We therefore need a mechanism that does three things: takes an element, performs an operation on that element, and moves to the next one.</em></blockquote><blockquote><em>Python expresses this mechanism with:</em></blockquote><pre>for nome in nomi:    print(nome)</pre><p>The difference compared with step by step is significant. Step by step takes an existing mechanism and shows us, in order, what happens during its execution. First principles instead tries to reconstruct <strong>why that mechanism is needed</strong>, starting from the elementary problem it must solve. Once that necessity becomes clear, the syntax of for almost becomes the natural answer to the problem.</p><h3>The same subject, twenty different explanations</h3><p>At this point, <strong>it becomes clear why “explain it simply” is a rather weak prompt</strong>. These approaches can also be combined. For example:</p><p>Explain the for loop in Python to a beginner. Use English inspired by ASD-STE100 principles. Start with a concrete example, then explain it step by step. Use an analogy only if it genuinely helps. At the end, ask me to explain the concept back in my own words and correct any mistakes.</p><p>Here, we are combining beginner-friendly, ASD-STE100, examples first, step by step, analogies, and self-explanation. The prompt describes the cognitive path we want to follow instead of merely identifying the topic.</p><h3>Karpathy Goes Beyond Text</h3><p>Karpathy’s post continues in an even more interesting direction. After ASD-STE100, he suggests <strong>diagrams and images</strong>, because some information is easier to process visually. The next level involves directly requesting an <strong>interactive HTML web page</strong>, taking advantage of the current ability of language models to generate interfaces, animations, and small exploration tools. Finally, he arrives at <strong>personalized explanatory videos</strong>, created specifically for the individual topic.</p><p>He had already <a href="https://x.com/karpathy/status/2053872850101285137">expressed a similar idea</a> a few months earlier when discussing output formats: raw text, Markdown, HTML, and, looking ahead, interactive simulations and videos. According to Karpathy, <strong>the visual component provides a particularly rich channel for receiving information, and HTML already represents an interesting intermediate step today</strong>, because a model can generate it as code while we experience it as an interface.</p><p>The timing is particularly interesting because, just five days after Karpathy’s post, on <strong>October 7, 2026, OpenAI </strong><a href="https://openai.com/it-IT/index/gpt-6-for-everyone/"><strong>introduced</strong></a><strong> GPT-6 with Intelligent UI</strong>, a new capability that allows ChatGPT to build responses by combining text, visual content, and interactive elements depending on the question. <strong>The model can generate charts, buttons, forms, and fully interactive experiences directly within the conversation</strong>, deciding when an explanation calls for an explorable diagram and when plain text is enough. OpenAI explicitly presents this capability as a way to make complex topics easier to understand: users can modify an input value to see how the result changes or work through a problem step by step. This approach closely aligns with the direction Karpathy had suggested just a few days earlier: <strong>an explanation no longer has to be a sequence of paragraphs, because the model can select or build the format best suited to what we are trying to understand</strong>.</p><h3>Research is already moving in this direction</h3><p>On arXiv, at least so far, I have not found a paper that presents exactly a taxonomy like these twenty approaches and systematically compares ELI5, Feynman, Socratic style, rubber duck, progressive disclosure, first principles, and the other methods on the same subject. However, several research directions come remarkably close to the same idea: <strong>an explanation produced by an LLM should not depend solely on the question, but also on who needs to understand it, their level of expertise, and the kind of cognitive process we want to activate</strong>.</p><p>One particularly relevant study is <a href="https://arxiv.org/abs/2607.17022"><em>Can LLM Code Explanations Adapt to Diverse Problem-Solvers’ Needs?</em></a> (July 2026), published in July 2026 by Andrew Anderson and colleagues. The authors begin with the observation that different people approach programming problems in different ways and ask whether explanations generated by LLMs can adapt to these differences. They developed prompts based on five problem-solving styles and generated <strong>1,072 code explanations across six open-weight models</strong>. Their analysis identified <strong>13 different forms of linguistic adaptation</strong>, and the paper also proposes ten prompts specifically designed around problem-solving styles. This is probably the paper that comes closest to the idea developed here: instead of treating an explanation as a single, neutral output, it considers it something that can change depending on how the recipient prefers to approach a problem.</p><p>The question of the intended audience had already been studied in 2023 by Donya Rooein, Amanda Cercas Curry, and Dirk Hovy in <a href="https://arxiv.org/abs/2312.02065"><em>Know Your Audience: Do LLMs Adapt to Different Age and Education Levels?</em></a> (2023), a particularly relevant study for approaches such as <strong>ELI5, ELI10, ELI12, and beginner-friendly</strong>. The authors analyzed four LLMs using <strong>33,600 prompt-response pairs</strong>, starting from one hundred scientific questions and requesting explanations aimed at different age groups, educational levels, and degrees of difficulty. The findings also introduce an important caution for everything discussed so far: asking a model to “explain it to an eleven-year-old” does not guarantee that the output will actually be appropriate for that age. The models analyzed tended to maintain a relatively stable readability range of their own, adapting less than the prompt might lead us to expect. In other words, labels such as ELI5 are excellent tools for guiding generation, but they are not deterministic switches capable of automatically guaranteeing a particular level of comprehensibility.</p><p>Another very direct connection comes from <a href="https://arxiv.org/abs/2506.19107"><em>Improving Student-AI Interaction Through Pedagogical Prompting: An Example in Computer Science Education</em></a> (June 2025), published in June 2025. Ruiwei Xiao and colleagues explicitly introduce the concept of <strong>pedagogical prompting</strong>, meaning prompt design intended to obtain a learning-oriented response from an LLM rather than simply getting a solution. The study begins with research involving <strong>36 instructors teaching introductory university computer science courses</strong>, uses their input to develop an educational intervention, and subsequently evaluates it with <strong>22 beginner students</strong>. After the intervention, students significantly improved their ability to formulate pedagogically useful requests to LLMs. This result connects closely with the twenty approaches described here: writing Explain the for loop and writing Guide me through understanding the for loop by asking questions, without immediately giving me the solution may start from the same technical information, but they produce two very different learning experiences.</p><p>The relationship between <strong>Feynman style, self-explanation, and examples first</strong> appears even more explicitly in <a href="https://arxiv.org/abs/2608.25180"><em>Self-Explanation Tutor for Active Study of CS1 Worked Examples</em></a> (August 2026), published in August 2026. The authors developed <strong>ESSE</strong>, a tutor in which introductory programming students examine worked-out examples, explain in their own words what specific lines of code do, and immediately receive an LLM-generated assessment of the correctness and completeness of their explanations. The experiment shows that feedback encourages students to correct and expand their answers rather than abandon them, while their explanations progressively become more complete and conceptually richer. The interesting difference compared with a normal chatbot is that the LLM is not primarily used to explain. Instead, it is used to <strong>evaluate the explanation constructed by the student and help improve it</strong>. This closely resembles the mechanism we are looking for when we ask the model, “now let me explain it back in my own words and tell me where I’m wrong”.</p><p>Even the <strong>rubber duck</strong> has a surprisingly direct counterpart in LLM research. In 2023, Xinyun Chen and colleagues published <a href="https://arxiv.org/abs/2304.05128"><em>Teaching Large Language Models to Self-Debug</em></a> (2023), introducing a technique called <strong>Self-Debugging</strong>. The paper explicitly mentions <em>rubber duck debugging</em>: the model analyzes its own program, observes its execution, and explains it in natural language to identify errors autonomously, even when the user does not provide a message specifying exactly what is wrong. On the benchmarks used, this procedure improved code generation, with gains of up to 12% in some experiments and a 9-point improvement on the most difficult Spider problems. The rubber duck is therefore not just a charming programmer’s metaphor: verbalizing how code works can become a genuine verification technique, even when the model itself is the one talking to the duck.</p><p>For <strong>progressive disclosure</strong> and, more generally, the idea that the amount of assistance should change as a student’s skills develop, an interesting reference is <a href="https://arxiv.org/abs/2508.01503"><em>A Theory of Adaptive Scaffolding for LLM-Based Pedagogical Agents</em></a> (August 2025). Clayton Cohn and colleagues propose a theoretical framework for educational agents based on <strong>adaptive scaffolding</strong>, the educational support structure that provides the level of assistance needed at a particular moment and modifies it as the student’s needs change. The framework combines Evidence-Centered Design, Social Cognitive Theory, and the Zone of Proximal Development, and is implemented through an agent called Inquizzitor. The relationship with progressive disclosure is not a perfect terminological match, but the underlying principle is similar: the amount and type of information provided do not necessarily have to remain constant throughout an explanation.</p><p>The <strong>first principles</strong> approach also has an interesting parallel in <a href="https://arxiv.org/abs/2310.06117"><em>Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models</em></a> (2023), a study by Google Research and DeepMind that introduces <strong>Step-Back Prompting</strong>. Before directly tackling a specific problem, the model is encouraged to step back and derive the relevant general concepts and high-level principles, subsequently using those principles to guide its reasoning. In experiments involving PaLM-2L, GPT-4, and Llama 2 70B, this strategy produced improvements across several reasoning tasks. For PaLM-2L, for example, the reported gains were 7 points on MMLU Physics, 11 on Chemistry, 27 on TimeQA, and 7 on MuSiQue. It is almost the reverse movement of step by step: instead of immediately diving into the details of a specific case, the model first moves to a higher level, identifies the general principles, and then returns to the concrete problem.</p><p>Finally, a 2026 study takes personalization one step beyond ELI5, beginner-friendly, or technical deep dive. <a href="https://arxiv.org/abs/2607.01242"><em>ExPerT: Personalizing LLM Responses to Users’ Domain Expertise via Query-Wise Semantic and Keystroke Behavioral Cues</em></a> (2023) attempts to make <strong>the system automatically estimate the user’s level of expertise</strong>, rather than waiting for the user to specify it in the prompt. ExPerT combines what the user writes with behavioral signals derived from typing dynamics, estimates a level of expertise for each question ranging from Novice, Beginner, Intermediate, Proficient, to Expert, and uses this information to adjust the amount of detail, terminology, and conceptual complexity of the response. In a study involving <strong>40 participants and 1,270 queries</strong>, the system reduced expertise estimation error by 65.7% compared with the best baseline method and increased response satisfaction by 17.52%, from 3.71 to 4.36 on a five-point scale. The study is particularly interesting because it suggests a possible evolution of the techniques we are currently using manually. Today, we write ELI5, beginner-friendly, or technical deep dive. A sufficiently capable system could instead infer from the context how much we know about a subject and automatically choose the appropriate explanation level.</p><p>Taken together, these studies do not prove that there is one universally superior way to explain something. They suggest something more useful: <strong>explanation is a variable of the system</strong>. It can be adapted to educational level, technical expertise, the way a person approaches problems, and the stage of the learning process. It can ask students to produce a self-explanation, progressively reduce assistance, reveal general principles before details, or transform the same model from an answer provider into a tutor that asks questions and evaluates what we have understood. The twenty approaches described so far can therefore also be seen as a very simple, manual form of personalization: through the prompt, we tell the model what kind of explanation we need at that particular moment.</p><h3>The shortcuts circulating on the Internet</h3><p>Many expressions are <a href="https://www.tomsguide.com/ai/chatgpt/9-slash-commands-to-get-better-answers-from-chatgpt-number-7-is-my-personal-favorite">circulating</a> on the Internet as if they were actual ChatGPT <strong>slash commands</strong>, such as /human, /critic, /senior, /diff, /tldr, /devilsadvocate, /rubberduck, /table, or /bullets. It is worth distinguishing three different cases here. There are <strong>official slash commands</strong>, meaning commands genuinely recognized by the product and handled by its interface or system, such as those documented by OpenAI in certain ChatGPT environments. However, the expressions circulating online, such as /human or /devilsadvocate, generally do not activate an internal ChatGPT feature and do not correspond to official commands. <strong>The slash is mainly a visual convention, while the LLM interprets the word that follows it linguistically.</strong></p><p>This does not mean, however, that these shortcuts are useless. During training, LLMs have encountered expressions such as <em>TL;DR</em>, <em>rubber duck debugging</em>, <em>devil’s advocate</em>, and <em>technical critique</em>, so they can often correctly reconstruct the user’s intention. /rubberduck, for example, may be interpreted as a request to guide reasoning through questions (in this specific case, GitHub actually <a href="https://github.blog/ai-and-ml/github-copilot/a-guide-to-slash-commands-in-the-github-copilot-app/">documents it</a> as a command in its Copilot app that uses another model to provide a second opinion and challenge assumptions). /critic tends to steer the answer toward weaknesses and objections, while /tldr is normally interpreted as a request for a very short summary. In these cases, <strong>it is not the slash that does the work, but the semantic meaning of the label, which naturally depends on how accurately the model interprets that word in context.</strong></p><p>That is why these shortcuts should be taken with a grain of salt. They often work very well, but their behavior can vary between models, versions, or different chatbots. These short expressions are best understood as a kind of <strong>semantic shorthand</strong>, meaning <strong>small linguistic macros that work because the LLM recognizes their intended meaning</strong>, without necessarily having an actual software command behind them.</p><p><em>Originally published at</em> <a href="https://www.levysoft.it/archivio/2026/10/08/asd-ste100-e-eli5-20-modi-per-farsi-spiegare-meglio-le-cose-dagli-llm/"><em>Levysoft</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9d0661e46e19" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>