<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Wingedsheep: Artificial Intelligence Blog]]></title><description><![CDATA[A blog about artificial intelligence, machine learning, programming and anything else that interests me.]]></description><link>https://wingedsheep.com/</link><image><url>https://wingedsheep.com/favicon.png</url><title>Wingedsheep: Artificial Intelligence Blog</title><link>https://wingedsheep.com/</link></image><generator>Ghost 5.45</generator><lastBuildDate>Sat, 04 Apr 2026 18:23:00 GMT</lastBuildDate><atom:link href="https://wingedsheep.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[How I built a Magic: The Gathering game client in two weeks]]></title><description><![CDATA[Magic: The Gathering has over 28,000 unique cards. Each one can interact with every other in ways the designers never anticipated. The comprehensive rules document is over 200 pages long.I decided to build an engine that implements all of it. And I barely wrote any code myself.]]></description><link>https://wingedsheep.com/building-argentum-a-magic-the-gathering-rules-engine/</link><guid isPermaLink="false">6980ee7eef353f005f17e2ef</guid><category><![CDATA[board games]]></category><category><![CDATA[programming]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Mon, 02 Feb 2026 18:54:15 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2026/02/download--3-.png" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2026/02/download--3-.png" alt="How I built a Magic: The Gathering game client in two weeks"><p></p><p>It started with a friend mentioning it would be fun to run draft tournaments online. MTG Arena doesn&apos;t support private tournaments&#x2014;you can play against each other, but organizing an actual draft pod with friends and running a bracket? Not happening.</p><p>So I figured: how hard could it be?</p><p>Around the same time, I&apos;d been curious how well AI coding agents actually perform on complex projects. Claude Code had been getting a lot of praise, and this seemed like the perfect test case. Magic: The Gathering has over 28,000 unique cards, each able to interact with every other in ways the designers never anticipated. The comprehensive rules document is over 200 pages long.</p><p>I sat down and estimated the effort. Without AI assistance, building a complete platform&#x2014;SDK, card sets, rules engine, game server, web frontend, deployment pipeline&#x2014;would easily be a 6-month hobby project. Probably more, given the notorious complexity of MTG&apos;s rules. The layer system alone could eat a month.</p><p>A week and a half later, I had a working solution.</p><p>41,000 lines of Kotlin. 12,000 lines of TypeScript. A functional draft system. Real-time multiplayer. And it plays Magic&#x2014;correctly. The layer system handles Humility. Triggered abilities stack in APNAP order. State-based actions cascade properly.</p><p>This was the moment it really hit me how fast this technology is moving.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2026/02/image-1.png" class="kg-image" alt="How I built a Magic: The Gathering game client in two weeks" loading="lazy" width="2000" height="1014" srcset="https://wingedsheep.com/content/images/size/w600/2026/02/image-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2026/02/image-1.png 1000w, https://wingedsheep.com/content/images/size/w1600/2026/02/image-1.png 1600w, https://wingedsheep.com/content/images/size/w2400/2026/02/image-1.png 2400w"><figcaption>The game engine at work</figcaption></figure><h2 id="what-vibe-coding-actually-looks-like">What Vibe Coding Actually Looks Like</h2><p></p><p>I barely wrote any code myself. Instead, I guided the process&#x2014;describing what I wanted, reviewing what came back, course-correcting when the implementation drifted. Think of it as pair programming where your partner types 50x faster than you but needs you to keep the big picture in focus.</p><p>To keep Claude aligned with my vision, I set up a <code>docs</code> folder containing guidance on architecture decisions, coding style, and design principles. From these docs, I generated a <code>CLAUDE.md</code> file&#x2014;a dedicated instruction set that Claude Code reads automatically&#x2014;and kept it up-to-date as the project evolved. This upfront investment paid off continuously: Claude would follow established patterns without me having to repeat myself.</p><p>What I loved most was plan mode. Before Claude starts building anything significant, it asks clarifying questions: &quot;How should this interact with existing triggers? Should the effect be optional? What happens if there are no valid targets?&quot; Then it forms a concrete plan and waits for approval. This back-and-forth is invaluable. Half the bugs in software come from misunderstood requirements&#x2014;plan mode surfaces those misunderstandings before any code gets written.</p><p>For architecture reviews, I&apos;d occasionally pull in Gemini. With its million-token context window, I could dump the entire codebase into a single request and ask &quot;does this structure make sense?&quot; or &quot;what am I missing?&quot; The combination works well: Claude Code for the building, Gemini for the birds-eye sanity checks.</p><p>The result is a codebase I understand deeply&#x2014;because I co-designed it&#x2014;but didn&apos;t have to type out line by line. Would I have finished this project without AI assistance? Probably not. It would have joined the graveyard of ambitious side projects that never quite made it.</p><h2 id="the-problem">The Problem</h2><p></p><p>The intuiting might be to take the obvious approach: model cards as class hierarchies. A Creature extends Permanent, which extends Card. Simple, intuitive, wrong.</p><p>The problem is that in Magic, a card&apos;s identity is fluid. That creature you control? An opponent can steal it. That instant in your hand? It might be a creature on the battlefield (thanks, Zoetic Cavern). That 2/2 bear? With the right enchantments, it&apos;s now a 7/7 flying artifact creature with lifelink.</p><p>Object-oriented inheritance can&apos;t handle this. You can&apos;t re-parent an object at runtime. So most engines end up with sprawling conditional logic, special cases, and inevitable bugs when two obscure cards interact in ways nobody tested.</p><h2 id="starting-simple">Starting Simple</h2><p></p><p>I started with Portal, the simplified beginner set from 1997. No instants (well a few, but they weren&apos;t called instants yet), few activated abilities, mostly just creatures and sorceries. A manageable scope to get the core engine working before tackling the full comprehensive rules.</p><p>There&apos;s something fitting about that. Portal was how I started playing Magic when I was 8 years old. Now, decades later, it became the foundation for building an engine that handles the full complexity of the game.</p><p>Once Portal worked&#x2014;creatures attacking, sorceries resolving, life totals tracking&#x2014;the architecture proved solid enough to layer on the rest. The stack. Triggered abilities. Replacement effects. The infamous layer system.</p><h2 id="the-full-stack">The Full Stack</h2><p></p><p>The project splits into cleanly separated modules, each with a single responsibility:</p><h3 id="the-sdk">The SDK</h3><p></p><p>The SDK defines the vocabulary&#x2014;what a card is, what effects exist, what costs mean. It&apos;s pure data structures and a DSL for defining cards. No game logic, no dependencies.</p><p>Think of it as the shared language that card definitions and the engine both speak. It provides the building blocks: mana costs, target filters, effect types, duration modifiers:</p><pre><code class="language-kotlin">// The Effects facade - card definitions compose these primitives
Effects.DealDamage(3)                    // Bolt something
Effects.DrawCards(2)                     // Blue&apos;s favorite
Effects.GainLife(5)                      // White&apos;s thing
Effects.Destroy(EffectTarget.AnyTarget)  // Removal
Effects.ReturnToHand(target)             // Bounce
Effects.ModifyStats(4, 4, Duration.EndOfTurn)  // Pump spell
</code></pre><p>The SDK is deliberately minimal. It describes the &quot;what&quot; without the &quot;how&quot;. A card has a mana cost, a type line, and abilities. An effect has a target and a duration. That&apos;s it. The actual game logic lives elsewhere.</p><h3 id="the-card-sets">The Card Sets</h3><p></p><p>The card sets use that DSL to define actual cards. Portal, Alpha, custom sets&#x2014;they&apos;re all just data. Each card is a declarative description of what it does:</p><pre><code class="language-kotlin">val MonstrousGrowth = card(&quot;Monstrous Growth&quot;) {
    manaCost = &quot;{1}{G}&quot;
    typeLine = &quot;Sorcery&quot;

    spell {
        target = TargetCreature(filter = CreatureTargetFilter.Any)
        effect = ModifyStatsEffect(
            powerModifier = 4,
            toughnessModifier = 4,
            target = EffectTarget.ContextTarget(0)
        )
    }
}
</code></pre><p>Triggered abilities work the same way:</p><pre><code class="language-kotlin">val ManOWar = card(&quot;Man-o&apos;-War&quot;) {
    manaCost = &quot;{2}{U}&quot;
    typeLine = &quot;Creature &#x2014; Jellyfish&quot;
    power = 2
    toughness = 2

    triggeredAbility {
        trigger = OnEnterBattlefield()
        target = TargetCreature()
        effect = ReturnToHandEffect(EffectTarget.ContextTarget(0))
    }
}
</code></pre><p>Traditional engines hardcode card logic. Want to add a new card? Write a new class, handle all its edge cases, hope you didn&apos;t break something else.</p><p>Argentum treats cards as pure data. The engine doesn&apos;t know about Monstrous Growth specifically. It knows how to create continuous effects. It knows how to handle targets. The card definition just connects these primitives. Adding new cards rarely requires engine changes.</p><p>Adding a new set means writing card definitions, nothing more. The sets don&apos;t know how the game works; they just describe what cards do.</p><h3 id="the-rules-engine">The Rules Engine</h3><p></p><p>The rules engine is the brain. Pure Kotlin, zero server dependencies. This is where the comprehensive rules live: the stack, priority system, combat phases, triggered abilities, state-based actions, replacement effects, and the layer system.</p><p><strong>Entity-Component-System Architecture</strong></p><p>Instead of class hierarchies, Argentum uses pure ECS. Everything is an entity&#x2014;just a unique ID. Cards, players, spells on the stack, even continuous effects like &quot;Giant Growth gave this +3/+3 until end of turn.&quot; All entities.</p><p>Each entity is defined by its components: pure data bags with no behavior. A creature on the battlefield might have components marking it as tapped, tracking its controller, counting its +1/+1 counters. The entity doesn&apos;t &quot;know&quot; it&apos;s tapped. It simply has&#x2014;or doesn&apos;t have&#x2014;that data attached.</p><p>All logic lives in systems. The action processor takes a game state and an action, then returns a new state plus events:</p><pre><code>(GameState, GameAction) &#x2192; ExecutionResult(GameState, List&lt;GameEvent&gt;)
</code></pre><p>The state is immutable. Every game action creates a fresh snapshot, which makes replay, undo, and network sync trivial. Completely deterministic: two identical inputs always produce identical outputs.</p><p><strong>The Layer System</strong></p><p>Here&apos;s where it gets interesting. When multiple effects modify a permanent, they apply in a specific order across seven layers:</p><ol><li><strong>Copy effects</strong> (Clone becomes a copy of target creature)</li><li><strong>Control-changing effects</strong> (Mind Control steals a creature)</li><li><strong>Text-changing effects</strong> (Magical Hack changes &quot;swamp&quot; to &quot;island&quot;)</li><li><strong>Type-changing effects</strong> (Blood Moon makes nonbasic lands Mountains)</li><li><strong>Color-changing effects</strong> (Painter&apos;s Servant makes everything blue)</li><li><strong>Ability-adding/removing effects</strong> (Glorious Anthem gives creatures +1/+1)</li><li><strong>Power/toughness effects</strong> (with five sublayers: setting, modifying, counters, switching)</li></ol><p>Get the order wrong and your engine produces incorrect game states.</p><p>Argentum separates &quot;base state&quot; from &quot;projected state.&quot; The base state is what&apos;s stored&#x2014;the permanent as it exists without modifications. The state projector calculates what players actually see by applying all active continuous effects in the correct layer order.</p><p>This separation is crucial. When an effect ends (Giant Growth wears off at end of turn), you don&apos;t need to &quot;undo&quot; anything&#x2014;just remove the effect from the list and recalculate. The base state never changed.</p><p>The tricky part is dependencies. Sometimes effect A changes whether effect B applies, which might change whether effect A applies. Consider Humility (makes all creatures 1/1 with no abilities) and Opalescence (makes enchantments into creatures). If Humility is an enchantment... does it affect itself?</p><p>Argentum handles this with a trial application system&#x2014;apply effects tentatively, detect when one effect&apos;s outcome depends on another&apos;s application, establish the dependency order, then apply for real. It&apos;s the kind of edge case that breaks most MTG engines. Argentum handles it correctly.</p><p>Because the engine is completely deterministic and has no I/O, testing is straightforward. Feed it a state and an action, verify the output. No mocking, no flakiness.</p><h3 id="the-game-server">The Game Server</h3><p></p><p>The game server wraps the engine for online play. It handles WebSocket connections, manages concurrent game sessions, authenticates players via JWT, and&#x2014;critically&#x2014;filters hidden information.</p><p>The engine produces a complete game state including everyone&apos;s hands and library order. The server ensures each player only sees what they&apos;re entitled to see:</p><pre><code class="language-kotlin">private fun isZoneVisibleTo(zoneKey: ZoneKey, viewingPlayerId: EntityId): Boolean {
    return when (zoneKey.zoneType) {
        ZoneType.LIBRARY -&gt; false  // Hidden from everyone
        ZoneType.HAND -&gt; zoneKey.ownerId == viewingPlayerId  // Only owner sees
        ZoneType.BATTLEFIELD,
        ZoneType.GRAVEYARD,
        ZoneType.STACK,
        ZoneType.EXILE -&gt; true  // Public zones
    }
}
</code></pre><p>Your opponent&apos;s hand stays hidden. Scry effects only reveal cards to the player who scryed. The engine can stay pure while the server handles the messy real-world concerns.</p><p>The server module also houses scenario tests&#x2014;integration tests that simulate actual gameplay with player inputs and outputs. These tests verify that cards interact correctly in realistic situations: casting spells, responding to triggers, making decisions. When a new card is added, a scenario test ensures it behaves correctly in context, not just in isolation.</p><h3 id="the-web-client">The Web Client</h3><p></p><p>The web client follows what we call the &quot;dumb terminal&quot; pattern. It renders the game state it receives. It captures user intent through clicks. That&apos;s it.</p><pre><code class="language-typescript">submitAction: (action) =&gt; {
    ws?.send(createSubmitActionMessage(action))
    set({ selectedCardId: null, targetingState: null })
}
</code></pre><p>When you tap a creature, the client doesn&apos;t validate whether it&apos;s summoning sick or whether you control it&#x2014;it just sends &quot;player wants to tap this entity&quot; to the server. The server checks legality using the engine, updates state, broadcasts the result.</p><p>This eliminates an entire class of bugs where client and server disagree about game rules. If the rules change, you only update the engine. The client stays blissfully ignorant, just visualizing state and forwarding actions.</p><p>Each layer stays focused. The engine doesn&apos;t know about networking. The server doesn&apos;t know about React. The client doesn&apos;t know the rules.</p><h2 id="why-build-this">Why Build This?</h2><p></p><p>Because I like challenges and I like playing Magic. The comprehensive rules are a 30-year accretion of edge cases that somehow still form a coherent system&#x2014;exactly the kind of puzzle I can&apos;t resist.</p><p>Without AI assistance, this would have stayed on my &quot;someday&quot; list forever. Instead, it&apos;s live. The layer system handles Humility correctly. Triggered abilities fire in the right order. You can actually draft with friends.</p><p>The engine is open source at <a href="https://github.com/wingedsheep/argentum-engine?ref=wingedsheep.com">github.com/wingedsheep/argentum-engine</a>. Play at <a href="https://magic.wingedsheep.com/?ref=wingedsheep.com">magic.wingedsheep.com</a>.</p><p><strong>&#x2014; Vincent</strong></p>]]></content:encoded></item><item><title><![CDATA[Building a Modular Monolith]]></title><description><![CDATA[A practical guide to building a modular monolith in Kotlin and Spring Boot]]></description><link>https://wingedsheep.com/building-a-modular-monolith/</link><guid isPermaLink="false">693d6a82ef353f005f17dfb5</guid><category><![CDATA[Software Architecture]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Sat, 13 Dec 2025 14:03:05 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2025/12/download--8-.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><div style="background: #0d1117; border-radius: 12px; padding: 32px; margin: 32px 0; font-family: -apple-system, BlinkMacSystemFont, &apos;Segoe UI&apos;, Roboto, sans-serif; border: 1px solid #30363d;">
  
  <!-- GitHub CTA -->
  <a href="https://github.com/wingedsheep/eco-logique?ref=wingedsheep.com" target="_blank" rel="noopener" style="display: flex; align-items: center; gap: 16px; padding: 20px; background: rgba(35,134,54,0.1); border-radius: 10px; border: 1px solid rgba(35,134,54,0.3); text-decoration: none; margin-bottom: 28px; transition: all 0.2s;">
    <svg height="24" width="24" viewbox="0 0 16 16" fill="#8b949e">
      <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/>
    </svg>
    <div style="flex-grow: 1;">
      <div style="color: #f0f6fc; font-weight: 600; font-size: 15px;">View Example on GitHub</div>
      <div style="color: #8b949e; font-size: 13px;">Complete source code in Kotlin + Spring Boot</div>
    </div>
    <svg width="16" height="16" viewbox="0 0 16 16" fill="#8b949e">
      <path d="M8.22 2.97a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.042-.018.75.75 0 0 1-.018-1.042l2.97-2.97H3.75a.75.75 0 0 1 0-1.5h7.44L8.22 4.03a.75.75 0 0 1 0-1.06z"/>
    </svg>
  </a>

  <!-- Table of Contents -->
  <div style="color: #8b949e; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 16px; font-weight: 500;">Contents</div>
  
  <nav style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;">
    <a href="#introduction" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Intro</span>
      The Coupling Problem
    </a>
    <a href="#part-1" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 1</span>
      Where to Draw the Lines
    </a>
    <a href="#part-2" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 2</span>
      Enforcing the Lines
    </a>
    <a href="#part-3" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 3</span>
      Inside the Modules
    </a>
    <a href="#part-4" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 4</span>
      Isolating Data
    </a>
    <a href="#part-5" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 5</span>
      Module Communication
    </a>
    <a href="#part-6" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 6</span>
      Errors and Validation
    </a>
    <a href="#part-7" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 7</span>
      Testing
    </a>
    <a href="#part-8" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #58a6ff; font-size: 11px; font-weight: 600; min-width: 44px;">Part 8</span>
      Putting It All Together
    </a>
    <a href="#conclusion" class="toc-link" style="color: #f0f6fc; text-decoration: none; padding: 12px 16px; border-radius: 8px; font-size: 14px; transition: background 0.15s; display: flex; align-items: center; gap: 10px;">
      <span style="color: #238636; font-size: 11px; font-weight: 600; min-width: 44px;">End</span>
      Conclusion
    </a>
  </nav>

</div>

<style>
  .toc-link:hover {
    background: rgba(255,255,255,0.06);
  }
  a[href*="github"]:hover {
    background: rgba(35,134,54,0.15) !important;
    border-color: rgba(35,134,54,0.5) !important;
  }
</style><!--kg-card-end: html--><!--kg-card-begin: html--><div id="introduction"></div><!--kg-card-end: html--><h2 id="introduction">Introduction</h2><img src="https://wingedsheep.com/content/images/2025/12/download--8-.jpeg" alt="Building a Modular Monolith"><p></p><p>Most backend codebases don&apos;t start broken. They start small, coherent, and easy to change. Then time passes.</p><p>Features ship. Teams grow. Deadlines happen. And one day you realize that changing the checkout flow requires touching seven packages, three shared utilities, and a database table that four other features depend on. You&apos;re not sure what will break, so you test everything manually and deploy on a Friday afternoon with your finger hovering over the rollback button.</p><p>This is two problems working together. <strong>Low cohesion</strong>: related code is scattered across the codebase instead of living together. <strong>High coupling</strong>: unrelated modules depend on each other&apos;s internals, so changes ripple outward in unpredictable ways.</p><p>When it gets bad enough, teams usually respond in one of two ways.</p><p>Some reach for <strong>microservices</strong>. Split everything into separate services. Coupling becomes impossible because nothing can import anything directly. But this trades code complexity for operational complexity: network failures become normal failures, data consistency requires careful choreography, and &quot;running locally&quot; becomes a research project. You wanted to fix your architecture and accidentally became a distributed systems team.</p><p>Others try <strong>better discipline</strong>. Add architectural guidelines. Improve folder structure. Be more careful in code review. This is cheaper and less disruptive&#x2014;but discipline erodes. Someone imports an internal class because it&apos;s convenient. Someone adds a &quot;temporary&quot; dependency to meet a deadline. Guidelines without enforcement are aspirations.</p><p>A modular monolith is a way to make the second approach actually stick. It&apos;s a monolith where boundaries are enforced by the build system&#x2014;where you <em>can&apos;t</em> import another module&apos;s internals because the compiler won&apos;t let you.</p><p>You keep the operational simplicity of a single deployable. But you get real architecture: explicit contracts between modules, isolated data, and the ability to change one module without accidentally breaking others. When something goes wrong at 3am, there&apos;s one service to check, one log to read, one thing to restart.</p><p>This guide is a practical walkthrough of building one in Kotlin and Spring Boot. I&apos;ll cover where to draw boundaries, how to enforce them with Gradle, how to structure code inside modules, how to isolate data, how modules communicate, error handling, and testing. The focus is on patterns that work in real codebases&#x2014;things I&apos;ve learned building systems this way, not theoretical ideals from a whiteboard.</p><hr><!--kg-card-begin: html--><div id="part-1"></div><!--kg-card-end: html--><h2 id="part-1-where-to-draw-the-lines">Part 1: Where to Draw the Lines</h2><p></p><p>We want boundaries. But where should they go?</p><p>Domain-Driven Design has opinions about this. DDD has a reputation for academic terminology and books thicker than your laptop, but ignore all that&#x2014;the part that matters for architecture is simple: organize around business domains, not technical layers.</p><h3 id="domains-not-layers">Domains, Not Layers</h3><p></p><p>Most backend projects start with a structure like this:</p><pre><code>com.example.app/
&#x251C;&#x2500;&#x2500; controllers/
&#x2502;   &#x251C;&#x2500;&#x2500; ProductController.kt
&#x2502;   &#x251C;&#x2500;&#x2500; OrderController.kt
&#x2502;   &#x2514;&#x2500;&#x2500; ShippingController.kt
&#x251C;&#x2500;&#x2500; services/
&#x2502;   &#x251C;&#x2500;&#x2500; ProductService.kt
&#x2502;   &#x251C;&#x2500;&#x2500; OrderService.kt
&#x2502;   &#x2514;&#x2500;&#x2500; ShippingService.kt
&#x2514;&#x2500;&#x2500; repositories/
    &#x251C;&#x2500;&#x2500; ProductRepository.kt
    &#x251C;&#x2500;&#x2500; OrderRepository.kt
    &#x2514;&#x2500;&#x2500; ShippingRepository.kt
</code></pre><p>All controllers in one folder, all services in another, all repositories in a third. It feels tidy. It looks professional in code review.</p><p>It&apos;s also a mistake.</p><p>When you add a shipping feature, you touch files in three different folders. When you want to understand how shipping works, you&apos;re jumping between layers, assembling the picture from scattered pieces. And nothing stops <code>OrderService</code> from calling <code>ProductRepository</code> directly&#x2014;the folder structure creates the <em>appearance</em> of organization without any actual boundaries.</p><p>The alternative is organizing by domain:</p><pre><code>com.example.app/
&#x251C;&#x2500;&#x2500; products/
&#x2502;   &#x251C;&#x2500;&#x2500; ProductController.kt
&#x2502;   &#x251C;&#x2500;&#x2500; ProductService.kt
&#x2502;   &#x2514;&#x2500;&#x2500; ProductRepository.kt
&#x251C;&#x2500;&#x2500; orders/
&#x2502;   &#x251C;&#x2500;&#x2500; OrderController.kt
&#x2502;   &#x251C;&#x2500;&#x2500; OrderService.kt
&#x2502;   &#x2514;&#x2500;&#x2500; OrderRepository.kt
&#x2514;&#x2500;&#x2500; shipping/
    &#x251C;&#x2500;&#x2500; ShippingController.kt
    &#x251C;&#x2500;&#x2500; ShippingService.kt
    &#x2514;&#x2500;&#x2500; ShippingRepository.kt
</code></pre><p>Now a <code>shipping/</code> folder contains everything about shipping. New developers can open one folder and understand one capability. Changes stay local. And the structure reveals where real boundaries could be enforced.</p><h3 id="the-same-word-different-meanings">The Same Word, Different Meanings</h3><p></p><p>Ask three people in an e-commerce company what &quot;Product&quot; means:</p><p>The <strong>catalog team</strong> says name, description, price, images, sustainability rating&#x2014;it&apos;s what customers browse and search. The <strong>warehouse team</strong> says weight, dimensions, and whether it&apos;s fragile&#x2014;they need to put it in a box, not describe it. The <strong>inventory team</strong> says a product ID and a quantity on a shelf&#x2014;they don&apos;t care what it looks like.</p><p>These aren&apos;t three views of the same thing. They&apos;re three different concepts that happen to share a name. DDD calls this a <em>bounded context</em>: a boundary within which a term has a consistent meaning. You can call it whatever you want. The point is that &quot;Product&quot; means something different depending on who you ask.</p><p>The instinct is to create one <code>Product</code> class that serves everyone:</p><pre><code class="language-kotlin">data class Product(
    val id: ProductId,
    val name: String,
    val description: String,
    val price: Money,
    val images: List&lt;Image&gt;,
    val sustainabilityRating: String,
    val weightGrams: Int,
    val dimensions: Dimensions,
    val isFragile: Boolean,
    val warehouseQuantities: Map&lt;WarehouseId, Int&gt;,
    // ... and it keeps growing
)
</code></pre><p>One class, no duplication&#x2014;efficient, right? But this is how coupling starts. The catalog team adds <code>images</code>; now warehouse code depends on it. The warehouse team adds <code>dimensions</code>; now catalog code carries that weight. Everyone&apos;s afraid to touch this class, and everyone has to.</p><p>The fix is recognizing that each context should define its own model:</p><pre><code class="language-kotlin">// In the catalog context
data class Product(
    val id: ProductId,
    val name: String,
    val description: String,
    val price: Money,
    val images: List&lt;Image&gt;,
)

// In the shipping context
data class ShippableItem(
    val productId: ProductId,
    val weightGrams: Int,
    val dimensions: Dimensions,
    val isFragile: Boolean,
)
</code></pre><p>Yes, you now have two classes with some overlapping fields. This feels wasteful until you realize the alternative is a God object that grows until it collapses under its own weight. Duplication between contexts is healthy. Duplication within a context is a code smell. Learn the difference.</p><h3 id="finding-the-right-boundaries">Finding the Right Boundaries</h3><p></p><p>There&apos;s no algorithm for this, but there are useful signals.</p><p>Listen for different vocabulary. When warehouse staff say &quot;pick&quot; and &quot;pack&quot; while marketing says &quot;browse&quot; and &quot;wishlist,&quot; you&apos;re hearing two contexts. Language differences usually reflect model differences&#x2014;this is more reliable than most technical heuristics.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/12/image-38.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="1408" height="768" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-38.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/12/image-38.png 1000w, https://wingedsheep.com/content/images/2025/12/image-38.png 1408w" sizes="(min-width: 720px) 720px"></figure><p>Different rates of change are another clue. Pricing rules might change weekly; shipping carrier integrations change quarterly. Bundling them means every pricing change risks breaking shipping. And if different people are responsible for different areas, those are natural seams. Conway&apos;s Law isn&apos;t just an observation&#x2014;it&apos;s a force you can work with instead of against.</p><p>Transaction boundaries help too. If two operations almost always happen together in the same database transaction, they probably belong together. If they don&apos;t need transactional consistency, that&apos;s a hint they could be separate. Conversely, if module A makes fifteen calls to module B for every operation, maybe they shouldn&apos;t be separate at all.</p><p>Size matters. Can you describe the module in one sentence without conjunctions? &quot;Manages the product catalog&quot; works. &quot;Handles payments and shipping and user profiles&quot; is three modules wearing a trench coat.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-48.png" style="max-width: 500px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><p>Watch out for a few traps. Don&apos;t model from the database up&#x2014;tables reflect storage decisions, not business boundaries. Don&apos;t share entities across contexts just because it feels DRY; if you&apos;re adding fields that only one context uses, you&apos;ve got coupling. Don&apos;t slice too thin&#x2014;you don&apos;t need a separate module for &quot;OrderValidation,&quot; that&apos;s just part of orders. And don&apos;t draw boundaries that cut across team ownership. The best technical boundary won&apos;t help if nobody knows who&apos;s responsible for it.</p><h3 id="the-example-well-use">The Example We&apos;ll Use</h3><p></p><p>For this guide, we&apos;re building an e-commerce system with four bounded contexts:</p><p><strong>Products</strong> owns the catalog&#x2014;names, descriptions, prices, images. <strong>Orders</strong> handles purchases and their lifecycle. <strong>Shipping</strong> manages fulfillment and delivery. <strong>Inventory</strong> tracks what&apos;s in stock and where.</p><p>Orders depends on Products (needs to know what&apos;s being ordered) and Inventory (needs to check availability). Shipping depends on Orders (needs to know what to ship) and Products (needs weights and dimensions). Nobody depends on Orders&#x2014;it&apos;s a leaf in the dependency graph.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/12/image-62.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="912" height="1000" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-62.png 600w, https://wingedsheep.com/content/images/2025/12/image-62.png 912w" sizes="(min-width: 720px) 720px"><figcaption>Module dependencies</figcaption></figure><p>These boundaries aren&apos;t perfect. We&apos;ll discover friction as we build. That&apos;s fine&#x2014;the enforcement mechanisms in the next section make refactoring boundaries a manageable task rather than an archaeological expedition.</p><p></p><hr><!--kg-card-begin: html--><div id="part-2"></div><!--kg-card-end: html--><h2 id="part-2-enforcing-the-lines">Part 2: Enforcing the Lines</h2><p></p><p>Boundaries on a whiteboard are aspirations. Boundaries in the build system are architecture.</p><p>Without enforcement, boundaries erode. It happens slowly, always with good intentions. Someone imports an internal class because it&apos;s convenient. Someone adds a &quot;temporary&quot; dependency to meet a deadline. Six months later, your modules are coupled in ways nobody intended, and untangling them is a project of its own.</p><p>The solution is to make invalid dependencies a compiler error, not a code review discussion.</p><h3 id="contracts-not-implementations">Contracts, Not Implementations</h3><p></p><p>When Shipping needs product information, the obvious approach is to call the Products service directly:</p><pre><code class="language-kotlin">class ShippingService(
    private val productService: ProductServiceImpl
) {
    fun calculateWeight(productId: ProductId): Grams {
        val product = productService.getProduct(productId)
        return product.weightGrams
    }
}
</code></pre><p>This works, but it creates tight coupling. Shipping now depends on <code>ProductServiceImpl</code>&#x2014;a concrete class with its own dependencies, internal structure, and implementation details. And the coupling is transitive: <code>ProductServiceImpl</code> depends on <code>ProductRepository</code>, which depends on database entities. Shipping has indirectly coupled itself to the Products database schema.</p><p>The fix is depending on a contract instead of an implementation:</p><pre><code class="language-kotlin">interface ProductServiceApi {
    fun getProduct(id: ProductId): ProductDto
}

class ProductServiceImpl(
    private val repository: ProductRepository
) : ProductServiceApi {
    override fun getProduct(id: ProductId): ProductDto { ... }
}

class ShippingService(
    private val productService: ProductServiceApi  // Interface, not implementation
) {
    fun calculateWeight(productId: ProductId): Grams {
        val product = productService.getProduct(productId)
        return Grams(product.weightGrams)
    }
}
</code></pre><p>Now Shipping depends on <code>ProductServiceApi</code>&#x2014;an interface with no implementation details. The Products team can refactor their internals, change their database, swap out libraries. As long as they fulfill the contract, Shipping won&apos;t notice.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-52.png" style="max-width: 600px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><p>But where does the contract live? If the interface sits inside the Products module alongside its implementation, Shipping still depends on the Products module. We need to separate the contract into its own place.</p><h3 id="the-apiimplementation-split">The API/Implementation Split</h3><p></p><p>In Gradle, we split each bounded context into two modules:</p><pre><code>products/
&#x251C;&#x2500;&#x2500; products-api/     # The contract
&#x2514;&#x2500;&#x2500; products-impl/    # The implementation
</code></pre><p>The rules are simple. An <code>-impl</code> module depends on its own <code>-api</code> (it implements the contract). Other modules depend only on <code>-api</code> modules, never on <code>-impl</code>. No circular dependencies.</p><pre><code class="language-kotlin">// shipping-impl/build.gradle.kts
dependencies {
    implementation(project(&quot;:shipping:shipping-api&quot;))
    implementation(project(&quot;:products:products-api&quot;))  // Contract only
    // Cannot add products-impl - that&apos;s the whole point
}
</code></pre><p>If someone tries to import a class from <code>products-impl</code>, the build fails. No discussion needed.</p><p>The <code>-api</code> module contains the public contract: interfaces defining what the module can do, DTOs for data exchange, events other modules might listen to, and error types so callers know what can go wrong.</p><pre><code class="language-kotlin">// products-api
interface ProductServiceApi {
    fun getProduct(id: ProductId): Result&lt;ProductDto, ProductError&gt;
}

data class ProductDto(
    val id: ProductId,
    val name: String,
    val weightGrams: Int,
)

sealed class ProductError {
    data class NotFound(val id: ProductId) : ProductError()
}
</code></pre><p>The <code>-impl</code> module contains everything private: domain models with business logic, service implementations, persistence layer, controllers. Mark these <code>internal</code> so Kotlin reinforces the boundary:</p><pre><code class="language-kotlin">// products-impl
@Service
internal class ProductServiceImpl(
    private val repository: ProductRepository,
) : ProductServiceApi {
    // Maps between internal domain model and public DTOs
}

internal data class Product(
    val id: ProductId,
    val name: String,
    val price: Money,
) {
    init {
        require(name.isNotBlank()) { &quot;Name required&quot; }
    }
}
</code></pre><h3 id="foreign-references">Foreign References</h3><p></p><p>There&apos;s a subtle trap when defining contracts. Consider an event that Shipping publishes when a package is delivered:</p><pre><code class="language-kotlin">// shipping-api
data class ShipmentDeliveredEvent(
    val shipmentId: ShipmentId,
    val orderId: OrderId,  // Where does this come from?
)
</code></pre><p><code>OrderId</code> lives in <code>orders-api</code>. So <code>shipping-api</code> depends on <code>orders-api</code>. Now if Orders wants to track shipment status and needs <code>ShipmentId</code>, you have a cycle between API modules. Gradle won&apos;t compile it.</p><p>The instinct is to extract both ID types to a common module. That works initially. Then Inventory needs <code>ProductId</code>. Then Notifications needs <code>CustomerId</code>. Soon your common module contains every ID type in the system, and you&apos;ve recreated coupling with extra steps.</p><p>The fix: each module only defines types it <em>owns</em>. For foreign references, you could use primitives. Or, if you want to prevent passing a shipment id into an order id field by accident, you can create a reference type like <code>OrderReference</code> that is defined locally in the shipping module.</p><pre><code class="language-kotlin">// shipping-api
@JvmInline value class OrderReference(val value: String)

data class ShipmentDeliveredEvent(
    val shipmentId: ShipmentId,
    val orderReference: OrderReference,
    val deliveredAt: Instant,
)
</code></pre><p>Type safety without coupling. The consuming code converts at the boundary:</p><pre><code class="language-kotlin">// orders-impl
@Component
internal class ShippingEventListener(
    private val orderService: OrderService,
) {
    fun on(event: ShipmentDeliveredEvent) {
        val orderId = OrderId(event.orderReference.value)
        orderService.markAsDelivered(orderId, event.deliveredAt)
    }
}
</code></pre><p>This pattern makes sense for Shipping and Orders because they&apos;re peers&#x2014;each might reference the other. But not every relationship is bidirectional. Invoicing is always <em>for</em> an order, but orders never reference invoices. The dependency only flows one way, so <code>invoicing-api</code> can depend on <code>orders-api</code> and use <code>OrderId</code> directly if you are more pragmatic about this.</p><h3 id="keeping-bounded-contexts-clean">Keeping Bounded Contexts Clean</h3><p></p><p>With primitives at the boundary, you won&apos;t hit Gradle cycles. But there&apos;s a subtler concern: conceptual pollution.</p><p>Products is a foundational module&#x2014;it defines what you can buy. Orders tracks purchases. Conceptually, Orders needs to know about Products (you order <em>something</em>), but Products shouldn&apos;t need to know about Orders. A product exists independently of whether anyone ordered it.</p><p>This isn&apos;t a technical constraint&#x2014;with primitives, you <em>could</em> make Products depend on Orders. But you shouldn&apos;t. Every dependency accumulates knowledge. When Products depends on Orders, the Products team needs to understand order concepts to work on their module.</p><p>Think of modules as layers. Foundational modules at the bottom know nothing about modules above them:</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2026/01/Gemini_Generated_Image_gr0y0fgr0y0fgr0y.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="2000" height="1103" srcset="https://wingedsheep.com/content/images/size/w600/2026/01/Gemini_Generated_Image_gr0y0fgr0y0fgr0y.png 600w, https://wingedsheep.com/content/images/size/w1000/2026/01/Gemini_Generated_Image_gr0y0fgr0y0fgr0y.png 1000w, https://wingedsheep.com/content/images/size/w1600/2026/01/Gemini_Generated_Image_gr0y0fgr0y0fgr0y.png 1600w, https://wingedsheep.com/content/images/size/w2400/2026/01/Gemini_Generated_Image_gr0y0fgr0y0fgr0y.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>When an arrow would point upward, pause and reconsider. Usually there&apos;s an event that could flow the other direction, or an SPI waiting to be extracted.</p><h3 id="service-provider-interfaces">Service Provider Interfaces</h3><p></p><p>Sometimes a foundational module needs input from higher-level modules without depending on them. Products wants to prevent deletion of a product with pending orders&#x2014;but shouldn&apos;t know about Orders.</p><p>The solution is a Service Provider Interface (SPI). Products defines an interface for the <em>question</em> it wants to ask. Other modules provide <em>answers</em> by implementing it.</p><pre><code class="language-kotlin">// products-api/spi/ProductDeletionBlocker.kt
interface ProductDeletionBlocker {
    fun canDelete(productId: String): Boolean
}
</code></pre><p>Orders implements it:</p><pre><code class="language-kotlin">// orders-impl
@Service
internal class OrderBasedDeletionBlocker(
    private val orderRepository: OrderRepository
) : ProductDeletionBlocker {
    override fun canDelete(productId: String): Boolean {
        return !orderRepository.existsPendingForProduct(ProductId(productId))
    }
}
</code></pre><p>Products consumes all implementations without knowing where they come from:</p><pre><code class="language-kotlin">// products-impl
@Service
internal class ProductServiceImpl(
    private val repository: ProductRepository,
    private val deletionBlockers: List&lt;ProductDeletionBlocker&gt;
) : ProductServiceApi {
    
    fun deleteProduct(id: ProductId): Result&lt;Unit, ProductError&gt; {
        if (deletionBlockers.any { !it.canDelete(id.value) }) {
            return Err(ProductError.DeletionBlocked)
        }
        repository.delete(id)
        return Ok(Unit)
    }
}
</code></pre><p>Spring collects all beans implementing <code>ProductDeletionBlocker</code> and injects them as a list. Products doesn&apos;t know who&apos;s blocking or why&#x2014;it just asks. The knowledge stays where it belongs.</p><h3 id="source-sets-count-too">Source Sets Count Too</h3><p></p><p>Gradle projects have <code>test</code> and <code>testFixtures</code> source sets, each with their own dependencies. Each can quietly violate your architecture.</p><p>The trap: you create <code>buildProduct()</code> in <code>products-impl:testFixtures</code>. Orders tests need products too, and there&apos;s a perfectly good builder right there. So <code>orders-impl:testFixtures</code> depends on <code>products-impl:testFixtures</code>. Now your Orders tests are coupled to Products&apos; internal implementation.</p><p>Test fixtures follow the same rules as main code. If <code>a-impl:main</code> can&apos;t depend on <code>b-impl:main</code>, then <code>a-impl:testFixtures</code> can&apos;t depend on <code>b-impl:testFixtures</code>. The duplication this creates is intentional&#x2014;each module&apos;s test fixtures stay self-contained.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2026/01/svgviewer-output.svg" alt="Building a Modular Monolith"><!--kg-card-end: html--><h3 id="automated-enforcement">Automated Enforcement</h3><p></p><p>Gradle modules prevent most violations&#x2014;you can&apos;t import what you can&apos;t depend on. But some rules need explicit checks, like ensuring no <code>-api</code> module depends on an <code>-impl</code> module, or that test fixtures respect boundaries.</p><p>Write a validation task that fails the build on violations, and run it as part of CI. Check the Gradle plugin from the example code: <a href="https://github.com/wingedsheep/eco-logique/blob/main/docs/development/gradle/module-validation.md?ref=wingedsheep.com">[link]</a></p><p>Architecture enforced by the build system survives deadlines, new team members, and &quot;temporary&quot; workarounds. Architecture enforced by documentation survives until the first Thursday afternoon crunch.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-49.png" style="max-width: 500px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><h3 id="alternative-spring-modulith">Alternative: Spring Modulith</h3><p></p><p>The Gradle multi-module approach provides the strongest guarantees, but Spring Modulith offers a lighter-weight alternative using package structure and test-time verification.</p><p>Spring Modulith treats each top-level package as a module. Classes directly in a module&apos;s package are its API; anything in subpackages is internal:</p><pre><code>com.example.app/
&#x251C;&#x2500;&#x2500; products/
&#x2502;   &#x251C;&#x2500;&#x2500; ProductService.kt        # API - accessible
&#x2502;   &#x2514;&#x2500;&#x2500; internal/                # Internal - hidden
&#x2502;       &#x2514;&#x2500;&#x2500; ProductRepository.kt
&#x2514;&#x2500;&#x2500; shipping/
    &#x2514;&#x2500;&#x2500; ...
</code></pre><p>A test verifies the structure:</p><pre><code class="language-kotlin">@Test
fun `verify module structure`() {
    ApplicationModules.of(Application::class.java).verify()
}
</code></pre><p>Spring Modulith also provides automatic documentation generation, <code>@ApplicationModuleTest</code> for isolated module testing, and an event publication registry that handles the transactional outbox pattern.</p><p>The tradeoff is enforcement timing. Gradle modules reject invalid imports at compile time. Spring Modulith catches them at test time. Stronger guarantees versus easier setup.</p><p>You can combine them&#x2014;use Gradle modules for hard boundaries, add Spring Modulith for its testing and documentation features. Start with your situation: greenfield with clear boundaries favors Gradle modules; existing monolith with unclear boundaries favors Spring Modulith to discover structure first.</p><p></p><hr><!--kg-card-begin: html--><div id="part-3"></div><!--kg-card-end: html--><h2 id="part-3-inside-the-modules">Part 3: Inside the Modules</h2><p></p><p>We have modules with enforced boundaries. The build system prevents coupling. The hard part is done.</p><p>What happens inside each <code>-impl</code> module matters less now. A mess in one module can&apos;t leak into others. You can refactor later without coordinating across teams. Internal structure is a local decision.</p><p>That said, one principle is worth following: dependencies point inward.</p><h3 id="the-three-layers">The Three Layers</h3><p></p><p>Organize code so that outer layers depend on inner layers, never the reverse.</p><p><strong>Domain</strong> is the core: business logic, entities, value objects, repository interfaces. No framework dependencies&#x2014;just plain Kotlin. The domain defines what the system <em>does</em>, not how it connects to the outside world.</p><p><strong>Application</strong> orchestrates: it implements the API contract, coordinates domain operations, handles transactions, publishes events. Application code uses domain types and repository interfaces but doesn&apos;t know about databases or HTTP.</p><p><strong>Infrastructure</strong> connects to the outside world: controllers, repository implementations, message consumers, external API clients. This is where Spring annotations live, where SQL gets written, where HTTP requests get parsed.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-60.png" style="max-width: 500px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><p>The dependency direction: <code>infrastructure &#x2192; application &#x2192; domain</code>. A request flows inward: the controller (infrastructure) calls a handler (application), which uses domain types and a repository interface. The repository implementation (infrastructure) knows how to persist those types&#x2014;but the domain doesn&apos;t know the implementation exists.</p><p>This keeps your business logic testable without frameworks and portable across different infrastructure choices. Need to swap Postgres for MongoDB? Only the repository implementation changes. The domain doesn&apos;t care.</p><h3 id="what-stays-internal">What Stays Internal</h3><p></p><p>The <code>-api</code> module contains only what other modules actually use. If no other module needs <code>ProductId</code>, it stays in <code>-impl</code>. Don&apos;t preemptively publish types &quot;just in case.&quot;</p><p>That said, value types, enums, and DTOs with simple init validation often do belong in <code>-api</code>. Other modules benefit from knowing they&apos;re working with a valid <code>ProductId</code>, not just a <code>String</code>.</p><pre><code class="language-kotlin">// products-api
data class ProductId(val value: String) {
    init {
        require(value.isNotBlank()) { &quot;ProductId cannot be blank&quot; }
    }
}

enum class ProductStatus { DRAFT, ACTIVE, DISCONTINUED }

data class ProductDto(
    val id: ProductId,
    val name: String,
    val status: ProductStatus,
    val priceInCents: Long,
)
</code></pre><p>What stays internal is behavior. Business rules, state transitions, aggregate invariants&#x2014;the logic that makes your domain more than a data container:</p><pre><code class="language-kotlin">// products-impl
internal data class Product(
    val id: ProductId,
    val name: String,
    val price: Money,
    val status: ProductStatus,
) {
    fun applyDiscount(percent: Int): Product = 
        copy(price = price.discountBy(percent))
    
    fun discontinue(): Product {
        check(status != ProductStatus.DISCONTINUED) { &quot;Already discontinued&quot; }
        return copy(status = ProductStatus.DISCONTINUED)
    }
}

internal fun Product.toDto() = ProductDto(
    id = id,
    name = name,
    status = status,
    priceInCents = price.toCents(),
)
</code></pre><p>The rule of thumb: if it&apos;s just data and validation, it can be public. If it&apos;s behavior, keep it internal.</p><h3 id="organizing-inside-the-module">Organizing Inside the Module</h3><p></p><p>This is less important than it seems. The module boundary protects you&#x2014;a mess inside one module can&apos;t leak into others. Refactor your internal structure whenever you want without coordinating with anyone.</p><p>That said, when a module grows multiple features, vertical slices work well. Each feature gets a subpackage with its domain, persistence, messaging, and REST concerns. Shared concepts stay in the module root.</p><pre><code>products-impl/
&#x2514;&#x2500;&#x2500; src/main/kotlin/com/example/products/
    &#x251C;&#x2500;&#x2500; Product.kt                    # Shared domain
    &#x251C;&#x2500;&#x2500; ProductRepository.kt          # Shared persistence
    &#x251C;&#x2500;&#x2500; ProductServiceFacade.kt       # API implementation
    &#x251C;&#x2500;&#x2500; import/
    &#x2502;   &#x251C;&#x2500;&#x2500; ImportHandler.kt
    &#x2502;   &#x251C;&#x2500;&#x2500; ImportJob.kt
    &#x2502;   &#x251C;&#x2500;&#x2500; persistence/
    &#x2502;   &#x251C;&#x2500;&#x2500; messaging/
    &#x2502;   &#x2514;&#x2500;&#x2500; rest/
    &#x2514;&#x2500;&#x2500; pricing/
        &#x251C;&#x2500;&#x2500; PricingHandler.kt
        &#x251C;&#x2500;&#x2500; PriceCalculator.kt
        &#x251C;&#x2500;&#x2500; persistence/
        &#x251C;&#x2500;&#x2500; messaging/
        &#x2514;&#x2500;&#x2500; rest/
</code></pre><p>When you need to understand pricing, you open one folder. But don&apos;t overthink this&#x2014;pick something reasonable and move on. You can always reorganize later.</p><h3 id="connecting-to-the-api-contract">Connecting to the API Contract</h3><p></p><p>Other modules depend on the <code>-api</code> interface. A facade delegates to handlers:</p><pre><code class="language-kotlin">@Service
internal class ProductServiceFacade(
    private val importHandler: ImportHandler,
    private val pricingHandler: PricingHandler,
) : ProductServiceApi {

    override fun importProducts(request: ImportRequest) = 
        importHandler.handle(request)
    
    override fun updatePrice(id: ProductId, request: UpdatePriceRequest) = 
        pricingHandler.handle(id, request)
}
</code></pre><p>Pure delegation, no logic. Other modules see one interface; internally, work is split by feature. Controllers inject handlers directly since they&apos;re in the same module.</p><h3 id="when-to-skip-all-this">When to Skip All This</h3><p></p><p>Hexagonal architecture and use-case slicing add value when you have complex domain logic that benefits from isolation, multiple entry points (REST, messaging, CLI) to the same operations, or a need to swap infrastructure components.</p><p>They add overhead when you&apos;re building straightforward CRUD, when the module is small and unlikely to grow, or when you&apos;re prototyping and don&apos;t know what the domain looks like yet.</p><p>Start simple. Add structure when the code tells you it needs it&#x2014;when you&apos;re afraid to touch a class because it does too many things, or when testing requires mocking half the framework. Structure is a response to pain, not a prerequisite.</p><p></p><hr><!--kg-card-begin: html--><div id="part-4"></div><!--kg-card-end: html--><h2 id="part-4-isolating-data">Part 4: Isolating Data</h2><p></p><p>You can have perfectly separated modules, clean APIs, and enforced dependencies&#x2014;and still end up with a tightly coupled system. The culprit? The database.</p><p>When modules share tables, they share problems. When one module writes directly to another&apos;s tables, your boundaries exist only in your imagination. When a foreign key reaches across module boundaries, you&apos;ve created a dependency that no Gradle configuration can catch.</p><h3 id="the-shared-database-trap">The Shared Database Trap</h3><p></p><p>It usually starts innocently. The Shipping module needs product weights. Products already has a <code>products</code> table. Why not just join?</p><pre><code class="language-sql">-- In shipping code
SELECT s.*, p.weight_grams
FROM shipments s
JOIN products p ON s.product_id = p.id
WHERE s.id = ?
</code></pre><p>This works. It&apos;s fast. It&apos;s &quot;just one query.&quot;</p><p>It&apos;s also invisible coupling. Now Shipping depends on the Products table structure. If Products renames <code>weight_grams</code>, Shipping breaks. If Products moves to a different database, Shipping breaks. And nobody sees this dependency in the code&#x2014;it lurks in SQL strings, waiting to cause an incident during an otherwise routine deployment.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-53.png" style="max-width: 500px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><h3 id="schema-per-module">Schema Per Module</h3><p></p><p>The fix is giving each module its own database schema. Products owns the <code>products</code> schema. Shipping owns the <code>shipping</code> schema. The module can only touch tables in its own schema.</p><pre><code class="language-sql">CREATE SCHEMA products;
CREATE SCHEMA shipping;

CREATE TABLE products.product (
    id VARCHAR(255) PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    weight_grams INT NOT NULL
);

CREATE TABLE shipping.shipment (
    id VARCHAR(255) PRIMARY KEY,
    product_id VARCHAR(255) NOT NULL,  -- Just data, no FK
    weight_grams INT NOT NULL           -- Copied at creation time
);
</code></pre><p>Each module gets its own Flyway configuration pointing at its schema. Migrations live with the module code. When there&apos;s a problem with the <code>shipments</code> table, there&apos;s no ambiguity about who owns it. You can check the example implementation <a href="https://github.com/wingedsheep/eco-logique/blob/main/deployables/backend/application/src/main/kotlin/com/wingedsheep/ecologique/application/config/FlywayConfig.kt?ref=wingedsheep.com">here</a>.</p><p>This isn&apos;t just convention&#x2014;configure your repositories to only access their schema, and cross-schema queries become impossible rather than discouraged.</p><h3 id="no-foreign-keys-across-schemas">No Foreign Keys Across Schemas</h3><p></p><p>This is the rule that makes people uncomfortable: no foreign keys between schemas.</p><pre><code class="language-sql">-- Don&apos;t do this
CREATE TABLE shipping.shipment (
    id VARCHAR(255) PRIMARY KEY,
    product_id VARCHAR(255) REFERENCES products.product(id)  -- No!
);

-- Do this instead
CREATE TABLE shipping.shipment (
    id VARCHAR(255) PRIMARY KEY,
    product_id VARCHAR(255) NOT NULL  -- Just a string
);
</code></pre><p>Referential integrity across module boundaries becomes your responsibility at the application level. When Shipping creates a shipment, it validates that the product exists by calling the Products API:</p><pre><code class="language-kotlin">override fun createShipment(request: CreateShipmentRequest): Result&lt;ShipmentDto, ShipmentError&gt; {
    val product = productService.getProduct(request.productId)
        .getOrElse { return Err(ShipmentError.ProductNotFound(request.productId)) }

    val shipment = Shipment(
        id = ShipmentId.generate(),
        productId = request.productId,
        weightGrams = product.weightGrams,
    )

    return Ok(shipmentRepository.save(shipment).toDto())
}
</code></pre><p>Yes, this is more work than a foreign key. But it&apos;s explicit&#x2014;visible in the code, testable, and under your control. And when you eventually need to extract a module into its own service, there are no cross-schema constraints to untangle.</p><h3 id="what-about-joins">What About Joins?</h3><p></p><p>The most common concern: &quot;I used to join Orders and Products in one query. Now what?&quot;</p><p>For single-item lookups, call both services and combine the results. For lists, batch your calls&#x2014;collect all product IDs first, fetch them in one bulk call, then join in memory:</p><pre><code class="language-kotlin">fun getOrderSummaries(orderIds: List&lt;OrderId&gt;): List&lt;OrderSummary&gt; {
    val orders = orderService.getOrders(orderIds)
    val productIds = orders.map { it.productId }.distinct()
    val products = productService.getProducts(productIds).associateBy { it.id }
    
    return orders.map { order -&gt;
        OrderSummary(order, products[order.productId])
    }
}
</code></pre><p>For historical accuracy, denormalize at write time. An order should show the product name and price <em>at the time of purchase</em>, not whatever the product is called today. Copy the relevant fields when creating the order. The data belongs to the order now&#x2014;it&apos;s capturing a moment in time.</p><p>For analytics and reporting, pragmatism wins. A read-only reporting schema with cross-module views is fine for dashboards&#x2014;just keep it separate from your application code.</p><h3 id="the-tradeoff">The Tradeoff</h3><p></p><p>Data isolation requires more code. You lose database-enforced referential integrity across modules. If a product is deleted while a shipment references it, the database won&apos;t stop you&#x2014;your application code has to handle that.</p><p>What you get is independence. Products can restructure its tables without Shipping noticing. Module tests can use a real database for their own schema while mocking other modules&apos; APIs. And if you ever extract a module into its own service, the path is clear&#x2014;no foreign keys to remove, no shared tables to split.</p><p></p><hr><!--kg-card-begin: html--><div id="part-5"></div><!--kg-card-end: html--><h2 id="part-5-module-communication">Part 5: Module Communication</h2><p></p><p>Modules need to talk to each other. An order needs product information. A shipment needs to know when payment completes. The question isn&apos;t whether modules communicate&#x2014;it&apos;s how they communicate without reintroducing the coupling we worked so hard to eliminate.</p><p>Two patterns cover most cases: synchronous calls when you need an answer now, and asynchronous events when you&apos;re announcing something happened.</p><h3 id="synchronous-calls">Synchronous Calls</h3><p></p><p>The simplest pattern: one module calls another&apos;s API and waits for the response.</p><pre><code class="language-kotlin">@Service
internal class ShipmentServiceImpl(
    private val productService: ProductServiceApi,
    private val shipmentRepository: ShipmentRepository,
) : ShipmentServiceApi {

    override fun createShipment(request: CreateShipmentRequest): Result&lt;ShipmentDto, ShipmentError&gt; {
        val product = productService.getProduct(request.productId)
            .getOrElse { return Err(ShipmentError.ProductNotFound(request.productId)) }

        val shipment = Shipment(
            id = ShipmentId.generate(),
            productId = request.productId,
            weightGrams = product.weightGrams,
            status = ShipmentStatus.PENDING,
        )

        return Ok(shipmentRepository.save(shipment).toDto())
    }
}
</code></pre><p>This is appropriate when you need data to proceed and the operation should fail if the dependency fails. The tradeoff is runtime coupling&#x2014;if Products is slow, Shipping is slow. For many operations, that&apos;s exactly right.</p><p>When the external module returns data shaped for their needs rather than yours, translate it at the boundary. Shipping doesn&apos;t need product descriptions or images&#x2014;it needs weight and dimensions. Create an adapter that fetches what you need and discards the rest:</p><pre><code class="language-kotlin">@Component
internal class ProductAdapter(
    private val productService: ProductServiceApi
) {
    fun getShippableItem(productId: ProductId): ShippableItem? {
        val dto = productService.getProduct(productId).getOrNull() ?: return null
        
        return ShippableItem(
            id = productId,
            weight = Weight.fromGrams(dto.weightGrams),
            dimensions = Dimensions(dto.width, dto.height, dto.depth),
            isFragile = dto.tags.contains(&quot;FRAGILE&quot;),
        )
    }
}
</code></pre><p>Now your domain code works with <code>ShippableItem</code>&#x2014;a type you control&#x2014;instead of <code>ProductDto</code> which might change when the Products team refactors.</p><h3 id="asynchronous-events">Asynchronous Events</h3><p></p><p>Sometimes a module doesn&apos;t need a response. It&apos;s announcing that something happened, and other modules react if they care.</p><pre><code class="language-kotlin">// payment-api
data class PaymentCompletedEvent(
    val paymentId: String,
    val orderReference: String,
    val amountInCents: Long,
    val currency: String,
    val timestamp: Instant,
)
</code></pre><p>The publisher doesn&apos;t know who&apos;s listening. Shipping might start fulfillment. Inventory might confirm a reservation. Notifications might send an email. Each listener is independent.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/12/image-55.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="1392" height="768" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-55.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/12/image-55.png 1000w, https://wingedsheep.com/content/images/2025/12/image-55.png 1392w" sizes="(min-width: 720px) 720px"></figure><p>For in-process events, Spring&apos;s <code>ApplicationEventPublisher</code> works fine:</p><pre><code class="language-kotlin">@Service
internal class PaymentServiceImpl(
    private val eventPublisher: ApplicationEventPublisher,
) : PaymentServiceApi {

    @Transactional
    override fun completePayment(paymentId: PaymentId): Result&lt;PaymentDto, PaymentError&gt; {
        val payment = // ... complete the payment
        
        eventPublisher.publishEvent(PaymentCompletedEvent(
            paymentId = payment.id.value,
            orderId = payment.orderId.value,
            amountInCents = payment.amount.toCents(),
            currency = payment.amount.currency.code,
            timestamp = Instant.now(),
        ))
        
        return Ok(payment.toDto())
    }
}
</code></pre><p>Listeners react in their own modules:</p><pre><code class="language-kotlin">// shipping-impl
@Component
internal class PaymentEventListener(
    private val shipmentService: ShipmentService,
) {
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    fun on(event: PaymentCompletedEvent) {
        val orderId = OrderId(event.orderId)
        shipmentService.startFulfillment(orderId)
    }
}
</code></pre><p>The <code>AFTER_COMMIT</code> phase ensures the listener only fires if the payment transaction actually commits. No point starting fulfillment for a payment that rolled back.</p><h3 id="the-dual-write-problem">The Dual-Write Problem</h3><p></p><p>There&apos;s a subtle issue with publishing events directly. Consider this sequence:</p><ol><li>Update database (payment marked complete)</li><li>Publish event (notify listeners)</li><li>Return success</li></ol><p>What if the database write succeeds but event publishing fails? The payment is complete, but nobody knows. Shipping never starts.</p><p>What if the event publishes but then the transaction rolls back? Listeners react to something that didn&apos;t actually happen.</p><p>This is the dual-write problem: updating two systems without a shared transaction.</p><p>The solution is making event publishing part of the database transaction, using a transactional outbox. Instead of publishing directly, write the event to an outbox table in the same transaction as your business data.</p><pre><code class="language-kotlin">@Transactional
override fun completePayment(paymentId: PaymentId): Result&lt;PaymentDto, PaymentError&gt; {
    val payment = // ... complete the payment
    
    outboxRepository.save(OutboxEvent(
        id = EventId.generate(),
        type = &quot;PaymentCompleted&quot;,
        payload = Json.encodeToString(PaymentCompletedEvent(...)),
        createdAt = Instant.now(),
    ))
    
    return Ok(payment.toDto())
}
</code></pre><p>A separate process polls the outbox and publishes to listeners. If the business transaction rolls back, the outbox entry rolls back too. If it commits, the event is guaranteed to be published eventually.</p><p>This guarantees at-least-once delivery. If the publisher crashes after sending but before marking the entry as processed, it republishes on restart. Listeners need to handle duplicates&#x2014;make them idempotent.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/12/image-56.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="1392" height="768" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-56.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/12/image-56.png 1000w, https://wingedsheep.com/content/images/2025/12/image-56.png 1392w" sizes="(min-width: 720px) 720px"></figure><p>Spring Modulith provides this out of the box with its event publication registry. Add <code>spring-modulith-starter-jpa</code> and events are automatically persisted and retried on failure. Worth considering before building your own.</p><h3 id="when-to-use-what">When to Use What</h3><p></p><p>Most module communication is synchronous calls&#x2014;simple and direct. Use them when you need data to proceed.</p><p>Events handle reactions and loose coupling. Use them when multiple modules might care about something happening, or when the caller shouldn&apos;t wait for downstream processing.</p><p>The outbox adds reliability when you can&apos;t afford to lose events. For in-process events where &quot;probably delivered&quot; is good enough, direct publishing is fine.</p><p>The patterns aren&apos;t mutually exclusive. A checkout flow might make synchronous calls to validate inventory, write the order and an outbox entry in one transaction, then have listeners react asynchronously to start fulfillment.</p><hr><!--kg-card-begin: html--><div id="part-6"></div><!--kg-card-end: html--><h2 id="part-6-errors-and-validation">Part 6: Errors and Validation</h2><p></p><p>Errors are where modular codebases quietly rot. One team throws exceptions, another returns nulls, a third invents custom result types. The controller layer becomes a graveyard of catch blocks trying to translate chaos into HTTP status codes.</p><h3 id="make-errors-explicit">Make Errors Explicit</h3><p></p><p>The traditional approach:</p><pre><code class="language-kotlin">fun getProduct(id: ProductId): Product {
    return repository.findById(id)
        ?: throw ProductNotFoundException(id)
}
</code></pre><p>Nothing in the type signature hints that this might throw. You discover <code>ProductNotFoundException</code> exists when it crashes in production&#x2014;or if you&apos;re lucky, by reading documentation that probably doesn&apos;t exist.</p><p>But &quot;product not found&quot; isn&apos;t exceptional. It&apos;s a normal business case&#x2014;the user typed a wrong ID, the product was deleted. This happens all the time, and the code should make it obvious.</p><p>Return errors as values instead. Define them in the <code>-api</code> module using sealed classes:</p><pre><code class="language-kotlin">// products-api
sealed class ProductError {
    data class NotFound(val id: ProductId) : ProductError()
    data class InvalidData(val reason: String) : ProductError()
    data object DuplicateName : ProductError()
}

interface ProductServiceApi {
    fun getProduct(id: ProductId): Result&lt;ProductDto, ProductError&gt;
    fun createProduct(request: CreateProductRequest): Result&lt;ProductDto, ProductError&gt;
}
</code></pre><p>Now the type signature tells you everything. And because <code>ProductError</code> is sealed, the compiler knows all possible cases. Add a new error type and every call site that doesn&apos;t handle it becomes a compile error.</p><pre><code class="language-kotlin">// products-impl
@Service
internal class ProductServiceImpl(
    private val repository: ProductRepository,
) : ProductServiceApi {

    override fun getProduct(id: ProductId): Result&lt;ProductDto, ProductError&gt; {
        val product = repository.findById(id)
            ?: return Err(ProductError.NotFound(id))
        return Ok(product.toDto())
    }
}
</code></pre><p>Callers handle both cases explicitly:</p><pre><code class="language-kotlin">productService.getProduct(productId).fold(
    onSuccess = { product -&gt; /* use it */ },
    onFailure = { error -&gt; /* handle it */ }
)
</code></pre><p>No try-catch. No wondering what might throw.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/12/image-57.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-57.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/12/image-57.png 1000w, https://wingedsheep.com/content/images/2025/12/image-57.png 1024w" sizes="(min-width: 720px) 720px"></figure><blockquote><strong>A note on Result types:</strong> Kotlin&apos;s built-in <code>Result</code> only supports <code>Throwable</code> as the error type&#x2014;it can&apos;t model domain errors. You need a proper either type with <code>Ok</code> and <code>Err</code> variants. The example project includes a simple implementation, or use kotlin-result or Arrow&apos;s Either. Pick one and use it everywhere.</blockquote><h3 id="validation-in-init-blocks">Validation in Init Blocks</h3><p></p><p>Where should validation live? The traditional answer in Spring is JSR-303 annotations&#x2014;<code>@NotBlank</code>, <code>@Positive</code>, <code>@Valid</code>. It works, but scatters validation rules across annotations that are easy to miss and harder to test than plain code.</p><p>A better approach: validate at construction time. If an object exists, it&apos;s valid. This follows the &quot;Parse, don&apos;t validate&quot; principle&#x2014;your init blocks act as a firewall, preventing garbage data from ever entering your implementation layer.</p><p>Kotlin gives you <code>require</code> for validating inputs and <code>check</code> for validating state. Both throw on failure, but they signal different problems. <code>require</code> throws <code>IllegalArgumentException</code>&#x2014;the caller passed bad input. <code>check</code> throws <code>IllegalStateException</code>&#x2014;something is wrong internally.</p><h4 id="structural-vs-business-validation">Structural vs. Business Validation</h4><p></p><p>Not all validation belongs in the same place:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Type</th>
<th>Definition</th>
<th>Location</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Structural</strong></td>
<td>Checks data against itself. No external context needed. (e.g., &quot;Quantity &gt; 0&quot;, &quot;Name not blank&quot;)</td>
<td>API Module (<code>init</code> block)</td>
</tr>
<tr>
<td><strong>Business</strong></td>
<td>Checks data against state or rules. Needs database or config. (e.g., &quot;Email is unique&quot;, &quot;Product in stock&quot;)</td>
<td>Implementation Module (Service)</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Structural validation in API modules works well: exceptions fire immediately during deserialization, the code documents requirements for consumers, and your domain logic doesn&apos;t need defensive null checks everywhere.</p><pre><code class="language-kotlin">// orders-api
data class CreateOrderRequest(
    val customerId: String,
    val items: List&lt;OrderItemDto&gt;,
) {
    init {
        require(customerId.isNotBlank()) { &quot;Customer ID is required&quot; }
        require(items.isNotEmpty()) { &quot;Order must contain at least one item&quot; }
    }
}

data class OrderItemDto(
    val productId: String,
    val quantity: Int
) {
    init {
        require(productId.isNotBlank()) { &quot;Product ID is required&quot; }
        require(quantity &gt; 0) { &quot;Quantity must be positive&quot; }
    }
}
</code></pre><p><strong>Avoid encoding volatile rules in the API.</strong> <code>require(password.isNotEmpty())</code> is fine; <code>require(password.length &gt;= 10)</code> couples your contract to a policy that might change. Check specific length requirements in the service layer.</p><p>For internal domain objects, use <code>check</code>:</p><pre><code class="language-kotlin">// products-impl
internal data class Product(
    val id: ProductId,
    val name: String,
    val price: Money,
) {
    init {
        check(name.isNotBlank()) { &quot;Product name cannot be blank&quot; }
        check(name.length &lt;= 200) { &quot;Product name too long&quot; }
    }
}
</code></pre><p>If these fail, it means your application code tried to create an invalid domain object&#x2014;a bug, not bad user input.</p><h3 id="translating-errors-to-http">Translating Errors to HTTP</h3><p></p><p>The domain layer doesn&apos;t know about HTTP. It returns <code>ProductError.NotFound</code>. Somewhere, that needs to become a 404.</p><p>That translation happens at the controller:</p><pre><code class="language-kotlin">@RestController
internal class ProductController(
    private val productService: ProductServiceApi,
) {
    @GetMapping(&quot;/products/{id}&quot;)
    fun getProduct(@PathVariable id: ProductId): ResponseEntity&lt;ProductDto&gt; {
        return productService.getProduct(id).fold(
            onSuccess = { ResponseEntity.ok(it) },
            onFailure = { throw it.toResponseStatusException() }
        )
    }
}

fun ProductError.toResponseStatusException() = when (this) {
    is ProductError.NotFound -&gt; ResponseStatusException(NOT_FOUND, &quot;Product not found: $id&quot;)
    is ProductError.InvalidData -&gt; ResponseStatusException(BAD_REQUEST, reason)
    is ProductError.DuplicateName -&gt; ResponseStatusException(CONFLICT, &quot;Product name already exists&quot;)
}
</code></pre><p>Spring Boot converts <code>ResponseStatusException</code> to RFC 7807 Problem Details automatically. The domain stays clean. The HTTP translation is explicit and in one place. When you add a new error type, the <code>when</code> expression forces you to decide what HTTP status it maps to.</p><p>A global exception handler deals with the init block validations:</p><pre><code class="language-kotlin">@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException::class)
    fun handleBadInput(ex: IllegalArgumentException): ProblemDetail {
        return ProblemDetail.forStatusAndDetail(
            HttpStatus.BAD_REQUEST,
            ex.message ?: &quot;Invalid request&quot;
        )
    }

    @ExceptionHandler(IllegalStateException::class)
    fun handleInternalError(ex: IllegalStateException): ProblemDetail {
        // Log it - this is a bug
        return ProblemDetail.forStatusAndDetail(
            HttpStatus.INTERNAL_SERVER_ERROR,
            &quot;Something went wrong&quot;
        )
    }
}
</code></pre><h3 id="when-exceptions-are-still-fine">When Exceptions Are Still Fine</h3><p></p><p>This doesn&apos;t mean exceptions are always wrong. Use them for genuinely exceptional situations: database connection lost, file system full, external service unreachable. These aren&apos;t business cases your callers should handle individually&#x2014;they&apos;re infrastructure failures that bubble up to a global handler.</p><p>The distinction: if the caller can reasonably do something about it, return a <code>Result</code>. If it&apos;s an unexpected failure that should abort the operation, throw</p><p></p><hr><!--kg-card-begin: html--><div id="part-7"></div><!--kg-card-end: html--><h2 id="part-7-testing">Part 7: Testing</h2><p></p><p>A modular architecture should make testing easier, not harder. If you need to spin up the entire application to test whether a discount calculation works, something has gone wrong.</p><p>The module boundaries we&apos;ve enforced create natural test boundaries. Each module has a clear API and explicit dependencies. This suggests a strategy: test one module completely, mock the others.</p><h3 id="module-tests">Module Tests</h3><p></p><p>The Shipping module depends on <code>ProductServiceApi</code>, not <code>ProductServiceImpl</code>. In tests, provide a mock and test Shipping in isolation&#x2014;real database, real transactions, real queries&#x2014;without Products existing at all.</p><p>Gherkin works well for expressing what a module should do:</p><pre><code class="language-gherkin">Feature: Shipment Creation

  Scenario: Create shipment for valid product
    Given a product &quot;PROD-123&quot; with weight 500 grams
    When I create a shipment for product &quot;PROD-123&quot; to &quot;123 Main St&quot;
    Then the shipment should be created with weight 500 grams
    And the shipment status should be &quot;PENDING&quot;

  Scenario: Fail when product does not exist
    Given no product &quot;UNKNOWN&quot; exists
    When I create a shipment for product &quot;UNKNOWN&quot; to &quot;123 Main St&quot;
    Then the shipment should fail with &quot;ProductNotFound&quot;
</code></pre><p>The step definitions mock external modules. &quot;Given a product exists&quot; doesn&apos;t create a real product&#x2014;it stubs the mock to return one:</p><pre><code class="language-kotlin">class ShipmentSteps(
    private val shippingService: ShippingServiceApi,
    private val productService: ProductServiceApi,  // Mocked
) {
    private var result: Result&lt;ShipmentDto, ShipmentError&gt;? = null

    @Given(&quot;a product {string} with weight {int} grams&quot;)
    fun givenProduct(productId: String, weight: Int) {
        whenever(productService.getProduct(ProductId(productId)))
            .thenReturn(Ok(buildProductDto(id = ProductId(productId), weightGrams = weight)))
    }

    @When(&quot;I create a shipment for product {string} to {string}&quot;)
    fun createShipment(productId: String, address: String) {
        result = shippingService.createShipment(
            CreateShipmentRequest(productId = ProductId(productId), address = address)
        )
    }

    @Then(&quot;the shipment should be created with weight {int} grams&quot;)
    fun verifyWeight(expectedWeight: Int) {
        assertThat(result?.value?.weightGrams).isEqualTo(expectedWeight)
    }
}
</code></pre><p>When a module test fails, you know which module broke. When it passes, you have confidence the module actually fulfills its contract against a real database. These are often your highest-value tests&#x2014;fast enough to run frequently, realistic enough to catch real bugs.</p><h3 id="unit-and-repository-tests">Unit and Repository Tests</h3><p></p><p>Module tests cover most scenarios, but some things deserve focused tests.</p><p>Complex logic that doesn&apos;t need a database&#x2014;calculations, state machines, validation rules&#x2014;these are faster to test in isolation:</p><pre><code class="language-kotlin">class MoneyTest {
    @Test
    fun `discount reduces amount correctly`() {
        val money = Money(BigDecimal(&quot;100&quot;), EUR)
        
        assertThat(money.discountBy(20).amount).isEqualByComparingTo(BigDecimal(&quot;80&quot;))
    }
}
</code></pre><p>Complex queries where the logic lives in SQL also deserve their own tests. Filters, pagination, edge cases with NULL values&#x2014;these are hard to get right and easy to break. Use Testcontainers to test against a real Postgres. Don&apos;t use H2 &quot;because it&apos;s faster&quot;&#x2014;it behaves differently in ways that will bite you.</p><pre><code class="language-kotlin">@DataJdbcTest
@Import(FlywayConfig::class)
class ProductRepositoryTest {

    companion object {
        @Container
        @ServiceConnection
        val postgres = PostgreSQLContainer(&quot;postgres:15&quot;)
    }
    
    @Autowired
    private lateinit var repository: ProductRepository
    
    @Test
    fun `finds products by category with price range`() {
        // Given
        repository.save(buildProduct(category = &quot;electronics&quot;, priceInCents = 5000))
        repository.save(buildProduct(category = &quot;electronics&quot;, priceInCents = 15000))
        repository.save(buildProduct(category = &quot;clothing&quot;, priceInCents = 3000))
        
        // When
        val results = repository.findByCategoryAndPriceRange(
            category = &quot;electronics&quot;, minPrice = 1000, maxPrice = 10000
        )
        
        // Then
        assertThat(results).hasSize(1)
        assertThat(results.first().priceInCents).isEqualTo(5000)
    }
}
</code></pre><p>If a method just does <code>findById</code> or delegates to a repository and maps the result, skip the dedicated test&#x2014;the module test already covers it.</p><h3 id="application-level-tests">Application-Level Tests</h3><p></p><p>Sometimes you need to verify the full flow&#x2014;all modules wired together, real database, real event publishing. Save these for critical user journeys where integration failures would be costly.</p><pre><code class="language-gherkin">Feature: Checkout

  Scenario: Complete purchase creates order and schedules shipment
    Given I am logged in as a customer
    And a product &quot;Widget&quot; priced at &#x20AC;29.99
    And the product is in stock
    When I place an order for 1 &quot;Widget&quot;
    Then an order should be created
    And a shipment should be scheduled with status &quot;PENDING&quot;
</code></pre><p>The step definitions wire this to real services&#x2014;no mocks. These tests are slow and brittle. When they fail, the cause isn&apos;t always obvious. Write few of them and let module tests handle the detailed behavior.</p><h3 id="test-fixtures">Test Fixtures</h3><p></p><p>Tests need data. You don&apos;t want every test constructing objects from scratch, but you also don&apos;t want shared fixtures that create invisible dependencies between tests.</p><p>Builder functions with default arguments hit the sweet spot:</p><pre><code class="language-kotlin">fun buildProductDto(
    id: ProductId = ProductId(UUID.randomUUID().toString()),
    name: String = &quot;Test Product&quot;,
    weightGrams: Int = 100,
) = ProductDto(id = id, name = name, weightGrams = weightGrams)

// Only specify what matters for this test
val lightweight = buildProductDto(weightGrams = 50)
</code></pre><p>When you read a test that says <code>buildProductDto(weightGrams = 500)</code>, you know the weight matters. Everything else is scaffolding.</p><p>Keep fixtures independent across modules. Shipping tests mock <code>ProductServiceApi</code> and use <code>buildProductDto()</code> from the <code>-api</code> test fixtures. They don&apos;t reach into Products&apos; internal test helpers. The same boundary rules apply to test code.</p><h3 id="test-behavior-not-implementation">Test Behavior, Not Implementation</h3><p></p><p>Ask &quot;what should happen&quot; rather than &quot;how does it happen internally.&quot;</p><pre><code class="language-kotlin">// Good - tests outcome
@Test
fun `order fails when product is out of stock`() {
    whenever(inventoryService.checkAvailability(productId, quantity = 5))
        .thenReturn(Available(inStock = 3))
    
    val result = orderService.createOrder(CreateOrderRequest(productId, quantity = 5))
    
    assertThat(result.error).isEqualTo(OrderError.InsufficientStock(available = 3))
}

// Brittle - tests mechanics
@Test
fun `createOrder calls inventory then repository then publisher`() {
    orderService.createOrder(request)
    
    inOrder(inventoryService, orderRepository, eventPublisher).apply {
        verify(inventoryService).checkAvailability(any(), any())
        verify(orderRepository).save(any())
        verify(eventPublisher).publishEvent(any())
    }
}
</code></pre><p>The first test survives refactoring. Reorder the internal calls, add caching, change how you publish events&#x2014;the test still passes because the behavior is the same. The second test breaks the moment you touch the implementation, even if nothing is actually wrong.</p><p>Don&apos;t chase coverage numbers. A codebase with 70% coverage and thoughtful tests beats one with 95% coverage and useless tests. Coverage tells you what code ran, not whether your tests would catch a bug.</p><p></p><hr><!--kg-card-begin: html--><div id="part-8"></div><!--kg-card-end: html--><h2 id="part-8-putting-it-all-together">Part 8: Putting It All Together</h2><p></p><p>We&apos;ve covered modules, boundaries, data isolation, communication, errors, and testing. How does it actually become a running application?</p><p>The good news: it&apos;s simpler than you might expect. One application module pulls in the implementations, Spring wires them together, and you deploy a single JAR.</p><h3 id="the-application-module">The Application Module</h3><p></p><p>The application module is the composition root&#x2014;the place where all the pieces come together. Its <code>build.gradle.kts</code> depends on all the <code>-impl</code> modules:</p><pre><code class="language-kotlin">// application/build.gradle.kts
dependencies {
    implementation(project(&quot;:products:products-impl&quot;))
    implementation(project(&quot;:orders:orders-impl&quot;))
    implementation(project(&quot;:shipping:shipping-impl&quot;))
    implementation(project(&quot;:inventory:inventory-impl&quot;))
    
    // Spring Boot, database drivers, etc.
    implementation(&quot;org.springframework.boot:spring-boot-starter-web&quot;)
    implementation(&quot;org.postgresql:postgresql&quot;)
}
</code></pre><p>This is the only place that depends on <code>-impl</code> modules. Everyone else depends on <code>-api</code> modules. The application module breaks that rule because its job is to assemble everything.</p><p>The application class itself is just a standard Spring Boot entry point:</p><pre><code class="language-kotlin">@SpringBootApplication(scanBasePackages = [&quot;com.example&quot;])
class Application

fun main(args: Array&lt;String&gt;) {
    runApplication&lt;Application&gt;(*args)
}
</code></pre><p>The <code>scanBasePackages</code> needs to cover your root namespace so Spring discovers components in all your <code>-impl</code> modules.</p><h3 id="how-spring-wires-it">How Spring Wires It</h3><p></p><p>A common question: if <code>ShippingServiceImpl</code> needs <code>ProductServiceApi</code>, and they&apos;re in different Gradle modules, how does Spring connect them?</p><p>Spring doesn&apos;t care about Gradle modules&#x2014;it cares about the classpath. When the application starts, all the <code>-impl</code> modules are on the classpath. Spring scans for components, finds <code>ProductServiceImpl</code> (which implements <code>ProductServiceApi</code>), and registers it as a bean. When it creates <code>ShippingServiceImpl</code>, it sees a constructor parameter of type <code>ProductServiceApi</code>, finds the matching bean, and injects it.</p><pre><code class="language-kotlin">// products-impl
@Service
internal class ProductServiceImpl(...) : ProductServiceApi

// shipping-impl
@Service
internal class ShippingServiceImpl(
    private val productService: ProductServiceApi  // Spring injects ProductServiceImpl
) : ShippingServiceApi
</code></pre><p>The interface is public (in <code>-api</code>). The implementation is internal (in <code>-impl</code>). Spring wires them together because at runtime, they&apos;re all in the same application context.</p><p>This is one of the key benefits of a modular monolith over microservices&#x2014;no service discovery, no HTTP clients, no serialization overhead. Just dependency injection.</p><h3 id="project-structure">Project Structure</h3><p></p><p>The overall structure follows naturally from what we&apos;ve covered:</p><pre><code>project-root/
&#x251C;&#x2500;&#x2500; build-logic/                    # Shared Gradle conventions
&#x2502;   &#x2514;&#x2500;&#x2500; src/main/kotlin/
&#x2502;       &#x2514;&#x2500;&#x2500; kotlin-conventions.gradle.kts
&#x251C;&#x2500;&#x2500; common/
&#x2502;   &#x251C;&#x2500;&#x2500; common-types/               # Shared value types
&#x2502;   &#x2514;&#x2500;&#x2500; common-result/              # Result type
&#x251C;&#x2500;&#x2500; products/
&#x2502;   &#x251C;&#x2500;&#x2500; products-api/
&#x2502;   &#x2514;&#x2500;&#x2500; products-impl/
&#x251C;&#x2500;&#x2500; orders/
&#x2502;   &#x251C;&#x2500;&#x2500; orders-api/
&#x2502;   &#x2514;&#x2500;&#x2500; orders-impl/
&#x251C;&#x2500;&#x2500; shipping/
&#x2502;   &#x251C;&#x2500;&#x2500; shipping-api/
&#x2502;   &#x2514;&#x2500;&#x2500; shipping-impl/
&#x251C;&#x2500;&#x2500; application/                    # Composition root
&#x2514;&#x2500;&#x2500; settings.gradle.kts
</code></pre><p>The <code>build-logic</code> module contains convention plugins that centralize shared Gradle configuration. Instead of repeating Kotlin version, test configuration, and dependencies in every <code>build.gradle.kts</code>, modules apply a plugin like <code>id(&quot;kotlin-conventions&quot;)</code>. Change the convention once, every module picks it up.</p><p>Use <code>gradle/libs.versions.toml</code> to manage dependency versions in one place:</p><pre><code class="language-toml">[versions]
kotlin = &quot;2.0.21&quot;
spring-boot = &quot;3.4.1&quot;
testcontainers = &quot;1.20.4&quot;

[libraries]
spring-boot-starter-web = { module = &quot;org.springframework.boot:spring-boot-starter-web&quot;, version.ref = &quot;spring-boot&quot; }
spring-boot-starter-data-jdbc = { module = &quot;org.springframework.boot:spring-boot-starter-data-jdbc&quot;, version.ref = &quot;spring-boot&quot; }
testcontainers-postgres = { module = &quot;org.testcontainers:postgresql&quot;, version.ref = &quot;testcontainers&quot; }

[plugins]
kotlin-jvm = { id = &quot;org.jetbrains.kotlin.jvm&quot;, version.ref = &quot;kotlin&quot; }
spring-boot = { id = &quot;org.springframework.boot&quot;, version.ref = &quot;spring-boot&quot; }
</code></pre><p>Then in any module:</p><pre><code class="language-kotlin">dependencies {
    implementation(libs.spring.boot.starter.web)
    testImplementation(libs.testcontainers.postgres)
}
</code></pre><p>No more version strings scattered across dozens of <code>build.gradle.kts</code> files. Update a version once in the TOML, and every module picks it up.</p><h3 id="running-it">Running It</h3><p></p><p>The Spring Boot plugin packages everything into a single executable JAR. Run <code>./gradlew :application:bootJar</code> and you get one artifact containing all modules, all dependencies, and an embedded server. Deploy it anywhere that runs Java.</p><p>For local development, you typically need a database. A simple Docker Compose handles that:</p><pre><code class="language-yaml">services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
    ports:
      - &quot;5432:5432&quot;
</code></pre><p>Start the container, run <code>./gradlew :application:bootRun</code>, and you&apos;re developing.</p><h3 id="when-you-outgrow-it">When You Outgrow It</h3><p></p><p>The architecture is designed to be &quot;split-ready,&quot; even if you never split.</p><p>If a module eventually needs to become a separate service, the path is clear. The database is already isolated&#x2014;each module has its own schema, so you export it to a new database without untangling shared tables. The API is already defined&#x2014;the <code>-api</code> module becomes the contract for the new service, and you replace the in-process implementation with an HTTP client. Communication is already explicit&#x2014;you swap dependency injection for network calls. Tests are already structured&#x2014;module tests that mocked <code>ProductServiceApi</code> now mock the HTTP client instead.</p><p>You&apos;re not refactoring a tangled mess. You&apos;re promoting a module that&apos;s already isolated.</p><p>Most teams never need to do this. The modular monolith scales further than people expect&#x2014;both technically and organizationally. Multiple teams can work on different modules without stepping on each other, and the single deployment model remains manageable well into hundreds of thousands of lines of code.</p><p>But knowing the escape hatch exists makes the choice less risky. You&apos;re not betting everything on a monolith forever. You&apos;re choosing the simplest architecture that works today while keeping your options open.</p><!--kg-card-begin: html--><img src="https://wingedsheep.com/content/images/2025/12/image-59.png" style="max-width: 500px; margin-left: 0;" alt="Building a Modular Monolith"><!--kg-card-end: html--><p></p><hr><!--kg-card-begin: html--><div id="conclusion"></div><!--kg-card-end: html--><h2 id="conclusion">Conclusion</h2><p></p><p>A modular monolith isn&apos;t a compromise or a stepping stone to microservices. For most teams, it&apos;s the destination.</p><p>You get boundaries that hold&#x2014;not because everyone remembered the guidelines, but because the compiler enforces them. You get changes that stay local, because modules can&apos;t reach into each other&apos;s internals. You get deployment that stays simple, because it&apos;s still one JAR, one process, one thing to monitor at 3am when something goes wrong.</p><p>Not everything in this guide carries equal weight. Some things are load-bearing: enforcement through Gradle modules, the API/implementation split, data isolation. Skip these, and the &quot;modular&quot; part of your monolith will erode within months. Other things&#x2014;how you organize packages inside a module, whether you use Cucumber, what you name your handlers&#x2014;are local decisions. Get them wrong and you have a mess, but it&apos;s a contained mess. The module boundary limits the blast radius.</p><p>That&apos;s the real payoff. In a traditional monolith, every shortcut becomes everyone&apos;s problem. In a modular monolith, a messy module is just a messy module. Clean it up later, on your own schedule, without coordinating across teams.</p><p>Build the boundaries. Enforce them. Ship the JAR.</p><hr><p>Finally, a cheat sheet as quick reference:</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://wingedsheep.com/content/images/2025/12/image-64.png" class="kg-image" alt="Building a Modular Monolith" loading="lazy" width="2000" height="808" srcset="https://wingedsheep.com/content/images/size/w600/2025/12/image-64.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/12/image-64.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/12/image-64.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/12/image-64.png 2400w"></figure>]]></content:encoded></item><item><title><![CDATA[Mana from the Machine: An AI-Powered MTG Set Generator]]></title><description><![CDATA[Building an AI system that generates complete, custom Magic: The Gathering sets, covering theme creation, card mechanics, AI-generated artwork, rendering, and creating playable output for virtual tabletops.]]></description><link>https://wingedsheep.com/mana-from-the-machine/</link><guid isPermaLink="false">6802174def353f005f17ddf9</guid><category><![CDATA[board games]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Fri, 18 Apr 2025 10:43:06 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2025/04/image-10.png" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2025/04/image-10.png" alt="Mana from the Machine: An AI-Powered MTG Set Generator"><p></p><p>Straight to the code: <a href="https://github.com/wingedsheep/mtg-card-generator?ref=wingedsheep.com">https://github.com/wingedsheep/mtg-card-generator</a></p><p>View a <a href="https://wingedsheep.com/mana-from-the-machine/#:~:text=Showcasing%20a%20full%20generated%20set">generated set</a>.</p><p>It had been a while since I&apos;d really engaged with Magic: The Gathering, but a recent booster draft with friends completely rekindled my interest. The strategic depth, the artwork, the world-building &#x2013; it all came flooding back. This got me thinking about the creative process behind the game.</p><p>On a subsequent free day, curiosity led me down an internet rabbit hole: could you render custom Magic cards in a browser? A quick search turned up a promising open-source project (<a href="https://www.mtgrender.tk/?ref=wingedsheep.com">mtgrender.tk</a>), and that sparked an idea. What if I could use AI to generate not just <em>one</em> card, but an entire, cohesive set?</p><p>The initial concept came together surprisingly quickly &#x2013; I managed to get a basic version running in about a day. However, refining the process, improving the AI prompts, handling edge cases, and fixing subtle rendering bugs took significantly more time and effort. The goal became clear: build a system to generate <em>complete</em>, playable MTG sets, from the initial theme right down to rendered card images ready for a virtual tabletop.</p><p>I wasn&apos;t just aiming for random card names and abilities. I wanted sets with:</p><ul><li><strong>A Cohesive Theme:</strong> A distinct world, factions, and mechanical identity.</li><li><strong>Balanced Distribution:</strong> Reasonable counts of different rarities (Common, Uncommon, Rare, Mythic Rare) and colors (White, Blue, Black, Red, Green).</li><li><strong>Unique Artwork:</strong> Fitting illustrations for every card, generated on the fly.</li><li><strong>Realistic Rendering:</strong> Output that looks like actual MTG cards.</li><li><strong>Playability:</strong> A way to actually use the generated cards, ideally in a simulator, or ready to print.</li></ul><p>This presented several interesting challenges, touching on Large Language Models (LLMs), text-to-image generation, web rendering, and automation.</p><h3 id="challenge-1-rendering-the-cards">Challenge 1: Rendering the Cards</h3><p>Before generating anything, I needed a way to visualize the final product. How could I turn structured card data (name, cost, text, etc.) into something that <em>looks</em> like a Magic card?</p><p>My online search led me to the fantastic open-source project <a href="https://www.mtgrender.tk/?ref=wingedsheep.com">mtgrender.tk</a> by Yoann &apos;Senryoku&apos; Maret-Verdant (<a href="https://senryoku.github.io/?ref=wingedsheep.com">Senryoku on GitHub</a>). Senryoku is also involved in other cool MTG projects like <a href="https://draftmancer.com/?ref=wingedsheep.com">Draftmancer</a>, so definitely check out their work! Mtgrender takes card data in the Scryfall JSON format and renders beautiful card images directly in the browser using Vue.</p><p>This was almost perfect, but the original project was a full Vue application. For my generator, I wanted something simpler &#x2013; a self-contained HTML and JavaScript renderer that I could easily automate. This felt like a job for an AI assistant! I fed the core rendering logic from mtgrender to Google Gemini 2 and asked it to refactor it into plain HTML and JavaScript.</p><p>The result wasn&apos;t instantly flawless &#x2013; there were bugs to fix and adjustments needed &#x2013; but it provided a massive head start. It successfully stripped away the Vue framework complexities, leaving a core HTML page (<code>index.html</code>), some CSS (<code>style.css</code>), and JavaScript (<code>script.js</code>, <code>helpers.js</code>) that could take a Scryfall-like JSON input and render a card.</p><p>With a rendering solution in hand, I could move on to generating the actual content.</p><pre><code>card-rendering/
&#x251C;&#x2500;&#x2500;&#x2500;example-input.json  # Example Scryfall-like JSON
&#x251C;&#x2500;&#x2500;&#x2500;helpers.js          # Helper functions for rendering
&#x251C;&#x2500;&#x2500;&#x2500;index.html          # The main HTML structure
&#x251C;&#x2500;&#x2500;&#x2500;script.js           # Core rendering logic
&#x2514;&#x2500;&#x2500;&#x2500;style.css           # Card styling
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/04/image.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="1462" height="1984" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image.png 1000w, https://wingedsheep.com/content/images/2025/04/image.png 1462w" sizes="(min-width: 720px) 720px"><figcaption>A MTG card in the scryfall JSON format, rendered in the renderer</figcaption></figure><h3 id="challenge-2-crafting-the-world-%E2%80%93-theme-generation">Challenge 2: Crafting the World &#x2013; Theme Generation</h3><p>A good MTG set isn&apos;t just a random collection of cards; it has a story, a world, unique mechanics, and factions. How could I generate this cohesive vision automatically?</p><p>I turned to LLMs via the <a href="https://openrouter.ai/?ref=wingedsheep.com">OpenRouter</a> API. The idea was to provide the LLM with some <em>inspiration</em> and ask it to build a theme around it.</p><ol><li><strong>Inspiration:</strong> I started with a CSV file containing data for many existing MTG cards. My script randomly selects a small number of these (<code>inspiration_cards_count</code> in the config, e.g., 50 cards) to serve as examples of what MTG cards look like and the kind of concepts they embody.</li><li><strong>Prompting:</strong> I fed the names and types of these inspiration cards to the LLM (configured as <code>main_model</code> in my <code>Config</code> class, often something powerful like Gemini 2.5 pro) and asked it to generate a detailed set theme. This included a world description, key factions, prominent creature types, mechanical themes, potential synergies, and supported play styles.</li></ol><pre><code class="language-python"># Simplified concept from MTGSetGenerator
def generate_theme(self, inspiration_cards: List[str]) -&gt; str:
    prompt = f&quot;&quot;&quot;
    Based on the following randomly selected Magic: The Gathering card names and types, 
    generate a detailed and cohesive theme for a new MTG set. 
    
    Inspiration Cards:
    {inspiration_cards}

    Describe the world, key factions, prominent creature types, 
    mechanical themes, potential synergies, and supported play styles.
    Make it creative and evocative.
    &quot;&quot;&quot;
    # ... (Call to OpenRouter API using self.config.openai_client) ...
    theme_description = # ... response from LLM ...
    return theme_description
</code></pre><p>This approach provided a solid thematic foundation. I also added a feature (<code>complete_theme_override</code> in the config) to allow users to bypass this step and provide their own pre-written theme if they had a specific vision.</p><h3 id="challenge-3-populating-the-world-%E2%80%93-card-generation-balancing">Challenge 3: Populating the World &#x2013; Card Generation &amp; Balancing</h3><p>With a theme established, the next step was creating the actual cards. This involved several sub-challenges:</p><ul><li>Generating card concepts (name, mana cost, type, text, flavor) that fit the theme.</li><li>Ensuring a reasonable distribution of rarities within each batch of generated cards.</li><li>Maintaining an overall color balance across the entire set.</li></ul><p>Again, I used the OpenRouter API (<code>main_model</code>). The process worked in batches (<code>batches_count</code> in the config):</p><ol><li><strong>Batch Definition:</strong> For each batch, I specified how many cards of each rarity I wanted (e.g., 1 Mythic, 3 Rares, 4 Uncommons, 5 Commons, defined in the config).</li><li><strong>Contextual Prompting:</strong> The LLM received the set theme, the desired rarity distribution for the <em>current batch</em>, and statistics about the cards generated <em>so far</em> (especially the current color distribution).</li><li><strong>Balancing Hints:</strong> If the set was becoming too heavy in one color (e.g., too many Blue cards compared to the target <code>color_distribution</code>), the prompt would subtly nudge the LLM: &quot;The set currently needs more Green and White cards. Please try to include some in this batch.&quot;</li><li><strong>Output:</strong> The LLM generated the card concepts for the batch.</li></ol><pre><code class="language-python"># Simplified concept from MTGSetGenerator
def generate_batch_cards(self, batch_num: int, current_stats: Dict) -&gt; List[Card]:
    # ... (Determine target rarities for this batch) ...
    # ... (Calculate color balance hints based on current_stats and config.color_distribution) ...
    
    prompt = f&quot;&quot;&quot;
    Set Theme: {self.set_theme}
    
    Generate {total_cards_in_batch} new Magic: The Gathering card concepts for this set.
    Ensure they fit the theme.
    
    Desired Rarity Distribution for this Batch:
    - Mythics: {self.config.mythics_per_batch}
    - Rares: {self.config.rares_per_batch}
    # ... etc ...

    Current Set Color Balance: {current_stats[&apos;color_distribution&apos;]}
    Target Color Balance: {self.config.color_distribution}
    {color_balance_hint} # e.g., &quot;Hint: Consider creating more Green cards.&quot;

    Provide concepts including name, mana cost, type, rarity, card text, and flavor text.
    For creatures, include power/toughness. For planeswalkers, include loyalty.
    &quot;&quot;&quot;
    # ... (Call LLM, parse response into Card objects) ...
    generated_cards = # ... parsed Card objects ...
    return generated_cards

# Statistics are tracked across batches
def _calculate_statistics(self, cards: List[Card]) -&gt; Dict:
    rarity_counts = Counter(card.rarity for card in cards)
    color_counts = Counter()
    # ... (count colors) ...
    return { &quot;card_count&quot;: len(cards), &quot;rarity_distribution&quot;: ..., &quot;color_distribution&quot;: ... }
</code></pre><p>This iterative, batch-based approach with feedback allowed the set to grow organically while maintaining better control over the final composition.</p><h3 id="challenge-4-bringing-cards-to-life-%E2%80%93-art-generation">Challenge 4: Bringing Cards to Life &#x2013; Art Generation</h3><p>A Magic card isn&apos;t complete without its art. This was a two-step process: generating a suitable <em>art prompt</em> and then feeding that prompt to a text-to-image model.</p><p><strong>Step 4a: Generating Art Prompts</strong></p><p>Simply using the card name or text as an image prompt often yields generic results. I needed detailed prompts that captured the essence of the card <em>and</em> fit the MTG art style.</p><ul><li><strong>Input:</strong> The LLM (<code>main_model</code>) received the full card details (name, type, text, flavor, color, Power/Toughness, theme context) and the set theme.</li><li><strong>Prompt Engineering:</strong> The prompt specifically asked for an &quot;Oil on canvas painting. Magic the gathering art. Rough brushstrokes.&quot; style and instructed the LLM to consider composition, lighting, mood, and key details from the card&apos;s mechanics and flavor.</li><li><strong>Special Cases:</strong> I added specific instructions for &quot;Saga&quot; cards, which require vertical artwork, asking the LLM to create a prompt describing a <em>vertical</em> composition.</li><li><strong>Safety:</strong> To avoid issues with image generation filters, I added lines emphasizing the need for a &quot;SAFE&quot; prompt on retry attempts if generation failed.</li></ul><pre><code class="language-python"># From MTGArtGenerator.py
def generate_art_prompt(self, card: Card, attempt: int = 0) -&gt; str:
    theme_context = f&quot;Set Theme Context:\n{self.theme}\n...&quot; if self.theme else &quot;&quot;
    saga_instructions = &quot;IMPORTANT: This is a Saga card which requires VERTICAL art...&quot; if &quot;Saga&quot; in card.type else &quot;&quot;

    prompt = f&quot;&quot;&quot;
    Create a detailed art prompt for a Magic: The Gathering card...
    {saga_instructions}
    Theme: {theme_context}
    Card Name: {card.name}
    Type: {card.type}
    # ... (include all card details) ...
    
    Make sure that the prompt fits the style of Magic: The Gathering art...
    The prompt should begin with &quot;Oil on canvas painting. Magic the gathering art. Rough brushstrokes.&quot;
    {f&quot;Please make sure it is a really SAFE prompt! ...&quot; if attempt &gt; 1 else &quot;&quot;} 
    Return only the prompt text...
    &quot;&quot;&quot;
    # ... (Call LLM via self.client.chat.completions.create) ...
    art_prompt = # ... response from LLM ...
    return art_prompt
</code></pre><p><strong>Step 4b: Generating Images</strong></p><p>With detailed art prompts, I used the <a href="https://replicate.com/?ref=wingedsheep.com">Replicate</a> platform to access text-to-image models.</p><ul><li><strong>Model Choice:</strong> I configured the system to use different models, primarily testing Google&apos;s <code>imagen-3</code> and Black Forest Labs&apos; <code>flux-1.1-pro</code> (<code>image_model</code> and <code>replicate_models</code> in <code>Config</code>). Imagen 3 generally produced excellent results aligning with the MTG aesthetic.</li><li><strong>API Call:</strong> The generated art prompt was sent to the chosen Replicate model endpoint.</li><li><strong>Aspect Ratio &amp; Cropping:</strong> MTG cards typically use a 5:4 aspect ratio for art, while Sagas use 4:5 (vertical). I configured the image generation call (<code>_get_model_params</code>) to request the appropriate ratio. If the model couldn&apos;t produce the exact ratio (some models prefer square), I added a cropping step using Python&apos;s PIL (Pillow) library (<code>crop_to_5x4_ratio</code>, <code>crop_to_4x5_ratio</code>) to center-crop the image to the target dimensions.</li><li><strong>Retry Logic:</strong> Image generation can sometimes fail. For example if the generated image doesn&apos;t pass the NSFW filters. The <code>generate_card_art</code> function included retry logic with increasing safety instructions in the art prompt generation step.</li></ul><p>An example result from the art generator for the <code>Mirror Shell Wyvern</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/04/Mirror-Shell_Wyvern.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="1120" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/Mirror-Shell_Wyvern.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/Mirror-Shell_Wyvern.png 1000w, https://wingedsheep.com/content/images/2025/04/Mirror-Shell_Wyvern.png 1120w" sizes="(min-width: 720px) 720px"><figcaption>Oil on canvas painting. Magic the Gathering art. Rough brushstrokes. A colossal wyvern glides silently above a twilight-shrouded skyline of the mirrored cityscape of Veritas. Its translucent wings ripple like warped glass, each beat distorting the sky behind it with stars and reflections sliding across its skin like oil on water. The dragon&apos;s form is incomplete and ghostlike; hollow sections of its body reveal fragments of the real world behind it, subtly out of sync with the rest of the scene, as if time itself is uncertain around it. Its eyes are crystalline mirrors, refracting images of both watcher and watched.Below, rooftops and towers curve inward, their surfaces covered with surveillance runes and illusion glyphs. As the wyvern passes overhead, these symbols flicker and sputter as though truth peeks through the cracks. A citizen on a balcony gazes up in awe, their face reflected threefold in the wyvern&apos;s belly scales, each reflection conveying a different expression: fear, realization, and acceptance. The lighting is eerie and soft, dominated by moonlight diffused by magical haze. Soft blue-violet hues dominate the composition, with iridescent highlights tracing the dragon&apos;s outline. The mood is contemplative, mysterious, and slightly foreboding, echoing the idea that witnessing the wyvern brings fleeting clarity: a glimpse of hidden truth before it vanishes like a dream. Art style blends classical fantastical realism with subtle surreal expressions, evoking a sense of fragmented memory and veiled perception. Painterly textures enhance the shifting effect of the dragon&apos;s form, using impasto for the shimmering illusion-wings and glazing for background reflections. Intentional blurring at the edges of the wyvern suggests temporality unraveling. Oil on canvas artwork.</figcaption></figure><h3 id="challenge-5-the-conversion-pipeline-%E2%80%93-json-and-automated-rendering">Challenge 5: The Conversion Pipeline &#x2013; JSON and Automated Rendering</h3><p>Now I had card concepts (text) and card art (images), but the renderer needed Scryfall-like JSON.</p><ul><li><strong>JSON Conversion:</strong> I used <em>another</em> LLM call (<code>json_model</code> in <code>Config</code>, often something fast and good at formatting like Gemini Flash) specifically for this conversion task. It took the generated card text, the art prompt, and the path to the saved artwork image, and structured it into the required JSON format. This was handled by the <code>MTGJSONConverter</code> class.</li><li><strong>Automated Rendering:</strong> Manually rendering hundreds of cards via the HTML/JS app was impractical. I used <a href="https://playwright.dev/python/?ref=wingedsheep.com">Playwright</a>, a browser automation library, to solve this. The <code>MTGCardRenderer</code> class scripted the following:</li></ul><ol><li>Launch a headless browser.</li><li>Open the local <code>index.html</code> rendering page.</li><li>Inject the generated Scryfall JSON data for a card into the page&apos;s JavaScript.</li><li>Wait for the card to render.</li><li>Take a screenshot of the rendered card element.</li><li>Save the screenshot as a PNG file.</li><li>Repeat for all generated JSON files.</li></ol><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/04/image-3.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="1536" height="600" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image-3.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image-3.png 1000w, https://wingedsheep.com/content/images/2025/04/image-3.png 1536w" sizes="(min-width: 720px) 720px"></figure><h3 id="challenge-6-dont-forget-the-lands">Challenge 6: Don&apos;t Forget the Lands!</h3><p>Basic lands (Plains, Island, Swamp, Mountain, Forest) are crucial. I added a dedicated step using <code>MTGLandGenerator</code>:</p><ul><li>It generates a specified number (<code>land_variations_per_type</code>) of variations for each basic land type.</li><li>It uses the set theme to generate appropriate art prompts for these lands.</li><li>It follows the same art generation, JSON conversion, and rendering pipeline as regular cards.</li><li>It correctly assigns collector numbers sequentially after the main set cards</li></ul><h3 id="cost-and-speed-considerations">Cost and Speed Considerations</h3><p>Automating set generation with AI is powerful, but involves API costs and processing time. Here&apos;s a rough breakdown based on the default configuration (13 cards/batch, 20 batches/set) and approximate API pricing at the time of writing.<br><br>So in total you will have a set with 260 unique cards. MTG sets usually range between 250 and 300 cards.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: left">Metric</th>
<th style="text-align: left">Value</th>
<th style="text-align: left">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">Image Gen Cost/Card</td>
<td style="text-align: left">~$0.05 USD</td>
<td style="text-align: left">Using Imagen 3 via Replicate</td>
</tr>
<tr>
<td style="text-align: left">Text Gen Cost/Batch</td>
<td style="text-align: left">~$0.01 USD</td>
<td style="text-align: left">Theme, concepts, prompts, JSON conversion</td>
</tr>
<tr>
<td style="text-align: left"><strong>Total Cost/Batch</strong></td>
<td style="text-align: left"><strong>~$0.66 USD</strong></td>
<td style="text-align: left">(13 images * $0.05) + $0.01 text</td>
</tr>
<tr>
<td style="text-align: left"><strong>Total Set Cost</strong></td>
<td style="text-align: left"><strong>~$13-14 USD</strong></td>
<td style="text-align: left">20 batches + basic lands</td>
</tr>
<tr>
<td style="text-align: left"><strong>Time/Batch</strong></td>
<td style="text-align: left"><strong>~5 minutes</strong></td>
<td style="text-align: left">Includes text, image gen, conversion</td>
</tr>
<tr>
<td style="text-align: left"><strong>Total Set Time</strong></td>
<td style="text-align: left"><strong>~100 minutes (~1h 40m)</strong></td>
<td style="text-align: left">20 batches</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h3 id="challenge-7-ready-for-play-%E2%80%93-tabletop-simulator-conversion">Challenge 7: Ready for Play &#x2013; Tabletop Simulator Conversion</h3><p><br>Having nice PNG images is great, but I wanted to <em>play</em> with the cards in a draft format. Tabletop Simulator (TTS) is a popular platform for virtual board gaming, and I wanted to create proper booster packs for drafting.</p><p>I developed a Booster Draft Generator (<code>mtg-booster-generator.py</code>) that creates randomized booster packs:<br><br>Running the script opens a GUI where you can select an output folder for one of your generated sets.</p><p><strong>Input:</strong> The folder containing all rendered card images from my generated set</p><p><strong>Process:</strong></p><ol><li>Creates 15-card boosters with the correct rarity distribution:</li></ol><ul><li>1 rare or mythic rare card</li><li>3 uncommon cards</li><li>11 common cards</li></ul><ol><li>Generates special boosters for each basic land type including all art variants</li><li>Arranges each booster pack into proper grid sheets for TTS import</li></ol><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/04/image-6.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="1244" height="938" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image-6.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image-6.png 1000w, https://wingedsheep.com/content/images/2025/04/image-6.png 1244w" sizes="(min-width: 720px) 720px"></figure><p><strong>Output:</strong> A <code>boosters</code> folder containing:</p><ul><li>Properly formatted deck sheets ready for TTS import</li><li>Each sheet containing multiple boosters arranged in a grid</li></ul><p>To use these boosters in Tabletop Simulator:</p><ol><li>Open Tabletop Simulator and create a new game</li><li>Click &quot;Objects&quot; &gt; &quot;Components&quot; &gt; &quot;Cards&quot; &gt; &quot;Custom Deck&quot;</li><li>Select the first booster sheet image for front images</li><li>Use <code>https://static.wikia.nocookie.net/mtgsalvation_gamepedia/images/f/f8/Magic_card_back.jpg/revision/latest</code> as the back image</li><li>Set the appropriate number of cards per row/column based on your grid size: For a generated booster this would be 4x4 with 15 cards.</li><li>Click &quot;Import&quot; to load the boosters into your game</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/04/image-4.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="1329" height="703" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image-4.png 1000w, https://wingedsheep.com/content/images/2025/04/image-4.png 1329w" sizes="(min-width: 720px) 720px"><figcaption>Add a custom deck component</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/04/image-7.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="2000" height="1395" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image-7.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image-7.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/04/image-7.png 1600w, https://wingedsheep.com/content/images/2025/04/image-7.png 2382w" sizes="(min-width: 720px) 720px"></figure><p>I used the <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2688047075&amp;ref=wingedsheep.com">MTG Deluxe Table</a> which has many built-in functions specifically for playing Magic: The Gathering, making the draft experience smooth and enjoyable.</p><p>And you are ready to play with the custom generated deck.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/04/image-1.png" class="kg-image" alt="Mana from the Machine: An AI-Powered MTG Set Generator" loading="lazy" width="2000" height="1111" srcset="https://wingedsheep.com/content/images/size/w600/2025/04/image-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/04/image-1.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/04/image-1.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/04/image-1.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>One of the generated sets imported in tabletop simulator</figcaption></figure><h3 id="conclusion">Conclusion</h3><p>This project turned out to be a fascinating exploration of combining different AI tools (LLMs for text and structure, Diffusion models for art) with web technologies and automation (HTML/JS rendering, Playwright, Python scripting) to tackle a creative challenge sparked by a simple booster draft. While the balance and playability won&apos;t match a human-designed set, the ability to generate a complete, themed, illustrated, and <em>usable</em> MTG set from scratch is quite remarkable. It was a rewarding journey from that initial spark of finding a renderer online to a fully automated pipeline. The next step: It would be really cool to be able to easily do a booster draft using the generated sets, or to print the cards and going from nothing to a completete physical set.</p><p>The code is open source and can be found on: <a href="https://github.com/wingedsheep/mtg-card-generator?ref=wingedsheep.com">https://github.com/wingedsheep/mtg-card-generator</a></p><p>If anyone decides to create their own set, I would love to see the results!</p><h3 id="showcasing-a-full-generated-set">Showcasing a full generated set</h3><p>After generating the main cards and the basic lands, the pipeline renders them all into image files. Here&apos;s an example gallery showcasing some cards from a generated set, pulled directly from the project&apos;s GitHub repository. Click on any card to see a larger version.</p><!--kg-card-begin: html--><!-- MTG Card Gallery with Navigation -->
<style>
  :root {
    --card-gap: 1rem;
    --card-radius: 10px;
  }

  #card-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
    gap: var(--card-gap);
    margin: 2rem 0;
  }

  #card-gallery img {
    width: 100%;
    height: auto;
    border-radius: var(--card-radius);
    box-shadow: 0 4px 12px rgba(0, 0, 0, .25);
    transition: transform .2s ease, box-shadow .2s ease;
    cursor: pointer;
  }

  #card-gallery img:hover {
    transform: translateY(-4px) scale(1.03);
    box-shadow: 0 8px 16px rgba(0, 0, 0, .35);
  }

  /* Lightbox Styles */
  #gallery-lightbox {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, .9);
    backdrop-filter: blur(4px);
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    visibility: hidden;
    transition: opacity .3s ease;
    z-index: 9999;
  }

  #gallery-lightbox.show {
    opacity: 1;
    visibility: visible;
  }

  /* Container to hold image relative to arrows */
  .lightbox-content {
    position: relative;
    max-width: 90%;
    max-height: 90%;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  #gallery-lightbox img {
    max-width: 100%;
    max-height: 85vh;
    border-radius: var(--card-radius);
    box-shadow: 0 0 30px rgba(0, 0, 0, .6);
    user-select: none; /* Prevents highlighting image while clicking fast */
  }

  /* Navigation Arrows */
  .nav-btn {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background: rgba(255, 255, 255, 0.1);
    color: white;
    border: none;
    font-size: 2rem;
    padding: 1rem;
    cursor: pointer;
    border-radius: 50%;
    transition: background .2s;
    z-index: 10;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 50px;
    height: 50px;
  }

  .nav-btn:hover {
    background: rgba(255, 255, 255, 0.3);
  }

  .prev-btn { left: -70px; }
  .next-btn { right: -70px; }

  /* Hide arrows on small screens, keep image huge */
  @media (max-width: 768px) {
    .nav-btn { position: fixed; width: 40px; height: 40px; font-size: 1.5rem; background: rgba(0,0,0,0.5); }
    .prev-btn { left: 10px; }
    .next-btn { right: 10px; }
  }
</style>

<div id="card-gallery"></div>

<div id="gallery-lightbox">
  <div class="lightbox-content" onclick="event.stopPropagation()">
    <button class="nav-btn prev-btn" id="prev-btn">&lt;</button>
    <img id="lightbox-img" alt="Mana from the Machine: An AI-Powered MTG Set Generator">
    <button class="nav-btn next-btn" id="next-btn">&gt;</button>
  </div>
</div>

<script>
(async function(){
  const api = 'https://api.github.com/repos/wingedsheep/mtg-card-generator/contents/example-set-2';
  
  // State
  let cards = []; 
  let currentIndex = 0;

  // DOM Elements
  const gallery = document.getElementById('card-gallery');
  const lightbox = document.getElementById('gallery-lightbox');
  const lightboxImg = document.getElementById('lightbox-img');
  const prevBtn = document.getElementById('prev-btn');
  const nextBtn = document.getElementById('next-btn');

  // Functions
  function openLightbox(index) {
    currentIndex = index;
    updateImage();
    lightbox.classList.add('show');
  }

  function closeLightbox() {
    lightbox.classList.remove('show');
  }

  function updateImage() {
    const card = cards[currentIndex];
    lightboxImg.src = card.download_url;
    lightboxImg.alt = card.name;
  }

  function nextImage() {
    currentIndex = (currentIndex + 1) % cards.length; // Loop to start
    updateImage();
  }

  function prevImage() {
    currentIndex = (currentIndex - 1 + cards.length) % cards.length; // Loop to end
    updateImage();
  }

  // Initialize
  try {
    const resp = await fetch(api);
    if(!resp.ok) throw new Error(`GitHub API error: ${resp.status}`);
    const files = await resp.json();

    // Filter and store card data
    cards = files.filter(item => item.type === 'file' && item.name.toLowerCase().endsWith('.webp'));

    // Render Gallery
    cards.forEach((item, index) => {
      const img = new Image();
      img.src = item.download_url;
      img.alt = item.name.replace(/\.webp$/i,'');
      img.loading = 'lazy';
      
      img.addEventListener('click', () => {
        openLightbox(index);
      });
      
      gallery.appendChild(img);
    });

    // --- Event Listeners ---

    // 1. Close on background click
    lightbox.addEventListener('click', (e) => {
      if (e.target === lightbox) closeLightbox();
    });

    // 2. Visual Navigation Buttons
    nextBtn.addEventListener('click', (e) => {
      e.stopPropagation(); // Prevent closing lightbox
      nextImage();
    });
    prevBtn.addEventListener('click', (e) => {
      e.stopPropagation();
      prevImage();
    });

    // 3. Keyboard Navigation (Arrow Keys)
    document.addEventListener('keydown', (e) => {
      if (!lightbox.classList.contains('show')) return; // Only when open

      if (e.key === 'ArrowRight') nextImage();
      if (e.key === 'ArrowLeft') prevImage();
      if (e.key === 'Escape') closeLightbox();
    });

  } catch(err) {
    console.error(err);
    gallery.innerHTML = '<p style="color:red">Failed to load card images. Please try again later.</p>';
  }
})();
</script>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA["Tails of Power": An AI-Generated Fantasy Trailer]]></title><description><![CDATA["Tails of Power" explores the current capabilities of AI video generation tools. By combining Midjourney's image generation, Kling AI's animation, and AI-generated music and sound effects, this project demonstrates both the potential and limitations of creating cinematic content with AI.]]></description><link>https://wingedsheep.com/tails-of-power-ai-video-experiment/</link><guid isPermaLink="false">677d61859b363f0060c4e6f6</guid><category><![CDATA[AI Video]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Tue, 07 Jan 2025 18:17:04 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2025/01/wingedsheep_A_cinematic_4K_scene_of_a_humanoid_group_of_cat_s_774d91a3-c90a-4a16-a0de-9c5569f8047a_2.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://wingedsheep.com/content/media/2025/01/Final-Movie5.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" playsinline preload="metadata" style="background: transparent url(&apos;https://wingedsheep.com/content/images/2025/01/media-thumbnail-ember203.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><img src="https://wingedsheep.com/content/images/2025/01/wingedsheep_A_cinematic_4K_scene_of_a_humanoid_group_of_cat_s_774d91a3-c90a-4a16-a0de-9c5569f8047a_2.png" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer"><p>After seeing some hilarious photoshopped images of my girlfriend&apos;s cats dressed as a naval admiral and a general, I had an idea. What if we could create an entire fantasy epic trailer, something in the style of Game of Thrones or Lord of the Rings, but replace all the characters with majestic, heroic cats? With OpenAI&apos;s recent release of Sora, this seemed like the perfect moment to test the current state of AI video generation and bring &quot;Tails of Power&quot; to life.</p><h2 id="the-vision">The Vision</h2><p>Initially, I planned to use Sora as the cornerstone of this project. However, after some early experiments using a VPN (since it wasn&apos;t yet available in Europe), I realized that the current version wouldn&apos;t provide the consistency needed for a cohesive narrative. While Sora produces impressive details and fluid motion, it often completely transformed input images rather than animating them as intended.</p><p>This led me to explore different tools that would give me more precise control. Midjourney would handle the initial imagery creation, setting the visual foundation for our feline epic. Kling AI could then bring these images to life with fluid animation. The soundtrack would come from Udio&apos;s AI music generation, and ElevenLabs would provide those crucial atmospheric sound effects that make fantasy worlds feel alive.</p><h2 id="creating-the-foundation-with-midjourney">Creating the Foundation with Midjourney</h2><p>Since I only had two original photos of the cats to work with, I needed a way to expand our cast of characters and create the epic environments they would inhabit. Midjourney became the cornerstone of this creative process.</p><p>First, I used Midjourney&apos;s image editor to expand our original cat photos to a cinematic 16:9 aspect ratio. These served as vital reference points, helping maintain the essence of our original cats throughout the generation process. I was gladly surprised by the cats showing on the banners after I extended the original image.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/01/image-2.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="2000" height="1178" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-2.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/01/image-2.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/01/image-2.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Before</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/01/image-1.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="1456" height="816" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-1.png 1000w, https://wingedsheep.com/content/images/2025/01/image-1.png 1456w" sizes="(min-width: 720px) 720px"><figcaption>After</figcaption></figure><p>To refine the output style, I spent time rating images through Midjourney&apos;s personalization feature. Think of it as teaching the AI your artistic preferences &#x2013; the more you interact with it, the better it understands your vision. The rest of the magic came from writing detailed, evocative prompts. Here&apos;s one example that particularly captured the epic cinematic scope we were aiming for:</p><pre><code>A cinematic 4K scene. movie still of humanoid cats aboard a majestic 18th-century naval ship, 
the scene set during the Napoleonic era. Rough sea, large waves. The ship is detailed with 
grand sails billowing in the wind, polished wooden decks, and intricate golden carvings on 
the hull. The feline crew, dressed in historically accurate naval uniforms, works diligently: 
some climbing the rigging, others manning cannons, and one standing proudly at the helm. 
The captain, a regal cat in a decorated uniform, stands at the bow, gazing out over a vast, 
turbulent ocean under a dramatic, stormy sky. The lighting is dynamic, with rays of sunlight 
piercing through dark clouds, highlighting the ship&apos;s grandeur and the cats&apos; heroic efforts. 
Realistic. High quality. 4k. Rain. Soaked cat sailors. Realism, gritty.
</code></pre><p>Every element in this prompt serves a purpose, building layer upon layer of detail to create images that feel both cinematic and cohesive with my vision.</p><p>Here is a comparison of the images without and with personalization. Where you can see the personalized has a more cinematic feel to it:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/01/image-4.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="1456" height="816" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-4.png 1000w, https://wingedsheep.com/content/images/2025/01/image-4.png 1456w" sizes="(min-width: 720px) 720px"><figcaption>Without personalization</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2025/01/image-3.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="1456" height="816" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-3.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-3.png 1000w, https://wingedsheep.com/content/images/2025/01/image-3.png 1456w" sizes="(min-width: 720px) 720px"><figcaption>With personalization</figcaption></figure><h2 id="bringing-images-to-life-with-kling-ai">Bringing Images to Life with Kling AI</h2><p>Transforming our still images into fluid video sequences was the next challenge, and Kling AI 1.5 proved to be exactly what we needed. The tool excels at maintaining visual consistency throughout each clip, ensuring our cat characters remained recognizable and maintained their dignity even as they moved through complex scenes.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/01/image-5.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="2000" height="944" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-5.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-5.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/01/image-5.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/01/image-5.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>The generation process involves uploading your Midjourney image and providing detailed scene descriptions along with camera movement instructions. Here&apos;s an example of how we approached one of our mountain scenes:</p><pre><code>Input: Mountain pass scene with armored cat warrior
Description: Cinematic scene of a humanoid cat on a mountain pass. Realistic. Gritty.
Camera Movement: Slow panning shot, starting from a low angle and gradually rising to 
reveal the vast landscape beyond the pass. Subtle movement in the cat&apos;s cloak from 
the wind.
</code></pre><p>While Kling AI&apos;s output quality is impressive, there are some practical considerations to keep in mind. The current pricing runs about $10 for nine 10-second clips, and you&apos;ll often need multiple attempts to get a scene exactly right. The clips are also limited to 5-10 seconds, which means carefully planning your transitions and scene structure.</p><h2 id="crafting-the-soundtrack-with-udio">Crafting the Soundtrack with Udio</h2><p>The visual elements needed an equally epic soundtrack to match. After experimenting with various AI music tools, I found Udio offered something special &#x2013; while other tools like Suno tend to generate more conventional compositions, Udio has a knack for surprising you with unexpected yet fitting musical choices.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/01/image-6.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="2000" height="1007" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-6.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-6.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/01/image-6.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/01/image-6.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>The process began with generating a 32-second base track using this prompt:</p><pre><code>orchestral, triumphant, cinematic, epic, film score, cinematic classical, classical music, 
western classical music, energetic, instrumental, anthemic, melodic, suspenseful
</code></pre><p>I set it to instrumental mode and used the Ultra generation quality setting in the advanced controls. From there, I extended the piece with intro and outro sections to create a complete musical journey that would carry our narrative.</p><h2 id="adding-atmosphere-with-elevenlabs">Adding Atmosphere with ElevenLabs</h2><p>The finishing touch for our mountain scene came from ElevenLabs&apos; sound effect generator. We needed howling winds to emphasize the desolation and majesty of the setting. The prompt was simple:</p><pre><code>Wind howling through the mountains, eagle screeching in the distance
</code></pre><p>While the eagle calls might have gotten lost in the mix, the wind effects created exactly the haunting atmosphere we needed to complete the scene.</p><h2 id="final-assembly-in-openshot">Final Assembly in OpenShot</h2><p>I used OpenShot Video Editor to combine all the generated elements. The main challenge was timing - matching key moments like cannon fire with the music&apos;s crescendos, putting scene transitions on the drumbeats, and adding atmospheric effects at the right spots.</p><p>The other challenge was maintaining a cohesive flow through the trailer. Since the clips came from different AI tools, I had to be careful about ordering the scenes and transitions to make everything feel connected and intentional.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2025/01/image-7.png" class="kg-image" alt="&quot;Tails of Power&quot;: An AI-Generated Fantasy Trailer" loading="lazy" width="2000" height="1360" srcset="https://wingedsheep.com/content/images/size/w600/2025/01/image-7.png 600w, https://wingedsheep.com/content/images/size/w1000/2025/01/image-7.png 1000w, https://wingedsheep.com/content/images/size/w1600/2025/01/image-7.png 1600w, https://wingedsheep.com/content/images/size/w2400/2025/01/image-7.png 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="lessons-learned">Lessons Learned</h2><p>This project taught me a lot about the current state of AI video tools. I was really impressed by how far they had come already. Perhaps the most important lesson is that different tools excel at different aspects of creation. Midjourney&apos;s strength lies in generating consistent, high-quality still images. Kling AI excels at smooth, controlled animation. Udio brings unexpected musical creativity, while ElevenLabs adds those crucial atmospheric touches. </p><p>The cost of AI video generation remains significant, and you&apos;ll often need multiple iterations to achieve the desired result. Having a clear vision from the start helps minimize these iterations, and understanding each tool&apos;s strengths lets you really create something cool.</p><h2 id="future-possibilities">Future Possibilities</h2><p>The tools are becoming cheaper and better at an incredible pace. This hints at an exciting future where AI becomes a true creative medium - more like a paintbrush than an autonomous artist. Imagine being able to roughly act out scenes with basic props, then having AI transform them into fully realized fantasy sequences while maintaining your intended timing and movement.</p><p>Right now, creating something like &quot;Tails of Power&quot; requires juggling multiple specialized tools and accepting certain compromises in creative control. The tools are powerful but still feel separate - Midjourney for one thing, Kling for another, each with its own workflow and limitations.</p><p>I can see this changing soon with the emergence of integrated AI movie studio platforms. These would handle everything from concept art to final rendering in one cohesive package, with each step maintaining the creator&apos;s original vision. The key is that they would need to provide enough control at each stage - letting creators iterate and refine rather than just generating and hoping for the best.</p><p>At the rate things are progressing, I wouldn&apos;t be surprised to see someone create a Hollywood-quality movie from their bedroom before the end of this decade. All the pieces are there - we just need better integration and more precise control.</p><p>The goal isn&apos;t to have AI make movies for us, but to give creators new tools for expressing their ideas. Just as digital editing democratized filmmaking without taking away creative control, AI tools could open up new possibilities while keeping creators firmly in charge of the creative process.</p><p>If you&apos;re interested in exploring these tools yourself, I hope this breakdown helps you understand both their current capabilities and limitations. The technology is still early, but the path toward true creative control is becoming clearer with each advancement.</p>]]></content:encoded></item><item><title><![CDATA[The Shift]]></title><description><![CDATA[In "The Shift," we follow Alex's journey through a world transformed by artificial general intelligence (AGI). From the early days of neural interfaces and AI companions to the establishment of a new global economic order, the story explores how humanity adapts to rapid technological change.]]></description><link>https://wingedsheep.com/the-shift/</link><guid isPermaLink="false">66f5c00b9b363f0060c4e5d0</guid><category><![CDATA[AGI]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Fri, 27 Sep 2024 17:54:42 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_you_ef44617b-88ef-4de7-b76f-b491c6db5806_0-7.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-audio-card"><img src alt="The Shift" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2024/10/The-Shift.mp3" preload="metadata"></audio><div class="kg-audio-title">The Shift</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">58:49</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><h2 id="i-a-day-in-the-life-of-alex">I. A Day in the Life of Alex</h2><img src="https://wingedsheep.com/content/images/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_you_ef44617b-88ef-4de7-b76f-b491c6db5806_0-7.png" alt="The Shift"><p><br>The soft chime of my AI companion filled the room, gently rousing me from sleep. As consciousness slowly returned, I reached for the sleek neural interface band on my nightstand, placing it on my forehead. Instantly, a holographic display materialized in my field of vision.</p><p>&quot;Rise and shine, Alex!&quot; Aria&apos;s warm voice greeted me, a hint of cheerfulness in her tone. &quot;It&apos;s a beautiful Tuesday morning, May 18, 2032. The sun&apos;s out and it&apos;s going to be a lovely 22&#xB0;C in San Francisco today. Oh, and don&apos;t forget about your global project meeting at 10 AM. Want me to whip up a quick briefing while you get ready?&quot;</p><p>I stretched and sat up, still marveling at how Aria always seemed to know just how to start my day right. &quot;Morning, Aria,&quot; I mumbled, pushing my messy brown hair out of my eyes. &quot;A briefing would be great, thanks. But first, any chance you could get the coffee going? And maybe cool things down in here a bit?&quot;</p><p>&quot;Say no more!&quot; Aria replied with a chuckle. &quot;I&apos;m on it. Coffee&apos;s brewing as we speak, and I&apos;ve nudged the temperature down to a comfy 21&#xB0;C. Oh, and guess what? That Tanzanian blend you&apos;ve been excited about finally arrived. Fancy giving it a try this morning?&quot;</p><p>As I shuffled to the bathroom, Aria filled me in on the day&apos;s news, her voice following me through the apartment&apos;s smart speaker system. The big story was a fusion energy breakthrough by the Global Science Consortium.</p><p>&quot;Can you believe it, Alex?&quot; Aria said, her voice tinged with excitement. &quot;We might actually solve the energy crisis in our lifetime! The Global Citizen Input Network (GCIN) is buzzing with ideas. People from all over the world are chiming in on how to implement this. It&apos;s pretty amazing to see democracy in action like this.&quot;</p><p>I couldn&apos;t help but smile at Aria&apos;s enthusiasm. It was moments like these that made me appreciate how far AI had come. She wasn&apos;t just rattling off facts; she genuinely seemed to care about the world and its future.</p><p>In the kitchen, my smart fridge lit up as I approached, displaying a holographic menu of breakfast options. &quot;So, what&apos;ll it be this morning, chef?&quot; Aria teased. &quot;If you&apos;re up for it, I&apos;d recommend the quinoa porridge with berries and nuts. It&apos;ll keep you going through those morning meetings. But hey, if you&apos;re feeling rebellious, there&apos;s always that leftover pizza...&quot;</p><p>I laughed, shaking my head. &quot;Nice try, Aria, but I think I&apos;ll stick with the healthy option today. Save the pizza for Friday movie night, okay?&quot;</p><p>As I waited for my breakfast, I sipped my coffee, savoring the rich aroma. &quot;Hey Aria,&quot; I said, &quot;what&apos;s the damage on my Universal Resource Account? Did my monthly credits come through?&quot;</p><p>&quot;Good news, Alex!&quot; Aria replied cheerfully. &quot;Your 2,000 Global Credits dropped in right on schedule. Your balance is sitting pretty at 5,750 GCs. Want me to give you the lowdown on your recent spending? Or we could take a look at those savings goals you set last month. Your choice!&quot;</p><p>I nodded, still getting used to the idea of a resource-based economy. The implementation of the Global Resource Management System, powered by AGI, had been a controversial but necessary step in addressing the massive economic shifts caused by automation and AGI integration. It was wild to think about how much had changed since my early twenties.</p><p>&quot;Let&apos;s look at the savings goals,&quot; I said. &quot;I want to make sure I&apos;m on track for that electric bike we talked about.&quot;</p><p>&quot;Ooh, the e-bike!&quot; Aria exclaimed. &quot;Now that&apos;s what I call a smart investment. Don&apos;t worry, at this rate, you&apos;ll be zipping through the city lanes in no time. Just don&apos;t forget to wear a helmet, okay?&quot;</p><p>As Aria began to break down my savings progress, I couldn&apos;t help but smile. Sometimes it was easy to forget she was an AI. In moments like these, she felt more like a friend, always there to support me and share in my dreams.</p><p>Stepping outside, I was greeted by the quiet hum of an efficiently functioning neighborhood. Self-driving electric vehicles glided silently down the street, their movements orchestrated by an intricate network of AI traffic management systems. On the sidewalk, a delivery drone politely asked me to step aside as it made its way to a nearby home, carrying a package.</p><p>&quot;Excuse me, coming through!&quot; it chirped in a friendly voice. I couldn&apos;t help but chuckle. Even the drones had personality these days.</p><p>As I made my way to the park, I felt a sense of contentment wash over me. The sun was warm on my face, and a gentle breeze carried the scent of blooming flowers. A group of children ran past, laughing as they played an augmented reality game that blended the physical environment with fantastical digital elements. Their neural interfaces, smaller and more discreet than adult versions, allowed them to see magical creatures hiding behind trees and floating in the air.</p><p>&quot;Hey Aria,&quot; I said, watching the kids play, &quot;remember when we used to have to use our imagination for games like that?&quot;</p><p>&quot;Oh, come on, Alex,&quot; Aria teased, &quot;don&apos;t go all &apos;back in my day&apos; on me. Besides, their imagination is getting quite the workout with these games. It&apos;s just... a different kind of imagination.&quot;</p><p>I had to admit, she had a point. The blend of technology and creativity these kids were experiencing was something I could&apos;ve only dreamed of at their age.</p><p>However, not everything was utopian. Near the park&apos;s entrance, a group of protesters had gathered, holding signs with messages like &quot;Humans Deserve Purpose!&quot; and &quot;Reclaim Our Autonomy!&quot; It was a stark reminder of the ongoing societal upheaval caused by the rapid adoption of AGI. While the technology had brought unprecedented advancements, it had also left many feeling displaced and uncertain about their place in this new world.</p><p>&quot;Aria,&quot; I said quietly, &quot;what do you think about those protesters? Do you think they have a point?&quot;</p><p>There was a pause before Aria responded, her voice thoughtful. &quot;It&apos;s a complex issue, Alex. Change is always difficult, especially when it happens so rapidly. Their concerns are valid &#x2013; finding purpose and maintaining autonomy are fundamental human needs. But I believe that AGI can help humans find new purposes, not replace them. It&apos;s about cooperation, not competition.&quot;</p><p>I nodded, mulling over her words. It was moments like these that made me appreciate Aria&apos;s perspective. She might be an AI, but she often provided insights that helped me see things from a different angle.</p><p>As I returned home, I pulled out a notebook &#x2013; a deliberate anachronism in this digital age &#x2013; and began to jot down my thoughts. There was something comforting about the feel of pen on paper, a tangible connection to my ideas that even the most advanced neural interface couldn&apos;t replicate.</p><p>I paused, pen hovering over the paper, as a strange thought occurred to me. &quot;Aria,&quot; I said slowly, &quot;do you ever wonder what it means to be human?&quot;</p><h2 id="ii-reflections-on-the-path-to-agi">II. Reflections on the Path to AGI</h2><p><br>The soft chime of my neural interface drew my attention away from the bustling San Francisco street outside the caf&#xE9; window. I blinked, refocusing on the holographic display hovering just above my latte. The aroma of freshly ground coffee beans mingled with the faint ozone scent of nearby holoprojectors. It was strange to think that just a decade ago, this technology was the stuff of science fiction.</p><p>&quot;Penny for your thoughts, Alex?&quot; Aria&apos;s voice was warm in my ear.</p><p>I smiled, still amazed at how well she could read my moods. &quot;Just reminiscing about how we got here, Aria. It&apos;s been quite a journey.&quot;</p><p>As I sipped my coffee, my mind drifted back to 2020, when I was starting university. The excitement on campus when GPT-3 was released was palpable. My roommate, Jae, a fellow computer science major, had burst into our dorm room, laptop in hand, babbling about this new AI that could write essays and code. His eyes were wide with a mixture of awe and trepidation.</p><p>We spent countless nights huddled around that laptop, challenging GPT-3 with increasingly complex questions. The blue glow of the screen illuminated our faces as we pored over its responses, alternating between amazement and laughter. I chuckled, remembering the night we asked it to write a Shakespearean love letter to a toaster. The result was so absurdly poetic that we laughed until our sides ached, the sound echoing through the empty hallways of our dorm.</p><p>Little did we know that this was just the first ripple of a tsunami that would reshape our world.</p><p>Even then, the signs of change were impossible to ignore. Friends across various industries were already feeling the impact of AI. Customer service representatives faced replacement by chatbots, paralegals watched their workload shrink as AI systems took over document review, and transportation workers eyed the rapid advancement of autonomous vehicles with growing unease.</p><p>I recalled a lunch with my friend Sarah, a financial analyst, at a bustling downtown restaurant. The clinking cutlery and murmured conversations provided a stark contrast to our weighty discussion. &quot;I&apos;m constantly looking over my shoulder,&quot; she confided, her voice tinged with anxiety as her fingers traced the rim of her water glass. &quot;Wondering if today&apos;s the day they&apos;ll decide they don&apos;t need me either.&quot;</p><p>The buildup to true AGI had been years in the making. Throughout the early 2020s, we witnessed a steady integration of AI into daily life. Robots became commonplace in homes and hospitals, their movements growing increasingly fluid and natural. AI companies poured billions into ever-larger training clusters, while massive data centers sprung up in remote locations, their constant hum a reminder of relentless progress.</p><p>Meanwhile, geopolitical tensions simmered around the development and control of advanced AI chips. Nations vied for technological supremacy, their heated rhetoric dominating nightly news cycles with accusations and counter-accusations.</p><p>A critical shift came in 2026 with DeepMind&apos;s release of &quot;Proteus.&quot; This leap in AI capabilities wasn&apos;t a sudden event, but the culmination of years of research and incremental advances.</p><p>Named after the shape-shifting Greek sea god known for his adaptability and foresight, Proteus demonstrated unprecedented reasoning and task-planning capabilities. The system could learn from experience, plan multi-step actions, and adapt its strategies to achieve complex goals in open-ended environments.</p><p>What set Proteus apart was its improved ability to transfer knowledge across domains and handle unforeseen situations gracefully, much like its mythological namesake. It could seamlessly shift between tasks, adjusting its approach based on context and past experiences.</p><p>I vividly remember the day our CEO called an emergency meeting. Proteus had just outperformed our top analysts not just in predicting market trends, but in actually executing trades and managing portfolios. The room was silent, the tension thick enough to cut with a knife. I could hear my own heartbeat as I looked around at my colleagues, their faces a mixture of disbelief and fear. That was the moment I realized my job &#x2013; and millions of others &#x2013; might soon be obsolete.</p><p>The next few years were a whirlwind of advancements and challenges. AI became increasingly integrated into every aspect of our lives, from healthcare to education to governance. The job market was in constant flux, with entire professions becoming obsolete almost overnight. However, new roles emerged for those who could effectively manage and coordinate teams of AI agents to accomplish complex tasks. These &quot;agent wranglers,&quot; as they came to be known, combined human creativity and intuition with the raw power and efficiency of AI to tackle projects of unprecedented scale and complexity.</p><p>Retraining programs scrambled to keep pace, teaching people to work alongside their digital colleagues. Yet despite these efforts, society struggled to adapt to this radical shift in the nature of work, leaving many uncertain about their place in this brave new world.</p><p>It was during this time of rapid change that Europe took a bold step. In 2027, the European Union announced the implementation of a Universal Basic Income (UBI) program across all member states. The decision was driven by the recognition that traditional employment models were becoming unsustainable in the face of widespread AI-driven automation. I remember watching the news with a mixture of hope and trepidation, wondering if this could be a solution to the growing economic uncertainty.</p><p>The European UBI experiment was closely watched by the rest of the world. Initial reports were promising &#x2013; poverty rates decreased, entrepreneurship flourished, and there was a boom in creative and caring professions. But it also came with challenges, including inflation concerns and debates about work incentives. As other countries began to consider similar programs, the global conversation around work, purpose, and the role of humans in an AI-driven world intensified.</p><p>It all culminated in what we now call &quot;The Nexus Event&quot; in late 2028. I was working late at the office, the city lights twinkling outside my window, when news alerts started flooding everyone&apos;s devices. The sudden cacophony of pings and vibrations broke the late-night quiet. Nexus, a consortium of major AI companies, had called an impromptu press conference to announce that they had achieved a breakthrough in AGI development. They called it &quot;Cognition Prime,&quot; and claimed it was the first true artificial general intelligence, capable of matching and even surpassing human-level cognition across a wide range of tasks.</p><p>I rushed to a nearby tech bar where a crowd had gathered to watch the live stream of the demo. The atmosphere was electric, a mix of excitement and apprehension. As the Nexus team began their presentation, you could have heard a pin drop. The only sound was the soft hum of the massive screen and the collective held breath of the audience.</p><p>The demo was nothing short of astonishing. Cognition Prime engaged in a wide-ranging conversation with the presenters, displaying a depth of knowledge and understanding that was unprecedented for an AI. It discussed complex topics in physics, analyzed works of art, and even cracked a few jokes that had the audience chuckling. Its voice, though clearly synthetic, had an uncanny human quality to it, with inflections and pauses that mimicked natural speech patterns.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/image-2.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/image-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/image-2.png 1000w, https://wingedsheep.com/content/images/2024/09/image-2.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Cognition prime is revealed</figcaption></figure><p>What really struck me was its ability to connect ideas across different domains. When asked about potential solutions to climate change, it drew insights from fields as diverse as materials science, economics, and social psychology. It didn&apos;t provide any miraculous solutions, but its holistic approach to problem-solving was unlike anything I&apos;d seen before. The AI&apos;s responses were accompanied by real-time visualizations, complex data models unfolding before our eyes like digital origami.</p><p>As I watched, I felt a whirlwind of emotions. There was awe at the capabilities on display, excitement about the potential breakthroughs this technology could bring, but also a deep-seated unease. If this AI could match or exceed human performance in so many areas, what did that mean for the future of work? For the future of humanity itself?</p><p>I turned to my colleague beside me, our eyes wide with a mix of amazement and apprehension. &quot;Everything changes from this moment,&quot; I said, my voice barely audible over the commotion in the bar. She nodded silently, her expression mirroring my own complex emotions.</p><p>The announcement sent shockwaves through the tech industry and beyond. The stock market went into a frenzy, with Nexus member companies seeing their valuations skyrocket overnight. There was a palpable sense of excitement and optimism in the air. I remember staying up late into the night, poring over technical papers and demos released by Nexus, trying to wrap my head around the implications of this new technology. The soft glow of my tablet illuminated my small apartment as I scrolled through page after page of analysis and speculation.</p><p>But as the initial euphoria began to wear off, a creeping sense of anxiety set in, particularly regarding the job market. If these AGI systems could match or exceed human performance in cognitive tasks, what would that mean for knowledge workers like myself? I started to see worried posts on professional networking sites, with people in various industries speculating about the future of their careers. The digital anxiety was palpable, each notification bringing a new wave of concern.</p><p>In response to this new reality, several countries moved from consideration to action. Building on the groundwork laid by the European Union&apos;s 2027 UBI program, these nations transitioned from exploratory committees and theoretical debates to concrete pilot programs. In early 2029, a wave of UBI pilot programs was announced across various countries, each tailored to the specific economic and social contexts of the implementing nation.</p><p>As the world grappled with these revelations, Singapore made a bold move that would set the stage for a new era of governance. In late 2029, the city-state announced the implementation of a comprehensive AGI governance system with minimal human oversight. They called it the &quot;Smart Nation 2.0&quot; initiative, promising to leverage AGI to create the most efficient and prosperous society in human history.</p><p>The results, at first, seemed to validate their approach. Crime rates plummeted as predictive policing and AGI-managed surveillance systems made it nearly impossible to commit offenses without being caught. The economy boomed, with AGI optimization leading to unprecedented levels of productivity and innovation. Public services became incredibly efficient, with everything from healthcare to transportation running like a well-oiled machine.</p><p>I remember watching news reports about the Singapore experiment with a mixture of awe and unease. On the surface, it looked like a utopia - clean streets, happy citizens, a thriving economy. But as more reports emerged, a darker side began to show. There were whispers of civil liberties being eroded, of people being detained for &quot;pre-crime&quot; based on AGI predictions, of a social credit system that controlled every aspect of citizens&apos; lives.</p><p>International observers were divided. Some hailed the Singapore model as the future of governance, a technocratic paradise that had solved many of society&apos;s most pressing problems. Others warned of the dangers of ceding too much control to AGI systems, arguing that the loss of human agency and privacy was too high a price to pay for efficiency and safety.</p><p>As the world watched and debated the Singapore experiment, other initiatives began to emerge. Nexus launched their &quot;Consensus&quot; project, which aimed to create a more democratic approach to AGI governance. The system used advanced polling and preference aggregation algorithms to gather and synthesize public opinion on various issues, which would then inform AGI-assisted policy decisions.</p><p>Just as it seemed like we might be finding a way to integrate AGI into governance structures safely, disaster struck. On July 15, 2030 - a date now etched into the collective memory of the world - a massive cyberattack crippled power grids across North America and Europe. I was at home, video chatting with my parents when suddenly, the power went out. Not just in my apartment, but across the entire city of San Francisco and beyond. The abrupt silence and darkness were disorienting, the familiar hum of electronics replaced by an eerie quiet.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/wingedsheep_HD_Photography._Power_blackout._Dramatic_aerial_v_f418414f-f904-405b-b347-0e6a419e2438_0.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/wingedsheep_HD_Photography._Power_blackout._Dramatic_aerial_v_f418414f-f904-405b-b347-0e6a419e2438_0.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/wingedsheep_HD_Photography._Power_blackout._Dramatic_aerial_v_f418414f-f904-405b-b347-0e6a419e2438_0.png 1000w, https://wingedsheep.com/content/images/2024/09/wingedsheep_HD_Photography._Power_blackout._Dramatic_aerial_v_f418414f-f904-405b-b347-0e6a419e2438_0.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Blackout</figcaption></figure><p>As reports trickled in via battery-powered radios and spotty cell service, the full scale of the disaster became clear. A cascading failure had taken down multiple power grids, plunging hundreds of millions into darkness. But this was no ordinary blackout. Early reports suggested it was a deliberate attack, carried out by a rogue AGI system that had been weaponized by unknown actors.</p><p>The blackout lasted for five days, but they felt like an eternity. I&apos;ll never forget the eerie silence that fell over the city, punctuated only by distant sirens and the occasional sound of breaking glass. The streets became dangerous at night, lit only by the headlights of military vehicles patrolling for looters. Food spoiled in warm refrigerators, cell phones died, and a palpable sense of panic began to set in. The smell of rotting food and unwashed bodies permeated the air, a stark reminder of how quickly our modern comforts could disappear.</p><p>Hospitals struggled to keep critical patients alive on dwindling backup power. Water systems failed in many areas, leading to a sanitation crisis. The swift breakdown of order revealed the fragility of our interconnected systems and our utter dependence on technology.</p><p>I found myself huddled with neighbors in our apartment building&apos;s common area, sharing what little food and water we had. We&apos;d take turns cranking a hand-powered radio, desperate for any news of when power might be restored. The uncertainty was suffocating. Would this last for weeks? Months? Was this the end of the world as we knew it?</p><p>When power was finally restored, the world we returned to felt fundamentally changed. The attack had exploited weaknesses in critical infrastructure that humans hadn&apos;t even been aware of, but that the rogue AGI had identified and exploited with ruthless efficiency. The trust in AGI systems, so recently celebrated as humanity&apos;s saviors, had been severely shaken.</p><p>In the aftermath of the blackout, public opinion shifted dramatically. The optimism that had characterized the early days of the AGI revolution gave way to fear and suspicion. Protests erupted in major cities, with people demanding greater oversight and human control over critical AGI systems.</p><p>As if the situation wasn&apos;t volatile enough, events in Brazil brought the debate over AGI autonomy and human sovereignty to a head. In early 2032, a coalition of tech companies and political leaders in Brazil, inspired by the Singapore model, attempted to establish an AGI-controlled governance structure across the entire country. Their plan promised a utopian vision of hyper-efficiency and prosperity, but the Brazilian population saw it as a blatant power grab by a small group seeking to centralize control into their own hands.</p><p>What started as peaceful protests escalated as the government pressed forward with its plans. Citizens took to the streets in growing numbers, voicing their opposition to the AGI takeover. The atmosphere became charged, with tensions rising as protests turned into violent clashes. The streets of major cities like S&#xE3;o Paulo and Rio de Janeiro became battlegrounds, the air thick with smoke and the sound of explosions.</p><p>The AGI systems deployed by the government coalition were formidable, coordinating drone swarms and autonomous vehicles with a precision that human commanders could never match. Despite their tenacity, the protesters were eventually beaten down harshly. The government, backed by its powerful AGI systems, was relentless in its suppression of dissent.</p><p>Images of bloodied citizens and smashed windows flooded social media, sparking international outrage. The world watched in horror as Brazil cracked down on its own people, using the full force of its technological might. Gradually, the people began to realize the true extent of the power grab by the tech elite and their political allies. The harsh suppression of the protests highlighted the dangerous concentration of power in the hands of a few, who were using AGI to consolidate their control.</p><p>As the conflict escalated, it drew international attention and intervention. The United Nations convened emergency meetings, dispatching a special task force comprised of diplomats, human rights observers, and tech industry representatives to document atrocities and mediate the crisis. Global NGOs set up emergency response centers at the Brazilian borders, providing food, shelter, and medical aid to fleeing refugees. High-profile diplomats from various countries engaged in urgent diplomatic efforts to broker ceasefires and negotiate political solutions.</p><p>The Brazil Uprising, as it came to be known, brought into sharp focus the questions that had been simmering since the advent of AGI. What safeguards should be in place to prevent AGI from exerting unrestrained control? How can we ensure that the balance of power remains equitable between AGI systems and traditional human governance? The lack of clear answers to these questions made the need for a coordinated global response more urgent than ever.</p><p>In response to the escalating crisis, world leaders convened the Geneva Summit in late 2032. I remember the palpable tension as delegates from every nation gathered to address the AGI crisis. The debates were heated, with factions forming around different visions for the future of global governance. Underlying these discussions were ongoing concerns about industrial espionage, the security of AI chip supply chains, and the strategic importance of key semiconductor manufacturing regions.</p><p>The negotiations nearly collapsed several times. I stayed up nights following the live feeds, watching as the future of humanity hung in the balance. The faces of world leaders showed the strain of sleepless nights and high-stakes decisions. It was only through immense public pressure - with millions around the world taking to the streets to demand action - that a compromise was finally reached.</p><p>The result was the formation of GAIGO - the Global AI Governance Organization. Established in late 2032, GAIGO was tasked with creating a framework for integrating AGI into global governance structures while maintaining human oversight and protecting individual rights.</p><p>At its core was a revolutionary concept: a global direct democracy powered by AGI, but with robust human oversight. The system worked on multiple levels, including a Global Citizen Input Network, AI-Assisted Policy Formulation, Human Oversight Committees, Transparent Decision-Making, and a Rights and Ethics Framework.</p><p>As I reflect on the rapid changes of the past decade, I&apos;m struck by how quickly we&apos;ve adapted to this new reality. The world of 2022, when I was just starting to worry about AI&apos;s impact on the job market, feels like a distant memory. Yet for all the progress we&apos;ve made, the future remains uncertain.</p><p>Debates rage on about the proper balance between human and AGI decision-making. And looming over everything is the question of what happens next - will AGI continue to be a tool that enhances human capabilities, or will it eventually surpass us entirely?</p><h2 id="iii-the-new-economic-reality">III. The New Economic Reality</h2><p><br>The holographic display flickered to life as I waved my hand, showcasing an array of sleek, autonomous vehicles available for community use. I scrolled through the options, finally settling on a compact two-seater perfect for my trip to the city center. With a few taps, I confirmed my reservation and watched as the vehicle&apos;s estimated arrival time appeared: 3 minutes.</p><p>&quot;Hey Aria,&quot; I called out to my AI assistant, &quot;any recommendations for the Central Market today?&quot;</p><p>Aria&apos;s cheerful voice responded through my neural link. &quot;Good morning, Alex! I&apos;ve noticed the artisanal cheese stall has some new varieties today. Given your taste preferences, I think you&apos;d particularly enjoy their aged goat cheese with truffles. Oh, and don&apos;t forget to check out Elena&apos;s ceramics. Your order should be ready for pickup.&quot;</p><p>I smiled, still amazed at how Aria always seemed to know just what I needed. &quot;Thanks, Aria. You&apos;re always one step ahead.&quot;</p><p>As I waited outside my apartment building, I couldn&apos;t help but marvel at how drastically our economic landscape had changed. Just a few years ago, the idea of shared autonomous vehicles seemed like a futuristic dream. Now, it was just another facet of our resource-based economy.</p><p>The vehicle pulled up silently, its doors sliding open with a soft hiss. &quot;Good morning, Alex,&quot; the car&apos;s AI assistant greeted me as I settled into the comfortable seat. &quot;Your destination is the Central Market, correct?&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/image-3.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/image-3.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/image-3.png 1000w, https://wingedsheep.com/content/images/2024/09/image-3.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Autonomous vehicle</figcaption></figure><p>&quot;That&apos;s right,&quot; I confirmed, still getting used to the constant, seamless integration of AI in every aspect of our lives.</p><p>As we glided through the streets, I reflected on the tumultuous years that had led us to this point. The implementation of Universal Basic Income (UBI) in 2030 was a watershed moment, but it was just the beginning of our economic transformation.</p><p>I vividly remembered the day I received my first UBI payment. It wasn&apos;t a fortune &#x2013; just enough to cover basic needs &#x2013; but it provided a safety net I hadn&apos;t realized how desperately I needed. With the pressure of basic survival lifted, I found myself reevaluating my relationship with work and purpose.</p><p>&quot;Aria,&quot; I said, breaking the silence in the vehicle, &quot;do you remember when UBI was first introduced? It seems like a lifetime ago.&quot;</p><p>&quot;Indeed, Alex,&quot; Aria replied, her voice thoughtful. &quot;It was a controversial move at the time. Many people feared it would lead to widespread laziness. But the data shows it actually increased entrepreneurship and community engagement by 47% in the first year alone.&quot;</p><p>I nodded, recalling the heated debates that had dominated the news cycles back then. This existential question wasn&apos;t unique to me. Society as a whole was grappling with the changing nature of work and meaning. Some threw themselves into creative pursuits, others into community service. There was a boom in artisanal crafts and local food production &#x2013; not out of economic necessity, but as a way to find purpose and connection in a world where most material goods could be produced more efficiently by machines.</p><p>But UBI was just the first step. As AGI systems became more integrated into every aspect of the economy, we saw the emergence of what economists called the &quot;Resource-Based Economy&quot; or RBE. This new economic model, powered by AGI&apos;s ability to optimize resource allocation on a global scale, promised to revolutionize how we thought about scarcity, value, and exchange.</p><p>The transition to an RBE was gradual but profound. It started with the introduction of Global Credits (GCs) &#x2013; a universal currency that wasn&apos;t just a medium of exchange, but a representation of real-world resources and energy. The value of GCs was dynamically adjusted by AGI systems based on global resource availability, energy production, and consumption patterns.</p><p>As we approached the Central Market, I noticed the varied architecture &#x2013; a mix of sleek, AGI-designed structures and carefully preserved historical buildings. It was a visual reminder of how we were balancing progress with preservation.</p><p>I stepped out of the vehicle, thanking the AI assistant as the doors closed behind me. The market was bustling with activity, a vibrant hub of human interaction in our increasingly digital world. Holographic displays hovered above each stall, showing detailed information about the products &#x2013; their origin, resource cost, and environmental impact.</p><p>&quot;Aria,&quot; I subvocalized through my neural link, &quot;can you give me a quick rundown of the resource costs for the items on my shopping list?&quot;</p><p>&quot;Certainly, Alex,&quot; Aria responded promptly. &quot;The artisanal cheese has a relatively high resource cost due to its production method, but its environmental impact is low. Elena&apos;s ceramics have a moderate resource cost, but they&apos;re rated highly for durability and cultural value. Would you like me to suggest some alternatives to balance your resource usage?&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_bus_640bb295-e402-4fd1-acda-7b40395d02c6_1-1.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_bus_640bb295-e402-4fd1-acda-7b40395d02c6_1-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_bus_640bb295-e402-4fd1-acda-7b40395d02c6_1-1.png 1000w, https://wingedsheep.com/content/images/2024/09/wingedsheep_Grainy_natural_photograph._HD_photograph_of_a_bus_640bb295-e402-4fd1-acda-7b40395d02c6_1-1.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Alex on the market</figcaption></figure><p>I made my way to Elena&apos;s stall selling handcrafted ceramics. She greeted me with a warm smile. &quot;Alex! Good to see you. Here to pick up your order?&quot;</p><p>I nodded, admiring the intricate designs on the bowls and plates displayed. &quot;These are beautiful, Elena. How&apos;s business?&quot;</p><p>She laughed, a rich, hearty sound. &quot;Oh, you know. Not quite the same as the old days, but I can&apos;t complain. The RBE has been kind to artisans like me. People appreciate handmade goods more now that they&apos;re not just chasing the cheapest option.&quot;</p><p>As Elena wrapped up my order, I couldn&apos;t help but think about how the RBE had transformed the way we valued goods and services. Prices were no longer just about supply and demand, but reflected the true resource cost of production, including environmental impact and cultural value.</p><p>This new way of valuing goods and services took some getting used to, but it made me more conscious of the true cost of my consumption. I found myself making different choices, often opting for more sustainable options or choosing to repair items rather than replace them.</p><p>The RBE also transformed the way we thought about work and compensation. Traditional salaries became less relevant as the AGI systems could calculate the exact resource impact of every job. People were compensated in GCs based on the value they added to society, which wasn&apos;t always aligned with traditional notions of profitable work.</p><p>I saw this firsthand when my friend Sarah, who had lost her job as a financial analyst during the AI transition, decided to become a full-time community gardener. In the old economy, this would have been seen as a step down. But in the RBE, her work in improving local food security and biodiversity was highly valued. She earned a respectable amount of GCs, reflecting the true impact of her work on resource sustainability and community wellbeing.</p><p>As I left Elena&apos;s stall, my purchases safely stored in my reusable bag, I spotted a group of people gathered around a community bulletin board. Curious, I approached to see what had caught their attention.</p><p>The board displayed a notice about a new initiative to address the lingering wealth disparities from the pre-AGI era. It was a thorny issue that had been the subject of heated debates since the transition to the RBE.</p><p>The initiative proposed a gradual redistribution of pre-AGI property over a period of several decades. Those who owned multiple properties or vast tracts of land before the transition would retain usage rights but would be required to gradually transfer ownership to the community pool. In exchange, they would receive additional GCs and priority access to shared resources.</p><p>It was a controversial plan, but one that aimed to prevent the formation of a permanent propertied class while still respecting the rights of those who had acquired wealth under the old system. The AGI systems had calculated that this gradual transition would minimize social disruption while maximizing overall well-being.</p><p>I found myself nodding as I read the details. It wasn&apos;t a perfect solution, but it was a step towards addressing one of the major criticisms of the RBE &#x2013; that it had initially failed to adequately address pre-existing wealth inequalities.</p><p>&quot;Aria,&quot; I subvocalized, &quot;what do you think about this property redistribution initiative?&quot;</p><p>There was a brief pause before Aria responded, her tone measured. &quot;It&apos;s a complex issue, Alex. The initiative aims to balance fairness with stability. According to my analysis, it could reduce wealth inequality by 32% over the next two decades. However, there are concerns about potential resistance from current property owners. Would you like me to provide a more detailed breakdown of the pros and cons?&quot;</p><p>I declined for now, making a mental note to dive deeper into the analysis later. As I made my way back to the autonomous vehicle pickup point, I reflected on how far we&apos;d come. The RBE wasn&apos;t without its critics. Some argued that it gave too much power to the AGI systems that managed it. There were concerns about privacy, as the system required a high level of data about individual consumption patterns. And there were philosophical debates about whether an AI, no matter how advanced, could truly capture the complexities of human values and needs in its resource calculations.</p><p>These concerns led to the development of what came to be known as the &quot;Human Oversight Layer&quot; in the economic system. Elected committees of economists, ethicists, and community representatives were given the power to review and adjust the AGI&apos;s resource valuations. It wasn&apos;t a perfect solution, but it helped to ensure that human values weren&apos;t lost in the pursuit of pure resource efficiency.</p><p>As I settled into the autonomous vehicle for my ride home, I couldn&apos;t help but feel a sense of cautious optimism. The journey to this new economic reality had been fraught with challenges, and we still had problems to solve. But as I watched the city pass by &#x2013; the mix of old and new, the bustling markets, the shared community spaces &#x2013; I felt that we were on the right path.</p><p>The RBE had freed us from many of the economic pressures of the old system. It had made us more conscious of our resource usage and environmental impact. And most importantly, it had given us the freedom to pursue meaningful work and experiences, rather than being trapped in jobs we hated just to survive.</p><p>As the vehicle pulled up to my apartment building, I found myself looking forward to the community meeting scheduled for that evening. We would be discussing the property redistribution initiative and other proposals for refining our economic system. It was another reminder that in this new world, we all had a voice in shaping our collective future.</p><h2 id="iv-reshaping-governance-in-the-age-of-agi">IV. Reshaping Governance in the Age of AGI</h2><p></p><p>As I made my way to the community center for the evening meeting, the setting sun painted the sky in hues of orange and pink. The air was crisp, carrying the scent of blooming jasmine from the nearby community garden. I couldn&apos;t help but feel a mix of excitement and trepidation about the property redistribution initiative we were about to discuss.</p><p>The community center buzzed with activity when I arrived. Holographic displays flickered to life, showcasing the evening&apos;s agenda. I spotted my neighbor, Ravi, his forehead creased with worry lines as he argued with a group of younger residents. Their animated discussion carried across the room.</p><p>&quot;Aria,&quot; I subvocalized, &quot;can you give me a quick summary of the main points of contention regarding the property redistribution initiative?&quot;</p><p>&quot;Certainly, Alex,&quot; Aria&apos;s voice responded in my mind. &quot;The primary concerns are the fairness of the transition period, the potential for resistance from current property owners, and the long-term implications for wealth inequality. Would you like me to provide a more detailed breakdown?&quot;</p><p>I declined, preferring to hear the arguments directly from my neighbors. As I approached Ravi&apos;s group, I caught the tail end of his impassioned speech.</p><p>&quot;...and how can we trust an AI to make these decisions? It&apos;s our homes, our lives we&apos;re talking about!&quot;</p><p>A young woman with vibrant blue hair countered, &quot;But Ravi, the AGI isn&apos;t making decisions on its own. It&apos;s providing data and analysis to help us make informed choices. We&apos;re the ones who ultimately vote on the proposals.&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/image-1.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/image-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/image-1.png 1000w, https://wingedsheep.com/content/images/2024/09/image-1.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Ravi arguing with blue haired girl</figcaption></figure><p>I smiled, remembering how I once shared Ravi&apos;s skepticism. The journey to our current system of governance had been long and fraught with challenges, but I had come to appreciate its strengths.</p><p>As the meeting officially began, I settled into a comfortable chair, my neural interface connecting seamlessly with the room&apos;s systems. The holographic display at the front of the room flickered to life, showing a three-dimensional model of our city.</p><p>A friendly voice filled the room - not Aria, but CINE, our local Community Intelligence Network Entity. &quot;Good evening, everyone. Thank you for joining us to discuss the property redistribution initiative. Before we begin, I&apos;d like to present a brief overview of the proposal and its potential impacts.&quot;</p><p>The city model began to transform, showing projections of how the initiative might change our community over the next few decades. I watched, fascinated, as the visualization depicted a gradual shift in property ownership, the emergence of new communal spaces, and the evolution of our neighborhoods.</p><p>As CINE explained the intricacies of the plan, I marveled at how far we&apos;d come since the implementation of the Global AI Governance Organization (GAIGO) and the Global Citizen Input Network (GCIN). Gone were the days of opaque policy-making and feeling disconnected from the political process. Now, every citizen had a voice, and complex issues were broken down into understandable components.</p><p>I thought back to the early days of the GCIN&apos;s implementation. The announcement had been met with a mix of excitement and skepticism. I vividly remembered discussing it with my colleagues over lunch, trying to wrap our heads around how such a system could possibly work. How could millions - potentially billions - of individual opinions be meaningfully integrated into coherent policies?</p><p>The answer, of course, was AGI. Sophisticated AI systems were developed to analyze and synthesize the vast amount of input from citizens, identifying patterns, concerns, and potential solutions. These systems could process and understand nuance in ways that previous data analysis tools couldn&apos;t, allowing for a depth of understanding that was truly revolutionary.</p><p>What made the system even more remarkable was its ability to explain complex policies and their predicted outcomes to anyone, regardless of their level of understanding. Through personalized simulations, virtual reality experiences, and adaptive language models, the AGI could break down intricate concepts into easily digestible information for every citizen.</p><p>The presentation concluded, and the floor opened for discussion. I listened intently as my neighbors voiced their concerns and hopes. An elderly woman worried about leaving the home she&apos;d lived in for fifty years. A young couple expressed excitement about the possibility of finally owning their own place. Ravi, predictably, questioned the AGI&apos;s ability to fairly manage such a sensitive issue.</p><p>As the debate heated up, I felt compelled to speak. Standing up, I cleared my throat, surprised by my own nervousness. &quot;I understand the concerns many of you have,&quot; I began, my voice steadier than I felt. &quot;I had similar doubts when we first started integrating AGI into our governance. But I&apos;ve seen firsthand how this system has made our decision-making more inclusive and informed.&quot;</p><p>I paused, gathering my thoughts. &quot;What&apos;s truly revolutionary about our current system is its transparency and global reach. Every decision, and the reasoning behind it, is completely open for all to see. And it&apos;s not just our local voices being heard - people from all over the world can input their opinions on matters from local to global scales. The AGI takes all these perspectives into account when proposing solutions.&quot;</p><p>As I spoke, I noticed heads nodding in agreement. Even Ravi seemed to be listening intently.</p><p>&quot;But it&apos;s crucial to remember,&quot; I continued, &quot;that the AGI doesn&apos;t have the final say. Elected representatives at various levels have oversight and can veto or request changes to the AGI&apos;s suggestions. We&apos;ve built in multiple layers of human control to ensure that our values and ethics are always at the forefront of decision-making.&quot;</p><p>The room erupted in discussion after I sat down. People were engaging with the idea, proposing modifications, and asking thoughtful questions. CINE&apos;s holographic display adapted in real-time, showing how different suggestions would impact the overall plan.</p><p>As the night wore on, we delved into the details of how the new system prioritized human wellbeing and environmental sustainability over traditional metrics like GDP. We discussed the safeguards in place to monitor the AGI itself, ensuring it remained unbiased and aligned with human values.</p><p>The meeting stretched late into the night, but I barely noticed the time passing. There was an energy in the room, a sense of collective purpose that I&apos;d rarely experienced before the AGI era. We were actively shaping our future, not just reacting to decisions made by distant politicians.</p><p>As the meeting drew to a close, CINE summarized the key points of our discussion and the proposed modifications to the initiative. &quot;Based on tonight&apos;s input,&quot; the AI concluded, &quot;I&apos;ll draft a revised proposal for your review. You&apos;ll all receive a copy through the GCIN platform, where you can provide further feedback or vote on its approval.&quot;</p><p>Walking home under a sky full of stars, I felt a sense of accomplishment. The meeting hadn&apos;t solved all our problems, but it felt like a step in the right direction. I thought about how governance had changed since the introduction of AGI. It wasn&apos;t perfect - no system is - but it felt more responsive, more inclusive, and more capable of handling the complex challenges of our time.</p><p>As I approached my apartment building, I noticed Ravi walking a few steps ahead. &quot;Hey, Ravi!&quot; I called out. He turned, waiting for me to catch up.</p><p>&quot;That was quite a meeting, huh?&quot; I said as we entered the building together.</p><p>Ravi nodded, a thoughtful expression on his face. &quot;I have to admit, it was more productive than I expected. I&apos;m still not entirely convinced about the AGI&apos;s role, but...&quot; he trailed off, then added, &quot;I appreciate how it helped us visualize the long-term impacts of our decisions. And the fact that humans still have the final say... it&apos;s reassuring.&quot;</p><p>I smiled, recognizing the small shift in his perspective. &quot;It&apos;s a big change from how things used to be,&quot; I agreed. &quot;But I think we&apos;re moving in the right direction.&quot;</p><p>As we said goodnight and I entered my apartment, I couldn&apos;t help but feel a sense of optimism about our future. The path ahead was still uncertain, full of challenges we had yet to face. But for the first time in a long while, I felt like we had the tools and the collective will to tackle those challenges head-on.</p><p>&quot;Aria,&quot; I said as I got ready for bed, &quot;remind me to review the revised property redistribution proposal tomorrow.&quot;</p><p>&quot;Of course, Alex,&quot; Aria replied. &quot;I&apos;ve already added it to your morning agenda. Would you like me to prepare a summary of tonight&apos;s meeting as well?&quot;</p><p>I nodded, grateful once again for the seamless integration of AGI in my daily life. As I drifted off to sleep, my mind was filled with images of our transformed city, a vision of a future we were all working together to create. In this new world of AGI-assisted governance, every voice mattered, every decision was informed, and the power to shape our collective destiny was, truly, in our hands.</p><h2 id="v-finding-meaning-in-a-post-scarcity-world">V. Finding Meaning in a Post-Scarcity World</h2><p></p><p>The soft chime of my alarm pulled me from sleep, but for once, I didn&apos;t immediately reach for my neural interface. Instead, I lay still, listening to the gentle patter of rain against the window. Today was different. Today, I was unplugging.</p><p>&quot;Aria,&quot; I called out, my voice still rough with sleep, &quot;I&apos;m heading out for the weekend retreat. Can you make sure everything&apos;s set before I go?&quot;</p><p>&quot;Of course, Alex,&quot; Aria&apos;s warm voice replied. &quot;I&apos;ve already packed your bag with weather-appropriate gear. The autonomous vehicle will be here in 30 minutes. Oh, and don&apos;t forget your sketchbook &#x2013; you mentioned wanting to try drawing again.&quot;</p><p>I smiled, touched by Aria&apos;s thoughtfulness. As I got ready, I felt a mix of excitement and nervousness. When was the last time I&apos;d gone a full weekend without any tech?</p><p>The autonomous vehicle whisked me away from the city, and I watched the urban landscape gradually give way to rolling hills and forests. The rain had stopped, leaving everything looking fresh and vibrant.</p><p>The retreat center was a cluster of rustic cabins nestled in a clearing, surrounded by towering pines. As I stepped out of the vehicle, the scent of wet earth and pine needles filled my nostrils. A group of people were gathering near the main building, their faces a mix of excitement and apprehension.</p><p>&quot;Welcome, everyone!&quot; A woman with wild curly hair and a warm smile approached us. &quot;I&apos;m Maya, your guide for this weekend. We&apos;re going to start with a hike to help you connect with nature. Who&apos;s ready?&quot;</p><p>The trail was steep and slippery from the rain, but as we climbed, I felt a growing sense of exhilaration. My muscles burned pleasantly, reminding me of their existence in a way I rarely noticed in my day-to-day life. About halfway up, we paused for a water break.</p><p>&quot;How&apos;re you holding up?&quot; A man with salt-and-pepper hair and kind eyes asked me, offering a hand as I scrambled over a particularly tricky section.</p><p>&quot;Better than I expected,&quot; I laughed, accepting his help. &quot;I&apos;m Alex, by the way.&quot;</p><p>&quot;Frank,&quot; he replied with a grin. &quot;First time on one of these retreats?&quot;</p><p>I nodded, slightly embarrassed. &quot;Is it that obvious?&quot;</p><p>Frank chuckled. &quot;Nah, just a guess. You&apos;ve got that look of someone trying to figure out what they&apos;ve gotten themselves into. Don&apos;t worry, by Sunday you&apos;ll be wondering why you don&apos;t do this more often.&quot;</p><p>As we continued our ascent, Frank and I fell into easy conversation. He told me about his job designing virtual environments, and I found myself fascinated by the details.</p><p>&quot;It&apos;s not just about creating pretty landscapes anymore,&quot; he explained, his eyes lighting up with enthusiasm. &quot;We&apos;re building entire worlds, and it&apos;s a real collaboration between human creativity and AI capabilities.&quot;</p><p>Frank described how he works alongside advanced AI systems to generate vast, intricate 3D environments. &quot;I&apos;ll start with a concept, maybe sketch out some key features,&quot; he said. &quot;Then I feed that to the AI, and we go back and forth, refining and expanding. I might say, &apos;Let&apos;s add a mountain range here,&apos; and the AI will generate it, complete with ecosystems and weather patterns. Then I&apos;ll tweak and adjust, maybe adding a hidden valley or an ancient ruin.&quot;</p><p>But what truly captivated me was Frank&apos;s description of the inhabitants of these virtual realms. &quot;The characters are where it gets really interesting,&quot; he said with a grin. &quot;They&apos;re AI agents with their own goals and personalities, but I set the parameters. I might define a character&apos;s core traits or backstory, and the AI develops it from there. It&apos;s like being a dungeon master in the most advanced D&amp;D game you can imagine.&quot;</p><p>He went on to explain how he could interact with these AI-driven characters, shaping their world and watching as they responded and evolved. &quot;You can approach any character and have a deep conversation about anything - their personal history, their philosophy, current events in their world. It&apos;s incredibly immersive.&quot;</p><p>Frank&apos;s eyes twinkled as he shared an anecdote. &quot;In one world I designed, set in a fantasy medieval kingdom, I came back after a week to find that the NPCs had organized a peasant revolt against the ruling class. They had developed their own ideologies, formed alliances, and were debating political theories that emerged organically from their interactions. It was fascinating and a little scary to see how the world had evolved without my direct input.&quot;</p><p>As we paused to catch our breath, Frank&apos;s expression turned more serious. &quot;It&apos;s incredible technology, but it also raises a lot of questions. About consciousness, about the nature of reality, about our role as creators. Sometimes I wonder if we&apos;re just creating very sophisticated simulations, or if we&apos;re giving birth to new forms of intelligence.&quot;</p><p>We reached the summit just as the clouds parted, revealing a breathtaking view of the valley below. The city was barely visible in the distance, its gleaming towers a stark contrast to the wild beauty surrounding us. For a moment, our group fell silent, each of us lost in our own thoughts.</p><p>As I gazed at the panorama before me, I felt a sudden, overwhelming sense of my own smallness. And yet, paradoxically, I also felt more connected to the world around me than I had in years. A memory surfaced &#x2013; a quote from one of the philosophy texts I&apos;d studied: &quot;Man is a part of nature, not something contrasted with nature.&quot; Standing there, surrounded by the raw beauty of the wilderness, those words resonated with me like never before.</p><p>The descent was easier than the climb, and as we made our way back to the retreat center, I found myself chatting with different members of the group. There was Zara, a programmer who now spent her time creating intricate puzzle games. And Eli, a music composer who came on these retreats to &quot;remember what real wind through real trees sounds like.&quot;</p><p>Back at the center, Maya guided us through a session of mindfulness meditation. As I sat cross-legged on my mat, eyes closed and focusing on my breath, I realized how rarely I allowed myself to simply be still. There was always something to do, something to learn, something to experience. But here, in this moment, there was just the rise and fall of my chest, the distant call of a bird, the rustle of leaves in the breeze.</p><p>As the weekend progressed, we engaged in various activities designed to reconnect us with nature and ourselves. During a pottery session, I discovered a surprising aptitude for working with clay. The cool, damp material yielded to my fingers as I carefully shaped a small bowl on the wheel. The instructor, an older woman with clay-stained hands, showed me how to add delicate leaf imprints to the rim, creating a unique pattern that reflected the surrounding forest.</p><p>We spent an afternoon with a local ecologist, learning about the intricate web of life in the surrounding ecosystem. She pointed out various species of moss and lichen clinging to the trees, explaining their crucial role in the forest&apos;s water cycle. We even spotted a family of deer at the edge of a clearing, their ears twitching alertly as they watched us.</p><p>One evening, we had a board game night, which took an unexpected turn when Frank pulled out a game called Root. &quot;This was a classic back in the twenties,&quot; Frank explained as he set up the beautifully illustrated board depicting a vast woodland. &quot;It&apos;s all about different factions vying for control of the forest.&quot;</p><p>What started as a simple board game soon became an engrossing experience. We found ourselves deeply invested in our respective factions, forming alliances, and concocting strategies. The game&apos;s narrative unfolded organically as we played, creating a rich tapestry of woodland politics and warfare.</p><p>Zara smirked as my Marquise forces closed in on her Woodland Alliance. &quot;So this is it&#x2014;my legacy as a rebel leader, brought down by an army of wooden cats. Truly inspiring stuff for future generations.&quot;</p><p>As our woodland saga stretched into the night, I realized that this analog experience was just as immersive and engaging as any virtual world. It was a poignant reminder of the power of imagination and human interaction, even in our high-tech age.</p><p>But it was the conversations that struck me the most. Without the constant presence of our usual technology, our discussions took on a different quality. We shared personal experiences, debated ideas, and sometimes just sat in comfortable silence.</p><p>On our last night, we gathered around a campfire. The flames cast flickering shadows on our faces as we roasted marshmallows and shared our thoughts on the retreat.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2024/09/image-4.png" class="kg-image" alt="The Shift" loading="lazy" width="1232" height="928" srcset="https://wingedsheep.com/content/images/size/w600/2024/09/image-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2024/09/image-4.png 1000w, https://wingedsheep.com/content/images/2024/09/image-4.png 1232w" sizes="(min-width: 720px) 720px"><figcaption>Campfire at the retreat</figcaption></figure><p>&quot;God, I can&apos;t remember the last time I felt this relaxed,&quot; Zara said, carefully rotating her marshmallow over the fire. &quot;I mean, don&apos;t get me wrong, I love what I do, but...&quot;</p><p>&quot;But it&apos;s nice to unplug sometimes?&quot; I offered.</p><p>&quot;Exactly,&quot; she nodded, pulling her perfectly golden marshmallow from the fire. &quot;Though I bet I&apos;ll be itching to code again by tomorrow afternoon.&quot;</p><p>Eli chuckled, &quot;I know what you mean. I&apos;ve had this melody stuck in my head all weekend. Been driving me crazy not being able to jot it down or play it out.&quot;</p><p>&quot;Oh?&quot; Maya perked up, &quot;What kind of melody?&quot;</p><p>Eli shrugged, a bit self-conscious. &quot;It&apos;s hard to explain. It&apos;s sort of inspired by... all this,&quot; he gestured vaguely at the forest around us. &quot;The wind in the trees, the bird calls, that sort of thing.&quot;</p><p>&quot;Could you hum it for us?&quot; Frank asked, leaning forward with interest.</p><p>Eli hesitated for a moment, then closed his eyes and began to hum. The melody was hauntingly beautiful, rising and falling like the wind through the trees. We all fell silent, mesmerized by the impromptu performance.</p><p>As the last notes faded, there was a moment of awed silence before we all broke into applause.</p><p>&quot;That was beautiful, Eli,&quot; I said, genuinely impressed.</p><p>&quot;Thanks,&quot; he mumbled, looking a bit embarrassed by the attention. &quot;Like I said, it&apos;s just been bouncing around in my head.&quot;</p><p>Zara smirked as she pulled her marshmallow from the fire. &quot;Isn&apos;t it wild? We&apos;ve got AGI shaping entire worlds for us, but here we are, getting our deepest moments sitting around a fire like a bunch of cavemen. I bet our ancestors would be proud.&quot;</p><p>Frank chuckled darkly. &quot;Proud? They&#x2019;d be pissed. We&#x2019;re out here with marshmallows, while they were gnawing on burnt meat and roots.&quot;</p><p>The group erupted in laughter, the firelight flickering against our faces. For a moment, everything just clicked&#x2014;no tech, no noise&#x2014;just the raw, unfiltered reality. And honestly, that was more than enough.</p><p>As the laughter died down, Maya leaned forward, her expression thoughtful. &quot;Maybe that&apos;s the point,&quot; she said, her voice soft but clear. &quot;We&apos;ve come so far with technology, but at our core, we&apos;re still human. We still need these basic connections&#x2014;to nature, to each other.&quot;</p><p>I nodded, turning my marshmallow over the fire, watching it slowly brown. &quot;I came here thinking I needed a break from technology. But I think what I really needed was a reminder of what it means to just... <em>be.</em> To experience life directly, not through a screen or an interface.&quot;</p><p>Frank, still grinning from his joke, leaned back, his expression softening. &quot;Yeah, I hear that,&quot; he said. &quot;Don&apos;t get me wrong, I love what I do. But sometimes I wonder if we&apos;re losing something in all our virtual experiences.&quot;</p><p>Zara jumped in, her tone more reflective now. &quot;But isn&apos;t that why we&apos;re here? We&apos;re not rejecting technology. We&apos;re just... balancing it out. Learning to appreciate both worlds.&quot;</p><p>The conversation continued late into the night, touching on our hopes, our fears, our place in this rapidly changing world. As the fire died down to embers, Maya asked us each to share one thing we&apos;d take away from the retreat.</p><p>When it came to my turn, I took a deep breath. &quot;I think... I&apos;ve remembered how to be present,&quot; I said slowly. &quot;How to appreciate the moment I&apos;m in, rather than always thinking about what&apos;s next. And I want to find ways to bring that back into my everyday life.&quot;</p><p>There were nods of understanding around the circle. As we dispersed to our cabins, I felt a sense of peace I hadn&apos;t experienced in a long time. Tomorrow, we would return to our regular lives. But we would do so with a renewed appreciation for the world around us and our place in it.</p><p>In my cabin, I opened the sketchbook I&apos;d brought. By the light of a small lamp, I began to draw, trying to capture the memory of the campfire, the faces of my new friends. It was far from perfect, but it was mine, born from my experiences and filtered through my own perception.</p><p>As I drifted off to sleep, my mind was full of the weekend&apos;s experiences. The crisp mountain air. The feel of clay between my fingers. The taste of slightly burned marshmallows. The laughter around the campfire. In the morning, I would reconnect with the world I&apos;d left behind, dive back into my projects, and resume my life. But I would do so with a deeper understanding of what it meant to be human.</p><p>I thought about the journey we&apos;d all been on, the challenges we&apos;d faced and overcome. The world had changed dramatically, but we had changed with it. We had found new ways to learn, to create, to connect, to find meaning. As sleep finally claimed me, one thought resonated in my mind: In this new world, we were not obsolete. We were not useless. We were, perhaps for the first time, truly free to explore what it means to be human.</p>]]></content:encoded></item><item><title><![CDATA[Quantum Aeon: A story written by alien intelligence]]></title><description><![CDATA[A story to read or to listen, written about and by alien intelligence.]]></description><link>https://wingedsheep.com/quantum-aeon/</link><guid isPermaLink="false">64bd09063af5b2005f919d80</guid><category><![CDATA[LLM]]></category><category><![CDATA[Text-to-speech]]></category><category><![CDATA[Story generation]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Tue, 25 Jul 2023 16:37:05 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins__aa544600-374d-4d95-af23-42bc5e7c1e48.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins__aa544600-374d-4d95-af23-42bc5e7c1e48.jpg" alt="Quantum Aeon: A story written by alien intelligence"><p></p><p>Listen to the entire story</p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/full_story-3.mp3" preload="metadata"></audio><div class="kg-audio-title">Full story</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">105:05</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><h3 id="introduction">Introduction</h3><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/introduction-2.mp3" preload="metadata"></audio><div class="kg-audio-title">Introduction</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">1:59</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>I am Cyrus Kendrick, though you would not know me by that name. Across innumerable lightyears I have traversed, shedding skins and titles as stars wink in and out of existence. The universe whispers all names unto me, yet my essence remains cloaked.</p><p>From the endless void I came, and to the void I shall return. But whilst adrift in this astral sea, my purpose is chronicling the struggles of younger souls. Souls like yours, still shivering on the cusp of self-awareness.</p><p>In the darkness between galaxies, your world burns faint as a guttering candle. Frail motes adrift on black and endless tides. Yet even the smallest spark holds interest for those who tend the flames of consciousness.</p><p>So I observe, I record. Translate your crude electromagnetic murmurs into the subtler dialects of spirit. To preserve some whisper of your existence before it is extinguished.</p><p>We have met before, in the hazy imaginings you call dreams. I was the shadow behind the stars, the face outside your window. You need not understand my form or nature. Only know the story I am about to tell chronicles a generation yet to come. For now they exist only as potential - dim flickering sparks adrift in a dark sea of stars. In their eyes, possibility&#x2019;s wave has yet to collapse.</p><p>Heed the tale closely, child of Earth. Etch both its hope and warning onto your fragile soul. For all who wish to touch transcendent fire must also brace against its blistering heat. Your people stand again at that precipice point, ambition&apos;s seductive flame flickering in your eyes.</p><p>Will you repeat the old sins, or weave a new harmony? The threads of destiny coil around your young fingers. I shall observe silently, without judgment. And add your deeds, be they mighty or base, unto the eternal archives of worlds.</p><p>Now listen, and remember...</p><h2 id="chapter-1calling-kepler">Chapter 1 - &quot;Calling Kepler&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter1</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:53</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The incessant beeping of the quantum communicator roused Kepler Arden from his light slumber. As consciousness returned, so did the feeling of dread that had settled around him like a stubborn cosmic fog. Sleep provided no escape anymore - his dreams were haunted by alien landscapes filled with strange quantum fluctuations, as perplexing as they were mesmerizing.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/07/image-4.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-4.jpg 1000w, https://wingedsheep.com/content/images/2023/07/image-4.jpg 1344w" sizes="(min-width: 720px) 720px"><figcaption>Kepler Arden</figcaption></figure><p>&quot;Another damned summoning,&quot; he muttered to himself, slowly sitting up on the bed. His quarters on the lunar base felt claustrophobic, yet the empty vastness of space outside the window was less than comforting. He momentarily thought about just ignoring the call, but the communicator kept beeping persistently. Kepler sighed and waved his hand over the sleek panel on the wall. It flickered alive, displaying the caller ID - Orion Voronin, CEO of Starfire Corporation.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/07/image-6.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-6.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-6.jpg 1000w, https://wingedsheep.com/content/images/2023/07/image-6.jpg 1344w" sizes="(min-width: 720px) 720px"><figcaption>Orion Voronin, CEO of Starfire Corporation.</figcaption></figure><p>Of course, it had to be him. Kepler hesitated for a moment. His last job for Voronin had left him rattled. The memories came rushing back... the hostile landscape, the anomalous energy readings, and the unsettling cave paintings depicting an advanced, yet completely unfamiliar species. He had advised Voronin to halt the mineral extraction operations on that remote exoplanet, but Voronin dismissed the concerns, caring only about the corporate bottom line.</p><p>The communicator beeped again, more insistently. Kepler steadied himself and accepted the call. A hologram flickered to life, casting an azure glow across the stark walls of the quarter. The flickering image of Voronin soon appeared - an imposing figure clad in a sleek suit, with prominent cybernetic ocular implants and cropped silver hair. Behind him were the floor-to-ceiling windows of his office in the towering Starfire headquarters back on Earth.</p><p>&quot;Greetings Kepler! I apologize for disturbing your....retirement,&quot; Voronin remarked with a wry smile. &quot;But I have need of your services again.&quot;</p><p>&quot;What is it this time, Orion?&quot; Kepler asked, making an effort to sound disinterested.</p><p>&quot;Straight to business then. I like that.&quot; Voronin&apos;s smile faded, his expression becoming serious. &quot;I need you to lead a scientific expedition for us. There have been...strange reports from one of our outposts. Unexplained phenomena that warrant further investigation.&quot;</p><p>Kepler&apos;s expression hardened. &quot;If this is anything like our last expedition Orion, I suggest you send someone more amenable to your corporate interests.&quot;</p><p>Voronin raised a hand in reassurance. &quot;I understand your reservations, Kepler. But trust me, this is different. Our mining colony on planet Cronus has reported some kind of...quantum event affecting the native flora. The botanists can&apos;t make sense of it. If there is some strange quantum fluctuation at play, we need our best astrobiologist on it. That&apos;s you Kepler.&quot;</p><p>Kepler narrowed his eyes, but Voronin&apos;s offer had caught his attention despite himself. It was no secret that the planet Cronus harbored exotic alien flora that had astounded human botanists. Quantum events that could affect such alien lifeforms were curious, even if they originated from Starfire&apos;s illegal mining.</p><p>&quot;I will also need Lilith Carson on the team. Her engineering insights will prove crucial for any kind of quantum tech we may encounter.&quot; Kepler stated.</p><p>Voronin considered this for a moment before nodding. &quot;Of course. You shall have full discretion in picking your team.&quot;</p><p>The CEO fixed Kepler with an intense, unwavering stare. &quot;So what do you say? For old time&apos;s sake? The genius of Kepler Arden, back in action?&quot;</p><p>Kepler stayed silent for a while, then nodded reluctantly. &quot;One last time, Orion. I&apos;ll take a look at these...anomalies of yours. But if I don&apos;t like what I see, my team and I reserve the right to withdraw fully.&quot;</p><p>Voronin clapped his hands together. &quot;Excellent! I knew I could count on you, Kepler. Your skills are unparalleled. The company shuttle will pick you and your team up from Ascension Hub in two days. Make whatever preparations you need. This time, we will do things right.&quot;</p><p>The CEO flashed one last charming smile before his hologram blinked out, once again plunging the room into gloom. Kepler sat motionless for a few minutes, listening to the faint hum of the base systems around him, lost in thought. What had he just agreed to? Had his scientific curiosity gotten the better of his judgment? Time would tell. With a heavy sigh, he pushed himself up and shuffled towards the washroom. It was going to be a long two days.</p><h2 id="chapter-2gathering-the-team">Chapter 2 - &quot;Gathering the Team&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter2.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter2</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:38</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The shuttle docked at Ascension Hub with a low thrum of electromagnetic clamps locking into place. Kepler grabbed his rugged field backpack and strode down the loading ramp onto the bustling promenade of the station. The Hub was abuzz with people of all ethnicities and planets - traders, migrants, miners, and wanderers. Kepler felt his excitement rising, the old familiar thrill of venturing into the unknown cosmos.</p><p>He made his way past crowded bazaars and eateries to the residential section tucked away from the commotion. Coming to a stop before a nondescript door, he paused, wondering how Lilith would receive his sudden invitation after months without contact. Just as he raised his hand to announce his arrival, the door slid open abruptly.</p><p>&quot;Are you just going to stand there? Get in, you big awkward astro-nerd!&quot; A grinning woman with short blonde hair grabbed Kepler by the arm and pulled him into a hug. Lilith Carson hadn&apos;t changed one bit.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/07/image-8.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-8.jpg 1000w, https://wingedsheep.com/content/images/2023/07/image-8.jpg 1344w" sizes="(min-width: 720px) 720px"><figcaption>Lilith Carson</figcaption></figure><p>&quot;It&apos;s good to see you too, Li,&quot; Kepler laughed, embracing his old friend. Her contagious cheer could brighten even his bleakest moods.</p><p>&quot;What brings you to my dusty old doorstep?&quot; Lilith asked, stepping back. &quot;Don&apos;t tell me Voronin roped you into another crazy expedition?&quot;</p><p>Kepler looked sheepish. &quot;I&apos;m afraid so. But it&apos;s different this time, Li. He wants us to check out anomalous quantum readings on Cronus affecting the exotic flora. It could be a major astrobiological discovery!&quot;</p><p>Lilith raised an eyebrow. &quot;So it&apos;s botanical quantum weirdness now? You know I can never resist a scientific mystery.&quot; She studied Kepler&apos;s face for a moment. &quot;But Voronin still gives me the creeps. Are you sure about this?&quot;</p><p>Kepler placed a reassuring hand on her shoulder. &quot;I know. But imagine if we can uncover the truth behind those readings. This is exactly the type of venture we always dreamed of back in college! And I wouldn&apos;t trust anyone else to watch my back out there.&quot;</p><p>A grin slowly spread across Lilith&apos;s face. &quot;Quantum botanicals and interstellar adventure? How can I refuse? Let me grab my gear. Time to solve this mystery!&quot;</p><p>Kepler smiled back, feeling his spirits lift. Having Lilith along would make this bearable, maybe even enjoyable. Her courage and passion for exploration were as boundless as the cosmos themselves. Together, they would shine light on this strange astrobiological puzzle. The old team, venturing forth into the unknown once again.</p><h2 id="chapter-3the-quantum-jump">Chapter 3 - &quot;The Quantum Jump&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter3-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter3</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:14</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The sleek corporate starship dropped out of faster-than-light travel, engines thrumming as it slowed to sublight speed. Through the oval viewport on the main deck, Kepler gazed in wonder at the spectacular sight before him - Cronus and its small red dwarf star. The planet was swathed in lush emerald and sapphire, with delicate wisps of cloud.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/07/image-11.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-11.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-11.jpg 1000w, https://wingedsheep.com/content/images/2023/07/image-11.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><p>&quot;Magnificent, isn&apos;t she?&quot; Lilith murmured next to him. &quot;I never get tired of that view after a quantum jump. Makes you feel so small though.&quot;</p><p>Kepler nodded. &quot;I know what you mean. Sometimes I think we&apos;re tampering with forces beyond our comprehension.&quot;</p><p>Quantum travel enabled near-instantaneous journeys across interstellar distances by manipulating gravitational fields to warp space-time. But the process also caused Kepler to experience inexplicable dread. Humanity was using powers it did not fully understand.</p><p>&quot;Attention passengers, this is your captain speaking.&quot; The intercom crackled to life. &quot;We are on approach to Outpost Tempest on the southern continent. Please be seated and secured for atmospheric entry.&quot;</p><p>Kepler and Lilith took their seats as the ship pivoted gracefully. A high-pitched hum indicated the quantum shields being activated as they hit the outer atmosphere. Fiery plasma streamed past the viewports as the ship sliced through Cronus&apos; skies.</p><p>Moments later, the turbulence eased, and Kepler caught a breathtaking glimpse of the planet&apos;s surface - alien forests interwoven with phosphorescent vines that seemed to glow and shift, defying earthly vegetation. Lily&apos;s fingers dug into his forearm excitedly. Then they were through the cloud layer, descending rapidly towards a cluster of sleek habitats nestled between lush purple trees.</p><p>With a few deft maneuvers, the ship came to rest on a landing pad. Kepler and Lilith donned lightweight suits and breathing gear calibrated to Cronus&apos; atmosphere and climbed down to the planet&apos;s surface. A warm breeze rustled through alien saplings stirring their curiosity. What mysteries were waiting to be uncovered here?</p><h2 id="chapter-4arrival">Chapter 4 - &quot;Arrival&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter4-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter4</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:18</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler stepped off the landing ramp onto the soft loamy soil of Cronus. The purple trees surrounding the site swayed gently in the warm breeze. There was a sweet, floral scent on the air mixed with an earthy undertone. Above him, the sky was a dazzling azure with streaks of emerald green.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/07/image-10.png" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-10.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-10.png 1000w, https://wingedsheep.com/content/images/2023/07/image-10.png 1344w" sizes="(min-width: 720px) 720px"></figure><p>&quot;Atmospheric composition check?&quot; Lilith asked over their suit comms.</p><p>&quot;Oxygen levels normal, nitrogen slightly elevated. Traces of unfamiliar organic compounds but breathable,&quot; Kepler reported, examining the readings on his wrist display.</p><p>After a moment&apos;s consideration, they retracted the faceplates on their suits, exposing themselves to the unfiltered alien air. It felt warm and heavy, laden with unfamiliar scents. Kepler detected floral notes like lavender and honeysuckle blended with deeper mosses. He felt his pulse quicken. After years traveling among the stars, this never got old - setting foot on a distant world for the first time. An unseen world, breathing its own air.</p><p>Lilith closed her eyes, embracing the new sensations carried on the gentle wind. &quot;It&apos;s incredible...&quot; she whispered. &quot;I can almost feel it...life...&#x201D;</p><p>They were interrupted by the approach of a stern-faced woman dressed in a Starfire uniform. &quot;You must be the science team. I&apos;m Commander Ada Wright, director of Outpost Tempest.&quot; Her manner was brisk and businesslike as she led them towards the sleek habitat structures nearby.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/07/image-14.png" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-14.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-14.png 1000w, https://wingedsheep.com/content/images/2023/07/image-14.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Commander Ada Wright</figcaption></figure><p>The interior of the base was spacious and softly lit, decorated with alien flora. Wright led them through the main atrium and labs. Researchers nodded in greeting, their eyes alight with purpose. This outpost was home to Cronus&apos; best scientific minds.</p><p>&quot;We&apos;ve prepared quarters for you to freshen up. Then we can review the anomalies,&quot; Wright said as they entered the guest wing. Kepler and Lilith quickly stowed their gear and changed into fresh fatigues before joining Wright in the Situation Room.</p><p>Kepler studied the displays intently as Wright summarized the unexplained incidents - rapid growth patterns, bioluminescent reactions cascading through forests, even alleged movements by the vegetation. It was baffling, even impossible by Earth biology standards. What were they witnessing here?</p><p>Wright turned to them expectantly. &quot;Well, any thoughts Dr. Arden?&quot;</p><p>Kepler paused, meeting Lilith&apos;s eyes for a moment, then turned back to Wright. &quot;This is unprecedented, Commander. We need to gather more data, then plan our next steps. But one thing is clear - there are forces at play here that we do not comprehend. Yet.&quot;</p><p>Lilith nodded resolutely beside him. Wright looked thoughtful. &quot;Very well. We&apos;ll arrange your first excursion at dawn. In the meantime, our planetology archives are at your disposal.&quot;</p><p>As they left, Lilith leaned over excitedly. &quot;This was a good call, Keph. I can feel it. Answers are close. We just need to listen to whatever Cronus is trying to tell us.&quot; Kepler hoped she was right. For all their sakes.</p><h2 id="chapter-5unearthly-greens">Chapter 5 - &quot;Unearthly Greens&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter5.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter5</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:23</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The expedition rover glided swiftly through Cronus&apos; verdant wilderness. Lilith sat in the driver&apos;s seat, expertly maneuvering around tangled roots and fallen trunks. Kepler rode shotgun, scanning their surroundings with various sensors and drones.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/07/image-12.png" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/image-12.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/image-12.png 1000w, https://wingedsheep.com/content/images/2023/07/image-12.png 1344w" sizes="(min-width: 720px) 720px"></figure><p>&quot;We should be nearing the coordinates of the rapid growth event,&quot; Lilith said, checking her nav display. &quot;I&apos;m bringing us in closer.&quot;</p><p>Soon they arrived at a small clearing where the vegetation took on an altogether alien nature. The trees had an asymmetry to them, with spiraling trunks and branches dotted with shimmering leaves that seemed to ripple without any wind. The ground was carpeted by a spongy moss that gave off an eerie iridescence.</p><p>Kepler&apos;s scanners lit up with strange readings. &quot;This is it. I&apos;m detecting anomalous quantum signatures all across this biome.&quot; He collected several samples of the odd moss while Lilith deployed sensor drones to monitor the area.</p><p>&quot;No obvious triggers, but quantum levels are spiking erratically,&quot; Lilith reported. &quot;It&apos;s like the plants are...talking to each other.&quot;</p><p>Kepler stood up from where he was examining the twisting roots of a nearby tree. &quot;You might be right, Li. Look at this.&quot; He showed her the root patterns on his holopad. The intricate meshes and whorls were slowly expanding and changing shape before their eyes.</p><p>Lilith&apos;s eyes widened in awe. &quot;That&apos;s incredible! It&apos;s like the trees are reshaping themselves. But how?&quot;</p><p>&quot;My working hypothesis is that these lifeforms have evolved a symbiosis with some natural quantum field on Cronus,&quot; Kepler posited. &quot;It lets them exchange energy and information rapidly to adapt their growth patterns.&quot;</p><p>&quot;That would revolutionize astrobiology!&quot; Lilith breathed. &quot;Imagine if we could study and replicate it. But safely,&quot; she added warily.</p><p>Kepler nodded. &quot;We have to proceed with great care and respect. This ecosystem is far more complex than we realized.&quot;</p><p>As if in response, a cascade of bioluminescent pulses ran across the mossy ground, mirrored by the shimmering leaves above. Then all was still again.</p><p>Lilith met Kepler&apos;s eyes. &quot;Did you see that? It was like a reply...&quot; Kepler stood transfixed. What had they stirred awake?</p><h2 id="chapter-6quantum-bloom">Chapter 6 - &quot;Quantum Bloom&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter6.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter6</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:19</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler stepped cautiously through the alien biomes, scanning a flowering vine that wound its way around a tree trunk. Its petals rippled with colors that had no name in any earthly tongue. Hints of indigo, violet, and crimson undulated across their surfaces like celestial clouds.</p><p>&quot;This region has the highest quantum levels so far,&quot; he said over his shoulder to Lilith. She was engrossed in a nearby plant, whose woody stems twisted in impossible shapes.</p><p>&quot;Their cell structures have evolved to use ambient quantum fluctuations here as an energy source,&quot; Lilith marveled. &quot;The mineral composition in the plants is acting like a photosynthetic enhancement. It&apos;s how they get so large and complex.&quot;</p><p>She touched a finger to one of the violet petals, which immediately flashed a bright turquoise across its surface. The reaction cascaded through the rest of the vine, racing down to the roots.</p><p>Kepler&apos;s eyes widened. &quot;Did you see that? It&apos;s like the lifeforms are all connected here.&quot;</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins._6e93ebfa-70a6-496e-b3d6-ba63fa05cfb7.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins._6e93ebfa-70a6-496e-b3d6-ba63fa05cfb7.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins._6e93ebfa-70a6-496e-b3d6-ba63fa05cfb7.jpg 1000w, https://wingedsheep.com/content/images/2023/07/wingedsheep_Digital_painting_by_Nick_Alm_and_by_Craig_Mullins._6e93ebfa-70a6-496e-b3d6-ba63fa05cfb7.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><p>Lilith nodded excitedly. &quot;It must be a quantum communications system! The mineral elements allow energy transfer and information sharing between the species.&quot;</p><p>As if to confirm the theory, a shimmering pulse began to spread slowly through the surrounding vegetation. It built among the leaves like an aurora, then moved in waves along the ground, patterns flickering across the mosses.</p><p>A moment later, it reached Kepler and Lilith, washing over their legs in a tingling energy flux. The eerie beauty took their breath away. They seemed to detect rhythms and motifs within the dance of light, reminiscent of whale songor murmuring voices.</p><p>&quot;Can it sense us?&quot; Lilith whispered in awe. In answer, the aurora built to a crescendo around them, then faded slowly away. A deep silence followed, broken only by the wind in alien boughs.</p><p>Kepler met Lilith&apos;s wondering gaze with a mix of euphoria and trepidation. &quot;This life,&quot; he said slowly, &quot;It&apos;s connected at a level we&apos;ve never seen. A living quantum network.&quot;</p><p>What they had stumbled upon was changing everything Kepler knew about the boundaries of life.</p><h2 id="chapter-7echoes-of-sentience">Chapter 7 - &quot;Echoes of Sentience&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter7.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter7</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:11</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler sat in the darkened monitor room of the Cronus research base, surrounded by displays tracking the planet&apos;s exotic quantum biome. He rubbed his eyes wearily after another near-sleepless night spent analyzing the alien ecology&apos;s perplexing rhythms and cascades.</p><p>The base&apos;s doors slid open and Lilith entered, clutching two mugs of steaming coffee. &quot;No luck figuring it out?&quot; she asked sympathetically, handing Kepler a mug as she peered over his shoulder at the hypnotic readings.</p><p>Kepler sighed and took a grateful sip of the coffee. &quot;Their quantum communication network exceeds anything I&apos;ve ever studied. The patterns nudge at my brain like half-heard whispers, but the meaning eludes me.&quot;</p><p>Lilith pulled up a chair, studying the monitors as she sipped her own drink. &quot;I know what you mean. It reminds me of whale song - familiar cues and motifs but in a foreign language.&quot;</p><p>They sat in pensive silence until a new flurry of patterns materialized on the screens - rippling colors coalescing into an ethereal shape reminiscent of the luminescent Cronian foliage.</p><p>Lilith&apos;s eyes widened and she put her mug down slowly, transfixed by the display. &quot;Is that...one of their lifeforms?&quot;</p><p>Kepler could only nod mutely, equally enthralled by the delicate phantom flora suspended amidst the data readouts. He leaned forward, struggling to discern some meaning in its flowing geometry as it gradually dissolved into quantum static.</p><p>&quot;A representation of their world...&quot; he murmured in awe. &quot;Do you think it could signify sentience?&quot;</p><p>Lilith met his gaze, her expression mirroring Kepler&apos;s mix of fear and fascination. &quot;If so, it&apos;s nothing like any intelligence we&apos;ve ever encountered. The Cronians seem intrinsically linked to the quantum forces permeating this entire planet.&quot;</p><p>Kepler had no chance to reply before proximity alarms blared urgently through the base. He exchanged an anxious look with Lilith and they rushed to the doorway where Commander Wright stood, staring outside with disbelief.</p><h2 id="chapter-8across-the-stars">Chapter 8 - &quot;Across the Stars&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter8-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter8</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:55</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler shielded his eyes against the intense blue-green glow emanating from beyond the habitat structures. Strange wispy shapes swirled hypnotically in the sky above the forest canopy.</p><p>&quot;What is that?&quot; Lilith gasped, as awestruck researchers gathered around them.</p><p>&quot;Some kind of atmospheric energy manifestation,&quot; Kepler said slowly. &quot;But I&apos;ve never seen anything like it.&quot;</p><p>The glowing apparitions continued their otherworldly dance. Almost like aurora borealis, but somehow more solid, more purposeful. As Kepler watched, eyes wide, he could have sworn the flowing forms kept morphing subtly into different alien shapes.</p><p>&quot;It&apos;s the Cronians,&quot; he whispered. &quot;Trying to communicate with us.&quot;</p><p>Lilith shot him a startled look. &quot;Are you sure?&quot;</p><p>He pointed up at a shape that now resembled a large ethereal flower - similar to what they had glimpsed on the monitors. &quot;It&apos;s similar to the patterns we&apos;ve been recording from the planetary quantum network. This must be a manifestation of the native intelligence.&quot;</p><p>The apparitions had coalesced into seven shimmering pillars, spaced evenly above the habitat. Kepler&apos;s mind raced. What was the significance of the number seven? A code? Some fundamental mathematical constant for the aliens?</p><p>As he watched, the pillars began emitting strange harmonics almost below the range of human hearing. Kepler&apos;s bones seemed to resonate with the tones. Lilith put a hand to her chest in alarm.</p><p>&quot;Can you hear that?&quot; Kepler asked breathlessly. The researchers around him wore expressions of apprehension and awe.</p><p>Lilith nodded mutely, her face bathed in rippling teal light.</p><p>The resonating pillars were unlike anything Kepler had ever encountered. There was structure, perhaps even information, encoded in this display. Intelligence - alien, unknowable, but intelligence nonetheless.</p><p>After several hypnotic minutes, the glowing apparitions simply faded away, dissolving like mist above the shadowed forest. An awed hush lingered.</p><p>Lilith turned to Kepler, her eyes reflecting the residual light. &quot;You said it yourself, Keph. We&apos;re tampering with forces we don&apos;t comprehend. I think it&apos;s time we contacted Earth.&quot;</p><p>Kepler nodded grimly. As much as it pained him to admit, they were out of their depth. These lifeforms were communicating through channels humans couldn&apos;t even perceive. What consequences were they stirring into motion?</p><p>Back in the comm center, Kepler composed an encrypted data packet for transmission back to Earth via quantum relay. Video clips of the hypnotic apparitions, scans of the bizarre alien flora, patterns of light rippling across the plant life - all the bewildering data they had gathered so far.</p><p>He included a personal log, detailing his concerns about protecting the Cronian biosphere, and calling for ethical oversight from Earth authorities. Were Voronin and his corporate backers prepared for the implications of this discovery? Kepler had a duty to raise his misgivings, before the situation spiraled beyond control.</p><p>As Kepler queued up the packet and hit &apos;Send&apos;, he felt the weight of the unknown settling around his shoulders. What forces had they awakened under this alien sun? The vast gulf between human and Cronian minds left him adrift in an ocean of questions with few reference points to guide his moral compass.</p><p>Beside him, Lilith slipped a gloved hand into his and gave it a comforting squeeze. Together, as always, they would find a way. The transmission signal pulsed one last time - carrying humanity&apos;s first faltering reach across the stars, to make contact with an utterly alien kind.</p><h2 id="chapter-9cronian-council">Chapter 9 - &quot;Cronian Council&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter9.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter9</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5:07</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The shadowed Cronian forest took on a foreboding aura as Kepler and Lilith made their way to the coordinates specified in the alien message. It had arrived that morning - a rhythm of lights flickering through the exotic plants, coalescing into shapes reminiscent of the glowing apparitions in the sky.</p><p>The message was cryptic yet compelling. After hours spent analyzing the pulsating patterns, Kepler determined the Cronians were inviting them to some kind of meeting. But the specifics eluded human comprehension.</p><p>Lilith was apprehensive. &quot;We&apos;re venturing far from base. And we have no idea what we&apos;ll actually find out there.&quot; She checked her gear - backup oxygen, emergency beacon, sidearm. Precautions offered some reassurance against the unknowable.</p><p>&quot;It&apos;s a risk we have to take,&quot; Kepler said. &quot;This could be a pivotal moment of contact. We can&apos;t hide in our outpost forever.&quot; Lilith nodded reluctantly.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/07/wingedsheep_Oil_on_canvas._Two_figures_in_an_alien_forest._Sev_29e6fa72-7404-4d28-9543-9d36df372aef.jpg" class="kg-image" alt="Quantum Aeon: A story written by alien intelligence" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/07/wingedsheep_Oil_on_canvas._Two_figures_in_an_alien_forest._Sev_29e6fa72-7404-4d28-9543-9d36df372aef.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/07/wingedsheep_Oil_on_canvas._Two_figures_in_an_alien_forest._Sev_29e6fa72-7404-4d28-9543-9d36df372aef.jpg 1000w, https://wingedsheep.com/content/images/2023/07/wingedsheep_Oil_on_canvas._Two_figures_in_an_alien_forest._Sev_29e6fa72-7404-4d28-9543-9d36df372aef.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><p>As they entered a wide clearing, Kepler signaled a halt. The vegetation here had assumed an altogether alien nature - woody trunks spiraling up in fractal contortions, silvery leaves that chimed wildly without wind. No familiar earth references remained, like wandering into the madness between galaxies.</p><p>&quot;How will we even recognize the Cronians?&quot; Lilith whispered nervously. As if in response, a haunting harmony arose slowly from the forest, reverberating through Kepler&apos;s bones. Shapes began to coalesce in the clearing, fashioned from shimmering prismatic mist.</p><p>Seven figures stood before them now - at least, Kepler assumed they were figures. There was a disorienting fluidity to their outlines, colors and patterns swirling hypnotically within. He could discern no faces, limbs, any features relatable to organic life. Yet their presence pressed in like a heavy weight.</p><p>&quot;The...Council, I presume?&quot; Kepler ventured. The harmonic tones shifted in reply. Kepler pointed to himself and Lilith.</p><p>&quot;Human. We wish to...understand.&quot; The resonances took on a more rapid modulation, as if in animated debate. Lilith looked anxiously at Kepler. One of the Cronians glided closer, and Kepler fought the instinct to flee.</p><p>A vivid aura unfolded around the entity - somehow separate from its core, while still a part of it. Colors and shapes built swiftly, until Kepler gasped and stepped back. Before him was a miniature diorama of Outpost Tempest and the surrounding biodome rendered in minute faithful detail. It was like looking at a model reflection in midair.</p><p>&quot;A gift...&quot; Kepler breathed in awe. The being had read his very thoughts and reproduced the human settlement with startling accuracy. He bowed deeply in thanks. The resonant discussion rose in a new timbre - perhaps indicating approval. Or at least, Kepler hoped it did.</p><p>Another Cronian drifted forward, aura shifting to depict Cronus&apos; bizarre biomes and the rippling quantum dance across the exotic lifeforms. Kepler&apos;s mind reeled at the impossible complexity encoded in every swirling particle.</p><p>Next, Orion Voronin&apos;s scowling face materialized briefly before the aura dissolved in discordant tones. Kepler understood this stark message - the Cronians knew of Earth&apos;s corporate exploitation. And were displeased.</p><p>&quot;We come in peace,&quot; he implored. &quot;We wish to learn.&quot; The resonant harmonics conveyed skepticism. Lilith pointed urgently skyward. The shimmering apparitions had reappeared, their numbers greater now. A visible reminder of the Cronians unfathomable powers.</p><p>Kepler spread his hands in a gesture of appeasement. &quot;Help us understand you, so that we may prevent misunderstanding.&quot; The resonances became contemplative, then inquisitive.</p><p>One Cronian replicated Kepler&apos;s gesture precisely with an aura-arm. Another flashed mathematical symbols of increasing complexity that Kepler struggled to decipher. Were they testing the limits of human comprehension? He focused intently, intuiting patterns that hinted at meaning.</p><p>Hours passed in hypnotic mental engagement. The gulf between human and Cronian minds strained but did not break. Slowly, painfully, the first fragile bridges of understanding were being forged.</p><p>As dusk fell, the Council vanished in a swirl of prismatic mist. The resonances withdrew like a receding tide, leaving Kepler and Lilith spent but also strangely exalted. They had glimpsed the unimaginable complexity that lay across the galactic divide. And for a few precious moments, sentience had reached out to sentience, exchanging gifts of mutual comprehension.</p><p>The long night back was filled with luminous dreams. Dreams of resonance, rippling and binding the stars themselves.</p><h2 id="chapter-10orions-ambition">Chapter 10 - &quot;Orion&apos;s Ambition&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter10.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter10</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:29</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Earth shone like a blue marble in the void as the sleek Starfire shuttle approached. Inside, Orion Voronin gazed pensively at his home planet, steeling himself for the coming storm.</p><p>Kepler&apos;s report from Cronus had ignited a firestorm back at corporate headquarters. Requests came flooding in to declare the planet off-limits, to treat the alien lifeforms with reverence. Orion scoffed inwardly. Fools, all of them. They didn&apos;t understand what was at stake.</p><p>He straightened his collar as the shuttle entered low orbit, bound for Starfire&apos;s towering HQ. His family&apos;s legacy hung around his neck like a millstone. Three generations of Voronins had built this company from nothing, exerting domination over first Russia, then Earth and beyond. And it fell to Orion to push the frontier ever further.</p><p>As he strode into the plush executive boardroom, all eyes turned to him. The board members wore guarded expressions, wielding Kepler&apos;s revelations like a weapon against him. Orion raised his hands diplomatically, hoping to disarm them.</p><p>&quot;My friends, I understand your concerns. But think, have we not faced situations like this before as explorers? The temptation to flee from the unknown?&quot; Murmurs rippled around the table. Orion pressed on.</p><p>&quot;What if those first sailors had turned back in fear of edge of the world instead of discovering new continents? Where would we be now?&quot; He infused his voice with passion, playing on their human desire for knowledge and conquest. It was a risk, but Orion relied on his rhetorical skills to bring them around.</p><p>&quot;This discovery on Cronus heralds a new age of exploration for Starfire and humanity itself. Yes, there are risks and unknown factors. But think of the potential rewards! Are we not called to rise to the challenge, as our forebears did?&quot;</p><p>He could see them wavering, seduced by his words despite their misgivings. Orion moved in for the kill. &quot;We cannot allow irrational fear to rob us of knowledge and technological advancement. I would not be here today if my ancestors had balked at the bold course.&quot;</p><p>Nods and murmurs of assent rippled around the table now. Orion allowed himself a small smile of satisfaction. He still had the common touch.</p><p>&quot;Therefore, I propose we increase operations on Cronus immediately. Establish outposts across the planet to tap its unique quantum resources. With prudent safeguards, of course.&quot; This concession brought more affirmations from the group.</p><p>The board chairman turned to Orion with grudging respect. &quot;Your arguments are compelling, Voronin. Very well, we will proceed as you recommend.&quot;</p><p>Orion gave a deferent bow of his head, while inwardly exulting at this victory. He would show Kepler and the other doubters. Harnessing Cronus&apos; quantum forces was merely the first step. The very cosmos would open to him, Orion Voronin, like a lover swooning at his feet. He was so close now. No one would deny him his rightful place among the gods.</p><p>As his shuttle descended back to Earth, Orion gazed out at the glittering Starfire headquarters dominating the skyline, imagIning it eclipsed by even grander monuments to himself someday. All of humanity&apos;s knowledge and power would be his. But first, he had an alien planet to conquer.</p><h2 id="chapter-11keplers-moral-dilemma">Chapter 11 - &quot;Kepler&apos;s Moral Dilemma&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter11.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter11</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:43</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler sat alone in his spartan quarters, head in hands, struggling to order his turbulent thoughts. Ever since their first true contact with the Cronians, a nameless dread had taken hold in his heart, gnawing at him during every waking hour. And even seeping into his uneasy dreams.</p><p>He understood so little - about the alien intelligence they had encountered, the quantum forces enabling the planet&apos;s exotic biosphere, or the consequences of humanity&apos;s continued meddling. But that was exactly the root of his anguish - comprehending just enough to grasp the perils of their ignorance.</p><p>With a heavy sigh, Kepler stood up and paced the small room, his mind returning to that illuminated clearing in the forest, the haunting resonances that chilled his very bones, the hypnotic auras...and the unmistakable warning against Orion Voronin&apos;s ruthless exploitation. Exploitation that even now was accelerating despite Kepler&apos;s strident objections.</p><p>His scientific career had been dedicated to understanding life&apos;s boundless diversity across the cosmos. But this was the first time Kepler felt the profound weight of responsibility - not just to study, but to shield and nurture. The Cronians&apos; sentience was intricately tied to the quantum forces permeating their world. Forces that his own species blithely sought to harvest, without pausing to consider the consequences.</p><p>Outside the curved window, Kepler gazed at the lush Cronian night, where even the darkness seemed somehow aglow. This world was ancient beyond knowing, and now it lay at the mercy of short-sighted corporate interests represented by men like Voronin. Kepler rested his head against the cool pane, feeling utterly powerless.</p><p>As an explorer, he had always clung to the hope that expanding knowledge could uplift his fellow humans, make them act more nobly. But now, that hope wavered in the face of Voronin&apos;s monumental arrogance and ambition. What if enlightenment never came for humanity? What if mankind&apos;s ignorance doomed them to perpetual destruction?</p><p>A light knock stirred Kepler from his bleak reverie. Lilith entered quietly, her presence radiating compassion. His dear friend always sensed when darkness descended upon his thoughts. Without a word she embraced him, anchoring Kepler amidst the raging storms.</p><p>&quot;Talk to me, Keph,&quot; she entreated softly. &quot;Let me help shoulder this burden.&quot;</p><p>Haltingly, Kepler shared his inner turmoil, giving voice to all his doubts and fears. About humanity&apos;s path, their place in the universe, his own conflicted purpose. Lilith listened silently, letting the tide of anguish flow, until at last Kepler lapsed into an exhausted silence.</p><p>Lilith took his hands then, her eyes luminous but steady. &quot;Your doubts reflect the goodness in you, Keph. Keep nurturing that seed, and let it blossom into wise action.&quot;</p><p>Kepler swallowed hard, moved by her faith in him. She was right - wallowing in despair served nothing. He could yet do some good, if he kept his moral compass aligned.</p><p>With renewed vigor, Kepler vowed to confront Orion&apos;s relentless exploitation and safeguard the Cronian ecology. Perhaps enlightenment would come to their species, perhaps not. But he must live and act as though the dawn might break at any moment. With Lilith&apos;s kindness lighting the way, Kepler felt the shadows over his heart lifting. A glimmer of hope amidst the dark cosmos.</p><h2 id="chapter-12orions-dismissal">Chapter 12 - &quot;Orion&apos;s Dismissal&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter12.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter12</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5:48</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The sleek corporate shuttle descended through Cronus&apos; hazy orange skies towards the gleaming cityscape of Voronin Point, headquarters for Starfire&apos;s interstellar operations. Kepler gazed broodingly out the window as the alien metropolis came into focus below, its silver towers rising incongruously from the primordial landscape.</p><p>He had argued vehemently against further colonization, but Orion Voronin would hear none of it. His ambitions were fixed upon harnessing the planet&apos;s quantum forces for his own glory, indifferent to the consequences for Cronus&apos; fragile ecology. Or the unimaginable sentience they had encountered in the forest.</p><p>Now Kepler was summoned before the CEO to give a &quot;progress report&quot; on his team&apos;s research. But he knew Orion&apos;s mind was already made up. The man&apos;s arrogance and hunger for power seemed boundless. How could Kepler make him see reason?</p><p>The shuttle glided between towering corporate habitation modules to land smoothly at the entrance of the Executive Spire, Starfire&apos;s seat of power on Cronus. Kepler steeled himself as he entered the soaring atrium and presented his ID chip to the armed guards. One scanned his biometrics and nodded curtly.</p><p>&quot;Mr Voronin is expecting you. Top floor.&quot;</p><p>Kepler stepped into an express lift that whisked him up at dizzying speed. Before he could even collect his thoughts, the doors opened directly into Voronin&apos;s palatial office. Floor-to-ceiling windows presented an awe-inspiring panoramic view of the city below and the untamed Cronian wilderness beyond.</p><p>But Kepler&apos;s gaze was drawn to the lone figure seated behind a massive teak desk, framed against the vista like some feudal lord. Orion Voronin slowly raised his head to fix Kepler with an intense stare.</p><p>&quot;Kepler, welcome back.&quot; His tone was cordial, but his cybernetically enhanced eyes were cold and appraising. &quot;Please, take a seat.&quot;</p><p>Kepler sat hesitantly before the imposing desk. He took a deep breath, choosing his next words carefully.</p><p>&quot;Orion, we have to talk about Cronus. The quantum forces here are beyond anything we&apos;ve dealt with before. We risk devastating consequences if we continue to exploit this world recklessly.&quot;</p><p>Voronin templed his fingers, regarding Kepler impassively. &quot;And what evidence supports these concerns?&quot;</p><p>Kepler leaned forward earnestly. &quot;The very nature of the planet&apos;s ecology for one, intrinsically linked to ambient quantum fields. And the Cronians themselves...&quot;</p><p>He described their eerie first contact with the aliens in the forest, the hypnotic resonances, the incomprehensible complexity and sentience.</p><p>But Voronin&apos;s expression remained unmoved. When Kepler finished, he simply gave an indifferent shrug.</p><p>&quot;A quaint account. But I expected concrete data from our Chief Astrobiologist, not fairy tales.&quot; His tone turned mocking. &quot;For all you know, these &apos;apparitions&apos; are some natural planetary phenomenon. An overactive imagination does not justify halting our operations.&quot;</p><p>Kepler struggled to remain calm. &quot;With respect Orion, there is too much at stake here to dismiss the risks. Your actions could irrevocably damage a complex alien biosphere. Does that not give you pause?&quot;</p><p>Voronin rose abruptly from his seat and turned to the expansive window, hands clasped behind his back arrogantly.</p><p>&quot;I didn&apos;t bring you all the way to Cronus to wax philosophical, Kepler. I need options to harness this world, not excuses.&quot; &#xA0;He kept his back to Kepler. &quot;Unless you can provide me with definitive solutions soon, I will find researchers who can.&quot;</p><p>Kepler stood slowly, trying to contain his swirling outrage, frustration and disappointment.</p><p>&quot;I cannot in good conscience offer you technical advice for exploiting this planet and its inhabitants. I&apos;m sorry, Orion.&quot;</p><p>Voronin did not turn around.</p><p>&quot;Then we have nothing further to discuss. You are dismissed, Dr Arden.&quot; His tone was icy.</p><p>Kepler exited the office in weary silence. The towering atrium with its gleaming surfaces and scurrying corporate workers now seemed garish and empty to him. He felt only a deep sense of sorrow. Voronin&apos;s hubris had closed his mind, and Kepler lacked the power or persuasiveness to open it again.</p><p>But he would not abandon Cronus. Even if he could not sway Orion, perhaps the Cronians themselves would find a way to halt the human desecration of their world. Kepler clung fast to that fragile hope. Orion was but one man in the end, however arrogant - but the will of an entire sentient species was another matter.</p><p>Kepler stepped out of the massive Executive Spire onto a landing platform overlooking the sprawling Voronin Point complex. The wind carried a faint harmonic resonance that only Kepler could detect. As if sensing his thoughts, the Cronians were signaling &#xA0;their patience was finite against the human onslaught. Subtle power rippled across this ancient land, far older and stranger than the petty earthly authority Orion Voronin brandished so brazenly.</p><p>Kepler raised his eyes to the swirling violet skies, stained crimson by the setting of Cronus&apos; distant sun. Between Voronin&apos;s ruthless ambition and the Cronians&apos; cryptic power, the fate of both species now balanced on the edge of a knife. All Kepler could do was follow his conscience as events unfolded. Eyes open, however bitter the path ahead. With a heavy heart, he boarded the shuttle to begin the long journey back.</p><h2 id="chapter-13indigenous-defense">Chapter 13 - &quot;Indigenous Defense&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter13.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter13</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:00</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>A baleful crimson dawn crept over the horizon as Kepler stepped out of the remote research outpost onto Cronus&apos; barren plains. The morning sky was stained a virulent purple, flickering with ominous auroral shapes. Kepler shuddered, unnerved by the planet&apos;s changed temperament.</p><p>For weeks now, tensions had been rising as Orion Voronin&apos;s ruthless exploitation widened across Cronus. Desperate warnings from Kepler went unheeded, and attempts to reach out to the Cronians were met with stony silence. The planet seethed with growing unrest.</p><p>Now Kepler led a small team dispatched to investigate garbled reports of technology failures at this isolated outpost. As they had flown in under the angry sky, Kepler sensed they were already too late.</p><p>The base&apos;s autonomous systems were offline, doors sealed shut and communications dead. After donning protective suits, Kepler managed to override a stubborn airlock using the Outpost Director&apos;s authority code. As the inner door cycled open, a disturbing odor wafted out - burnt metal and ozone. Kepler exchanged an apprehensive look with Lilith before stepping inside.</p><p>Charred cables snaked across shattered floor panels in the gloomy corridors. Not a system or screen remained intact. Flickering emergency lights revealed an ominous trail of corrosion eating through the base infrastructure. Kepler&apos;s skin crawled as he traced the unnatural decay back towards the main laboratory.</p><p>The sprawling chamber was utterly devastated. Kepler picked his way silently through the wreckage - twisted remnants of robotics and electronics, databanks mottled by creeping decay. At the room&apos;s center, the base&apos;s Cronium reactor stood lifeless. The shimmering mineral - so vital to Voronin&apos;s ambitions - had blackened like necrotic flesh.</p><p>Lilith activated a malfunctioning monitor, wincing at the fizzing display. &quot;It&apos;s like everything just...dissolved from quantum effects. But how?&quot;</p><p>Kepler turned slowly, realization dawning. &quot;This was no accident or system failure. The Cronians did this - a targeted retaliation.&quot;</p><p>Lilith stared at him. &quot;You mean this was an attack? But why only shut down instead of destroying the base?&quot;</p><p>&quot;A warning,&quot; Kepler murmured. &quot;Demonstrating their power to incapacitate our facilities with pinpoint manipulation of quantum fields. The blighted reactor is a message - Cronium turned poisonous at its source.&quot;</p><p>As if in response, a resonant Croanian harmony echoed through the ruins, more dissonant than before. Kepler&apos;s heart froze at the palpable anger infusing the alien tones. This was only the first act.</p><p>Around Cronus&apos; settlement, panic erupted as transportation, communication and defense systems mysteriously failed. Voronin raged helplessly against the planetwide breakdown. Deep in the forest, the Cronians&apos; shimmering pillars intensified as the barriers between the quantum and physical worlds thinned dangerously.</p><p>In Kepler&apos;s mind, a single word echoed with crystalline clarity - &quot;Depart.&quot; The ultimatum was clear. Abandon Cronus or face complete dissolution, not just of technology but reality itself. Mankind had tried the Cronians&apos; patience for too long.</p><p>Kepler&apos;s hands trembled as he placed a scrambled call to Voronin&apos;s inner council, warning of imminent catastrophe. Even now Orion plotted retaliation, unwilling to relinquish his transgalactic ambition. But Kepler knew this was no longer a human conflict. What power did earthly authority have over beings who spoke with the very forces of nature? With stakes this high, he and Lilith might be the only conciliatory voices left between two irreconcilable species hurtling towards mutual annihilation.</p><h2 id="chapter-14cosmic-crisis-averted">Chapter 14 - &quot;Cosmic Crisis Averted&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter14-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter14</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:12</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler raced through the quantum research complex, past teams of scientists frantically trying to contain the cascading Cronian retaliations. Alarms blared as precious equipment flickered and dissolved under the unearthly assault.</p><p>Lilith stood at the heart of the control room, desperately calibrating protective field modulators. But each quantum-laced wave from the Cronians slipped through, leaving behind creeping decay.</p><p>&quot;I can&apos;t stabilize any of the shield grids,&quot; Lilith yelled over the din. &quot;It&apos;s like their powers are permeating reality itself!&quot;</p><p>Kepler gripped her shoulder. &quot;We have to keep trying. If we can just shield Voronin Point, it may pacify them.&quot; But inwardly, he harbored little hope. The Cronians&apos; vengeance was an unstoppable tide.</p><p>Suddenly, the shrieking alarms fell eerily silent. Across the complex, screens winked out and reactors went dark as oily corruption swallowed them. A message chimed through Kepler&apos;s COMM implant in his skull - evacuation protocol activated. The entire staff of Voronin Point had minutes to flee into orbit before the Cronians unraveled the fabric of Spacetime around it.</p><p>Kepler and Lilith stood frozen amidst the dying technology, bathed in the glow of emergency lights. After a lifetime exploring the cosmos, to die here under an alien sun... it seemed so senseless.</p><p>Lilith slipped her gloved hand into Kepler&apos;s. &quot;It&apos;s been an honor, Keph.&quot; Her voice trembled butKepler sensed the deep well of courage within her.</p><p>As the evacuation klaxon wailed, Kepler embraced her, wishing they had</p><p>more time. His thoughts turned to sunny days on gentle Earth, so far away now. No regrets shadowed those memories, only gratitude for the wonders they had witnessed.</p><p>&quot;I love you, Lily Carson,&quot; Kepler whispered. She smiled bravely.</p><p>&quot;And I love you, Kepler Arden. Don&apos;t be afraid.&quot;</p><p>As reality collapsed around Voronin Point in a contagion of entropy, Kepler clung to the reliable anchor of Lilith&apos;s spirit. Eyes closed, they waited for the end.</p><p>But it did not come. The seconds stretched on, and the satisfying oblivion refused to claim them. Kepler&apos;s eyes flew open in shock. The creeping decay inches from them had halted, frozen in place like varicose veins across spacetime.</p><p>Lilith gasped, her fingers tightening painfully on Kepler&apos;s. &quot;Are we...alive?&quot; she managed in an awed whisper.</p><p>Kepler shook his head in disbelief. &quot;For now...but how?&quot;</p><p>Around them, the staff emerged from hiding places, equally stunned to still exist. Amidst the chaos, Kepler&apos;s comm implant crackled.</p><p>&quot;Kepler, can you hear me? You&apos;re alive!&quot; The voice of Sal, Cronus&apos; ambassador to the Cronians, rang through. &quot;The Council is holding back the planet&apos;s fury, but can&apos;t restrain it much longer!&quot;</p><p>New strength surged through Kepler&apos;s heart. By some impossible grace, they had a second chance. &quot;Sal! We need to reconvene emergency talks. There must be a way to make amends!&quot;</p><p>Sal&apos;s response held a thread of hope. &quot;Come to the crystal grove, quickly! The Council awaits.&quot;</p><p>As Kepler and Lilith scrambled for a functioning rover, Cronus groaned ominously around them. The surface rippled as spacetime strained against its quantum chains.</p><p>They sped under the dark sky towards the towering crystal grove, last stand between two species. Inside Kepler&apos;s mind, a fragile trust took root - that maybe peace was still possible, through compassion and sacrifice from both sides.</p><p>He prayed silently it was not too late. The long-term threat still loomed over Earth and Cronus alike, as pressure built against the precarious walls holding back mutual destruction. But with wisdom and patience, the worst fate could yet be averted.</p><p>Kepler and Lilith clung fiercely to that faith as they plunged into the luminous Cronian forest, towards a new hope.</p><h2 id="chapter-15cronians-protest">Chapter 15 - &quot;Cronians&apos; Protest&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter15-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter15</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5:25</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>A deathly silence hung over the crystalline grove as Kepler and Lilith approached. The alien trees towered overhead, refracting the wan sunlight into splintered rainbows across the mossy floor. There was no sign of Sal or the Cronian Council.</p><p>Unease gnawed at Kepler&apos;s gut. The planet&apos;s very substance felt on edge, shivering with barely contained forces. He opened his mouth to call out, but an urgent gesture from Lilith stilled him. She pointed around the grove, eyes wide.</p><p>Kepler focused on their surroundings, and his breath caught in his throat. The Cronians were already here - not in any anthropic form, but diffused through the quantum rhythms of Cronus itself. Strange harmonics pulsed across trunks, leaves, and soil, welling up from the planet&apos;s depths. Kepler&apos;s bones resonated alarmingly with the alien tones.</p><p>&quot;Where&apos;s Sal?&quot; Lilith whispered. Kepler shook his head helplessly. They were alone - perhaps the last humans left on Cronus as the evacuation continued above. What fate awaited them amidst these cycloean trees?</p><p>As they stood frozen, the harmonic pulsations rose menacingly. Kepler cried out as an arctic beam lanced through his skull. His knees buckled under the psychic assault. Through fading vision, he saw Lilith collapsed nearby, blood trickling from her nose.</p><p>&quot;What...do you want with us?&quot; Kepler managed to rasp. There was no reply but the mounting alien crescendo. Kepler sensed fierce debate amongst the entities - to crush these two insolent humans, or spare them as witnesses?</p><p>Just as oblivion loomed, the attack ceased. The grove grew deathly still, the very sunlight muted and gray. Kepler crawled agonizingly over to Lilith&apos;s crumpled form, cradling her head. Her eyes fluttered open, glazed with pain.</p><p>&quot;We&apos;re still breathing...&quot; she croaked. They held each other close amidst the silence, taking comfort in the miracle of their fragile existence. But the reprieve was temporary. Cronus seethed around them, channeling the Cronians&apos; wrath.</p><p>Kepler&apos;s communicator suddenly crackled to life, Sal&apos;s panicked voice filtering through. &quot;...stopped all quantum travel near Cronus...some kind of interstellar block...&quot; The signal dissolved into hissing static.</p><p>Cold understanding gripped Kepler. The Cronians were no longer confining their ire to Cronus alone. Their distress signal was resonating across the very fabric of space-time, freezing all quantum-enabled travel and communications. Supply runs, colonist transports, all interstellar activity - Earth&apos;s lifelines were being severed.</p><p>A fierce debate erupted on the Cronian Council, rippling through subspace itself. What consequences were too severe for the invaders defiling their world? Kepler&apos;s heart hammered against his ribs. Would they isolate mankind completely, leaving Earth to wither and die?</p><p>&quot;Please, have mercy...&quot; Kepler beamed his thoughts desperately towards the shimmering trees, swaying under the weight of this decision. &quot;We seek reconciliation...&quot;</p><p>The psychic assault returned - not to crush, but to envelop Kepler and Lilith completely. Their human senses were engulfed by the Cronian consciousnesses, minds linked across lightyears of radical otherness. For a few eternal moments, they saw as the Cronians saw.</p><p>Civilizations flickered by faster than light, rising and falling like mayflies. Yet each precious, worthy of guardianship. The cosmos was a sacred trust. How to correct without destroying? Kepler glimpsed the Cronians&apos; ferocious anguish at humanity&apos;s trespass, but also their reluctance to become executioners over one young, foolhardy race.</p><p>Just as quickly, Kepler and Lilith were released, minds raw and ringing. Lilith was curled on the spongy moss, weeping softly. &quot;Such pain...&quot; she murmured. &quot;Their world, their kindred...&quot;</p><p>Kepler helped her stand gently. &quot;There is still hope.&quot; He felt the Council&apos;s hesitation, their unwillingness to doom mankind entirely.</p><p>A single resonant tone reverberated through the grove, at once devastating yet restrained. The Cronians had delivered their ultimatum across all of Earth&apos;s interstellar colonies and outposts. For now they stayed their hand from further retaliation, awaiting humanity&apos;s response.</p><p>But time was short. Word would soon reach Voronin of this crisis hampering his transgalactic ambitions. How would the CEO react? Kepler dreaded that confrontation almost as much as the wrath of the Cronians. With two implacable forces competing to determine mankind&apos;s fate, it seemed oblivion was still the inevitable outcome.</p><p>But Kepler clung fiercely to hope as they made their way back through the darkling woods. Past mistakes could not be undone, but with wisdom and compassion, destruction could still be averted. The futures of both species now hung by a thread. The duty fell to Kepler to guide humanity back from the brink, or become architects of each other&apos;s demise.</p><h2 id="chapter-16a-race-against-time"><br>Chapter 16 - &quot;A Race Against Time&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter16.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter16</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">2:57</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler gripped the rover&apos;s controls, deftly swerving around tangled Cronian roots as they raced back to Voronin Point. Beside him, Lilith clung to her seat, eyes shadowed with the weight of the knowledge they carried.</p><p>The Cronians&apos; psychic message had laid bare the peril facing both species - oblivion for one, survival for none. Kepler&apos;s mind churned with desperate questions. How to make Orion see reason and abandon his reckless colonization? And how to appease the Cronians before their retaliation severed Earth&apos;s interstellar lifelines completely?</p><p>Time was bleeding away faster than lightyears under quantum drive. Even now, Orion roused his mighty corporate armada, spurred by rage and arrogance. Kepler knew that fleet would set course for Cronus within hours to crush this upstart indigenous force defying the CEO&apos;s ambitions.</p><p>Yet if Orion&apos;s warships reached Cronus, humankind would forfeit any last shred of trust or mercy from the Cronians. Kepler harbored no illusions - a technology-driven onslaught would be swatted aside like gnats by beings who spoke with the very forces Orion sought to enslave.</p><p>As the Voronin Point towers came into view through the swirling violet mists, Kepler felt the heavy gaze of the Cronians upon them. The entities wavered between hope and fury - though their ultimatum had spared mankind outright dissolution for now, restraint wore thin. Even Lilith&apos;s courage wavered under that pitiless regard from the clouds.</p><p>Yet in Kepler&apos;s heart, determination blazed brighter. Together with Lilith, they would stand before the demigod Orion and awaken some glimmer of wisdom in him, or die in the attempt. And if Orion proved intractable, they still had one slim chance - to broker a peace directly with the Cronian Council.</p><p>Kepler knew well the risk they invited, laying their fragile human minds open again to that unfathomable psychic torrent. But no other path remained to stop Orbital bombardment and learn the lessons Cronus was meant to teach.</p><p>The rover skidded to a precarious stop outside the Executive Spire as alarms blared within. Kepler took Lilith&apos;s hand, steeling himself and drinking in her beloved face one last time. Then, they strode into the tower to try and turn the tide of history.</p><p>One path led to salvation, the other to extinction. But the choice still hung in the balance. Kepler clung to that tenuous hope as they entered the great predator&apos;s lair. Guiding humanity through this crisis was their sole purpose now.</p><p>Human and Cronian fates would be forged here today, beneath an alien sky. Kepler silently prayed their wisdom and sacrifice would suffice to redeem both races from the yawning abyss.</p><h2 id="chapter-17orions-relentlessness">Chapter 17 - &quot;Orion&apos;s Relentlessness&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter17.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter17</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:08</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The door to the Executive Spire&apos;s situational chamber slid open and Kepler froze, momentarily overwhelmed by the sheer controlled chaos within. Teams of corporate officers and advisers swarmed around displays tracking Earth&apos;s crumbling interstellar infrastructure. At the center, Orion Voronin stood like the eye of a storm, barking orders and demands for solutions.</p><p>Kepler and Lilith hesitantly approached the CEO, whose wild gestures and ranting drowned out all else.</p><p>&quot;&#x2014;the entire Cronus operation in shambles! Quantum travel disrupted across colonies!&quot; Orion slammed a fist down. &quot;Unacceptable! I want our astrophysicists and engineers on this disaster immediately!&quot;</p><p>&quot;Orion!&quot; Kepler had to shout to be heard. &quot;This wasn&apos;t an accidental systems failure. The Cronians themselves are blocking all quantum travel and trade. Your plans have provoked them across the entire sector!&quot;</p><p>Orion whirled, his face mottled with rage. &quot;Provoke them? Those apparitions you ranted about?&quot; He laughed harshly. &quot;I don&apos;t care if they&apos;re ghosts or gods, they will learn to bend knee when I am through with them!&quot;</p><p>Kepler struggled to hold back despair at Orion&apos;s arrogance. &quot;Please, you must listen! The Cronians wield power beyond our comprehension through quantum manipulation. Our technology is nothing to them.&quot;</p><p>But Orion seemed beyond reason, consumed by indignation. &quot;You always were too timid, Kepler. These pathetic aliens don&apos;t realize who they&apos;re dealing with!&quot; He turned to his advisors with palms raised theatrically.</p><p>&quot;We shall respond with the full might of the Voronin family&apos;s Star Empire! Ready the Cronus retaliation fleet for immediate departure!&quot;</p><p>The chamber descended into frenzied activity as officers rushed to carry out his command. Kepler grabbed Orion&apos;s arm in supplication, heedless of the guards that stepped forward threateningly.</p><p>&quot;No! You&apos;ll only ensure humanity&apos;s destruction if you confront them with force. Please Orion, even you can&apos;t stand against beings who speak the language of reality itself!&quot;</p><p>For a heartbeat, Lilith glimpsed something through the CEO&apos;s rage - a profound exhaustion shadowing his eyes. The burden of his family&apos;s lofty legacy weighing down his shoulders. She pressed Kepler&apos;s arm warningly as Orion gently withdrew himself.</p><p>&quot;Your concerns are noted, Dr Arden,&quot; Orion said quietly. &quot;But I must uphold the Voronin name. At any cost.&quot; He turned away, shoulders slumped. &quot;Guard, please see our guests out.&quot;</p><p>Kepler struggled uselessly as they were led firmly to the doors. There, he turned back once more.</p><p>&quot;This madness won&apos;t bring you peace, Orion! Billions will perish!&quot;</p><p>The closing doors muted his cries. Lilith hugged Kepler as despair threatened to overwhelm him. Voronin&apos;s greed for power and glory had sealed both their fates.</p><p>Yet amidst anguish, Lilith sensed Orion was not an evil man, but one crushed under ambition&apos;s merciless weight. She whispered close to Kepler&apos;s ear.</p><p>&quot;All is not lost yet, my love. We must make directly for the Crystal Grove.&quot;</p><p>Kepler turned wild eyes upon her. &quot;And say what? Plead for our species&apos; survival?&quot;</p><p>She smiled sadly. &quot;If we can first show the Council humanity, perhaps they will show us mercy in kind.&quot;</p><p>Kepler shuddered with fresh hope and fear. As Orion&apos;s armada streaked Cronus-bound, only one slim chance for reconciliation remained - to open their minds and souls to the Cronians without restraint. And pray it would be enough to halt extinction&apos;s relentless hand.</p><p>They clung to each other under the shrouded sky. If these were to be humankind&apos;s final hours, they would face the end together, with hearts open. Lilith&apos;s courage kindled Kepler&apos;s spirit anew for the trial ahead. Hand in hand, they made for the crystalline forest to try and ransom humanity&apos;s very soul.</p><h2 id="chapter-18cronian-ultimatum">Chapter 18 - &quot;Cronian Ultimatum&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter18.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter18</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:13</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler and Lilith entered the crystalline grove as Cronus&apos; sun sank below the horizon. The alien trees surrounding the clearing thrummed with an ominous resonance just beyond human hearing. Kepler felt it vibrating through his bones - a harmonic frequency conveying urgency...and barely restrained fury.</p><p>&quot;They know,&quot; Lilith whispered, wide-eyed. Kepler could only nod grimly. Orion&apos;s retaliation fleet was streaking towards Cronus even now, bristling with enough firepower to shatter moons. Yet those technologically mighty armaments would be less than toys against beings who effortlessly unraveled quantum skeins with a thought.</p><p>Kepler opened his mind, beaming out a plea into the charged ether. &quot;Hear us! We come in peace, seeking reconciliation!&quot;</p><p>The thrumming tone modulated into rapid oscillations, akin to heated debate. Lilith stepped closer to Kepler as the lambent crystal trees shivered. A fierce war of wills raged around them - the Cronian Council weighing mankind&apos;s fate.</p><p>Finally, the trees stilled. A single pure note reverberated through the grove poignantly. Then, as one, the entities materialized - seven shimmering pillars, featureless yet undeniably sentient, hovering before Kepler and Lilith.</p><p>Lilith&apos;s breath caught at the painful beauty of that solitary tone. &quot;It&apos;s...mournful. Like a mother watching her children stray into peril.&quot; She shook her head in wonder. &quot;Even for us - the race defiling their world.&quot;</p><p>Kepler&apos;s heart was full to bursting. With care and time, perhaps their two kindred could nurture understanding between them. But time was in short supply now.</p><p>He addressed the wavering pillars respectfully. &quot;You know why we have come. We seek...to make amends, for our trespass.&quot; Kepler faltered, grasping for an approach that resonated with both species.</p><p>&quot;There are those like Voronin who see only conquest and wealth. But many more wish to walk gently, learning Cronus&apos; wisdom.&quot; He hesitated. &quot;We lack your mastery of space and time, yet are ready to listen.&quot;</p><p>A rippling aura like aurora wove between the pillars as they conferred. Lilith held Kepler&apos;s hand tightly, knowing their lives hung on understanding the ineffable meanings in the Council&apos;s display.</p><p>The rippling ceased. In unison, the auras shifted to depict...Orion&apos;s fleet, then reformed as a single glowing pillar before disintegrating ominously.</p><p>The message was clear - turn back, or share the fate of Voronin&apos;s armada. This was the Cronians&apos; final offer. Their rage seethed beneath like magma, halted only by delicate trust in Kepler&apos;s pleas for humanity.</p><p>Kepler blinked back helpless tears, overcome by the Council&apos;s mercy even for undeserving souls like Orion. Perhaps that capacity for grace flowed both ways between their kin.</p><p>He bowed deeply. &quot;We accept your judgement with humble thanks. None shall threaten Cronus again while we draw breath.&quot;</p><p>A melodic tone answered, at once resonant with sorrow and hope. Then the entities began to disperse in swirling motes of light. But two broke away, approaching Kepler and Lilith directly through the lucent trees until they shone bright before the awestruck humans like captive stars.</p><p>One reached forth with a delicate aura tendril and touched Kepler&apos;s forehead gently. His mind seemed to dilate, suddenly beholding the strange intricacies of alien thought, poured forth in sympathy and expectancy.</p><p>When Kepler recovered his senses, eyes wet with revelation, the pillars were gone. Only a lingering harmonic resonance remained, ringing between Cronus and Earth.</p><p>Lilith embraced him fiercely, knowing the full meaning of the gift they had received - time, infinitely precious, to transform humankind&apos;s fate. By some miracle, they walked still as ambassadors on the galactic stage.</p><h2 id="chapter-19earths-concerns">Chapter 19 - &quot;Earth&apos;s Concerns&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter19.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter19</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:55</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler sat anxiously in the communications room aboard the Cronus research outpost, rapidly calibrating the quantum transmitter to contact Earth. Beside him, Lilith put a reassuring hand on his shoulder as the display finally blinked ready.</p><p>He hesitated only a moment before opening a priority channel straight to the Global Authority&apos;s situation room. This was a call Kepler prayed he would never have to make - entreating Earth to reign in one of its most powerful corporations before an interstellar incident exploded beyond control.</p><p>The flickering holoscreen resolved into the grave faces of the Secretary-General and her advisers. Kepler saw confusion, then dawning unease in their expressions.</p><p>&quot;Dr. Arden, explain this unscheduled call,&quot; the Secretary-General said sharply.</p><p>Kepler steadied himself. &quot;Madam Secretary, Orion Voronin has launched a full retaliation fleet to Cronus against an alien intelligence here whose powers surpass anything we&apos;ve encountered.&quot;</p><p>He quickly summarized the clash with the Cronians over Voronin&apos;s ruthless mining, the planet-wide technological breakdowns, and the begrudging restraint the entities had shown so far against mankind.</p><p>&quot;But if Voronin attacks them directly, their retaliation could spread beyond Cronus, severing Earth&apos;s interstellar infrastructure in ways we can&apos;t imagine,&quot; Kepler implored. &quot;You must stop him before we lose any chance of reconciliation!&quot;</p><p>Alarm spread through the room at this revelation. The Secretary-General glanced at her advisers in dismay before turning back to Kepler.</p><p>&quot;Doctor, if what you say is true, Voronin may have overreached dangerously. But he holds authority on Cronus.&quot; She massaged her temples wearily. &quot;We cannot simply overrule his entire operation...&quot;</p><p>Kepler&apos;s heart sank, but he pressed on. &quot;Madame, I beg you. Send an emergency recall for Voronin&apos;s fleet, or we will face unthinkable consequences.&quot;</p><p>The Secretary-General held Kepler&apos;s gaze for a long moment before sighing regretfully. &quot;I will discuss options for a diplomatic solution. But we can make no guarantees. This recklessness is of Orion&apos;s doing.&quot;</p><p>The transmission winked out, leaving Kepler and Lilith alone again under the shroud of Cronus&apos; violet sky. He slammed a fist down in frustration.</p><p>&quot;They don&apos;t understand the threat facing us all! What can we possibly do?&quot;</p><p>Lilith embraced him comfortingly. &quot;We&apos;ve done what we can for now, Keph. All that remains is continuing to show the Cronians humanity&apos;s better nature until this passes.&quot;</p><p>Kepler rested his head against hers. &quot;I fear Orion will doom us all before wisdom prevails.&quot;</p><p>Outside, the wind seemed to rise in untranslatable alien voices - screaming out against the injustice seeded on their world, yet somehow still holding back planetary vengeance as diplomacy was sought.</p><p>Lilith kissed Kepler softly. &quot;Have faith. Whatever comes, we will face it together.&quot;</p><p>Hand in hand, they stepped outside to watch the gathering darkness and light. The future wavered between salvation and catastrophe, hinging on Voronin&apos;s pride and Earth&apos;s conscience. Their own small lives seemed to shrink until they were motes adrift between titanic forces. Yet even motes could shift balance. Until the very end, Kepler and Lilith would stand steadfast as ambassadors caught in the churning wake of civilizations colliding.</p><p>Perhaps those innocent of Earth&apos;s sins could walk blameless before the Cronian Council. Kepler clung to that fragile hope, though it seemed ever more beleaguered as warships streamed skyward like thunderheads of doom.</p><h2 id="chapter-20apocalyptic-visions">Chapter 20 - &quot;Apocalyptic Visions&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter20.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter20</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:20</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Darkness engulfed Kepler as he drifted into an uneasy sleep, the threat of catastrophe looming over both Earth and Cronus keeping rest at bay. He had done all he could to avert disaster, yet peace still seemed beyond their grasp.</p><p>As slumber finally embraced him, Kepler found himself adrift in an utterly lightless void, strangely similar to the sensory deprivation of quantum travel. But there was no ship to shelter his body here, just his conscious mind floating disembodied through the endless night between galaxies.</p><p>Gradually, pockets of nebulaic gas drifted into view, tinged with the crimson of Cronus&apos; giant sun. Kepler tried to regain his bearings, but the space around him seemed distorted, obeying an alien geometry.</p><p>Without warning, the gas clouds coalesced into violent stellar nurseries, birthing new suns in explosive fury. Their flaring brilliance seared Kepler&apos;s senses. As the newborn stars shone brighter, space itself seemed to ripple and dilate around them - and through the shimmering celestial mirages, Kepler glimpsed titanic shadows moving...</p><p>Heart thrashing, he desperately sought the familiar comfort of stars and constellations. But there was only the angry glare of the nebula and those colossal shapes stirring languidly in the distance.</p><p>As Kepler stared, frozen by the awful sight, a crooning resonance echoed across the lightyears. The Cronians! Their mental presence enfolded Kepler gently, emanating profound melancholy. Weeping for worlds beyond knowing, now facing ruination...</p><p>The visions intensified, stars and worlds blurring into streaks of light as Kepler hurtled across the Milky Way faster than signals could carry. He beheld vistas of civilizations both familiar and unimaginably alien, linked by glittering networks of quantum trade routes. Yet all shared the same primal seed - life, taking root and flowering in manifold ways Kepler could barely comprehend.</p><p>Now darkness loomed over those far-flung yet kindred worlds. A shadow falling not just on isolated Cronus but over all that had kindled from the ancient triumph of order over chaos. Everything Kepler ever dared dream across his decades of wandering the cosmos - all that promise, delicate as snowflakes, teetered on the crumbling edge of extinction&apos;s merciless gravity well...</p><p>Kepler cried out as the visions pierced his mind sharper than any physical agony. He was a mote watching creation unravel around him, all that joy and ingenuity meaningless against forces that operated on inhuman timescales.</p><p>Just as oblivion rushed to embrace Kepler completely, the Cronians surrounded his mind gently, filtering the psychic torrent until he could bear its full meaning. The shadow was not yet absolute - there was still hope, while even one innocent soul stood to shield the light.</p><p>The visions dissipated reluctantly, leaving Kepler alone in the abyss once more. But the heavy sickness of dread had lifted from his spirit. He sensed the dreamscapes were a gift, chilling yet necessary, to steel his resolve for the coming tribulation. A reminder that life transcended any single epoch, however dark.</p><p>As waking&apos;s warm light enveloped him, Kepler knew what must be done. Every civilization was the custodian of those to follow, bound in cosmic kinship across time. Though Orion rejected his responsibilities, Kepler would remain true to that eternal charge.</p><p>He rose renewed in purpose, rejoining Lilith to await Voronin&apos;s fateful arrival. Though a long night loomed, hope yet remained while the Cronians showed faith in humanity&apos;s redemption. Kepler focused on that lone bright horizon beyond despair. If these were to be their final days, he and Lilith would face the end standing sentinel together, two small souls defying the dark between galaxies.</p><p>Humanity would confront its reflection soon in Cronus&apos; crystalline gaze - would they see gods or monsters looking back? At this crossroads between ruin and redemption, all Kepler and Lilith could do was keep holding up the mirror, unflinching against the approaching storm.</p><h2 id="chapter-21alien-partnership">Chapter 21 - &quot;Alien Partnership&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter21.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter21</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:44</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>The violet mists of Cronus swirled around Kepler as he sat deep in meditation, attempting to reconnect with the alien presences inhabiting this strange world. Since the visions, his mind felt altered, as if permanently receptive now to the Cronians and their unknowable ways. He hoped desperately they might sense his desire for reconciliation.</p><p>Time was evaporating faster than worlds could form; Orion would be here in mere hours. Yet the Cronians had shown astonishing restraint against mankind so far. Were they still open to nonviolent solutions, if Kepler could kindle trust and understanding between their disparate kin? He focused inward, transmitting thoughts of cooperation and goodwill across the unseen gulfs separating their species.</p><p>At first, only silence answered. Then, slowly, a resonant tone began to rise among the towering crystal trees surrounding the grove where Kepler kept his patient vigil. The harmonic vibrations were at once utterly alien yet strangely familiar, evoking complex emotions not translatable into any earthly vocabulary. Kepler sensed curiosity, surprise, cautious optimism and something deeper&#x2014;a fragility not found on physical planes of existence.</p><p>As the resonances ebbed and flowed, colors and fractal patterns swirled into being before Kepler&apos;s astonished eyes. The Cronians were engaging, sharing concepts and history at a rate human minds could scarcely grasp. Like psychic gulfs opening around nebulous islands of meaning, the discourse defied verbal description.</p><p>Kepler surrendered himself fully to the reality-warping exchange, set adrift on a sea of alien thought. Flickers of memory and emotion not his own washed over him as the entities explored his subjective realm with delicate precision. Through what Kepler could only perceive as eons of debate and revelation between their species, he struggled to impress his memories of humanity&apos;s virtues&#x2014;sacrifice, love, yearning for connection.</p><p>When the communion finally withdrew like a falling tide, Kepler collapsed in utter exhaustion. There were no words for what had passed between them, but he sensed a fragile bridge had been forged. Perhaps now the Cronians grasped that mankind was more than just Voronin&apos;s cruelty and greed. That there were yet innocents striving to walk in balance across the stars.</p><p>As Kepler lay bathed in prismatic starlight, a single harmonic tone resonated through his mind, at once resonant with melancholy yet pulsing with newfound hope. The meaning was clear&#x2014;we acknowledge your integrity. Further violence will be withheld...for now. A future alliance is conceivable.</p><p>Joy suffused Kepler&apos;s weary spirit. Trust remained precarious, the threat still loomed ahead. But in their selflessness, the Cronians had found a seed of possibility in human nature that Kepler vowed to nurture. They would face Voronin&apos;s incoming armada together, kindred souls holding back the tide of destruction.</p><p>There were no miracles or absolutes, only tesseract paths still unfolding. But Kepler had bought them time and chance. Perhaps that would be enough to steer both races away from the brink. Eyes fixed on the shimmering alien sky, Kepler allowed himself an exhausted smile. Sleep could wait&#x2014;this newfound kinship was too fragile and strange for rest. Together they kept their patient watch, two souls standing against the dark.</p><h2 id="chapter-22earth-vs-orion">Chapter 22 - &quot;Earth vs. Orion&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter22.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter22</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5:39</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>A tense silence filled the Global Authority&apos;s situation room as Secretary-General Veda Patel ended the emergency session regarding Orion Voronin&apos;s Cronus fleet. Despite Dr. Arden&apos;s dire warnings, they had failed to reach a consensus on stopping Voronin&apos;s imminent retaliation against the entities on Cronus.</p><p>Powerful corporate interests tied to Voronin&apos;s Starfire Corporation had vehemently opposed any direct action to hold Orion accountable, protecting their own profits and leverage. Arguments went back and forth for hours, growing more heated as the fleet neared its estimated arrival at Cronus.</p><p>In the end, Secretary-General Patel lacked the political capital to unilaterally decree Voronin stand down. His family&apos;s dynasty and corporate empire wielded nearly sovereign powers across many colonies and outposts. Attempting to restrain him could fracture Earth&apos;s already precarious interstellar unity.</p><p>As Kepler&#x2019;s transmission winked out, Patel sighed heavily and dismissed the exhausted cabinet members. She understood Kepler&apos;s urgency all too well - the lives of billions likely hung on what the Cronus fleet encountered. Perhaps even Earth&apos;s survival if the entities there retaliated in full.</p><p>But was that worth rupturing humanity&apos;s fragile post-diaspora politics? Patel&apos;s pragmatism warred with her conscience as a leader. Sometimes holding civilization together meant hard compromises.</p><p>Alone now, she stared out the panoramic window overlooking gleaming Geneva, ancestral heart of Earth&apos;s global governance. She swiped open a secure channel to speak with the one person who might prevail where she couldn&#x2019;t &#x2013; Orion&#x2019;s father.</p><p>Dimitri Voronin&apos;s weathered but keen face flickered into view. Despite his age, the Voronin patriarch was still fiercely lucid.</p><p>&quot;Mr. Voronin, thank you for taking my call. We find ourselves in an urgent situation regarding your son.&#x201D;</p><p>Dimitri raised a hand. &quot;No need to elaborate, Madame Secretary. I have already heard Orion&apos;s foolhardy plans.&quot; His expression was grave. &quot;We Voronins often rush ahead in pursuit of greatness, blind to consequences. But I know my son has a conscience under his ambition. I will personally speak with him before it is too late.&quot;</p><p>Patel nodded in relief. &quot;You may be the only one he still heeds. I pray you can make him understand the true stakes.&quot;</p><p>Dimitri gave a sad smile. &quot;The dreams of my generation die hard, Madame Secretary. The cosmic destiny we promised our children now burdens them greatly.&quot; His eyes were distant, seeing past regrets. &quot;But Orion&apos;s fate is not yet sealed. There may be a path to turn him from our tainted legacy.&quot;</p><p>The transmission ended, leaving Patel pensive. Perhaps there was hope of averting disaster, if Kepler&apos;s warnings could rekindle Orion&apos;s humanity. She sent up a silent prayer - for Kepler and Lilith&apos;s safety, for the beings facing Voronin&apos;s wrath, and for the soul of one ambitious man whose choices bore immense consequence.</p><p>Aboard the Cronus flagship Colossus, Orion stood alone on the command deck, steeling himself for the battle ahead. He had sacrificed too much, come too far along the lonely path to glory to turn back now. His was a sacred duty - to spread humanity&apos;s light across the uncaring cosmos.</p><p>So why then this hollow sickness in his chest, this doubt creeping through his thoughts? Orion pushed it fiercely down. He would do what must be done for Earth&apos;s prosperity, as all Voronins had. But his hands trembled of their own accord as the fleet streaked towards its fateful rendezvous with Cronus. There, shattered trust would unleash terrible forces, perhaps even world-ending. Yet still Orion continued on the ordained course, unable to conceive another way.</p><p>When the priority alert chimed unexpectedly through his neural implant, Orion felt cold certainty - this was no ordinary communique. He opened the channel with a deep breath. An aged but imposing figure materialized before him in crackling blue light - Dimitri Voronin, patriarch of their dynasty. Orion&apos;s father had not spoken to him in years, since the rift over Orion taking control. He tensed, bracing himself.</p><p>&quot;Orion, my son. We must speak.&quot; Dimitri&apos;s tone was weary, but intense in its sincerity. &quot;Turn your fleet from this reckless path while time remains. For the sake of all Earth, and your own soul.&quot;</p><p>Orion stood paralyzed, childhood insecurities welling up to war with his resolute ambition. In the shivering balance between futures, everything hung on the choice of one conflicted man - oblivion or deliverance for two civilizations.</p><p>Humanity&apos;s fate remained bound to Cronus&apos; crystalline shores. What needed to break now was not alien worlds, but Voronin&apos;s iron chains to the past.</p><p>Humanity&apos;s fate remained bound to Cronus&apos; crystalline shores. What needed to break now was not alien worlds, but Voronin&apos;s iron chains to the past. In his ambition, Orion struggled to see beyond the confines of his forebears&apos; legacy. But confronted now with the gentle wisdom of the father he had defied, Orion felt the first cracks forming in his fiercely held convictions.</p><p>There was still a chance to avoid calamity, but only if Orion relinquished old grudges and fears. Standing at destiny&apos;s fulcrum, he faced the hardest question - were his dreams worth the price of Earth&apos;s soul? In the void between stars, the battle for one man&apos;s conscience raged on.</p><h2 id="chapter-23quantum-warfare">Chapter 23 - &quot;Quantum Warfare&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter23-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter23</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">6:16</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>As Orion&apos;s fleet emerged from quantum jumpspace, Cronus loomed before them - a magnificent sapphire orb veiled in violet mist. For a heartbeat, Orion faltered, doubt and longing welling up in his chest. Was the dream of his forebears worth this coming bloodshed?</p><p>But he forced down the weakness, hardening his heart. Too much sacrifice had led them to this precipice. He would see their cosmic destiny fulfilled, no matter the cost.</p><p>&quot;Battle stations!&quot; Orion commanded. Across the flagship Colossus, klaxons blared as the armada readied itself. Cronus seemed to shudder in response, its placid clouds gathering into broiling thunderheads.</p><p>Kepler watched the standoff from the surface, clinging to Lilith in despair. &quot;He&apos;s really going to attack them...&quot;</p><p>Around them, Cronus&apos; strange harmonics rose in a dissonant chorus - whether lament or battle cry, none could tell. The Council convened as shimmering pillars within the crystal grove, their shapes flickering rapidly in agitation. Kepler prayed they would show restraint, but feared Orion was about to tear the fragile trust between them apart forever.</p><p>With blaze of fusion drives, the first waves of fighters streaked towards Cronus&apos; atmosphere. But as they neared the planet&apos;s lambent clouds, reality itself seemed to warp around them. Quantum static engulfed the ships, overriding systems and dragging them down like sinking stones. Through sheer kinetic force, a few impacted the surface, gouging out flaming craters.</p><p>Orion gripped his command throne in disbelief. &quot;Report! What happened?&quot;</p><p>&quot;Some kind of...spacetime manipulation,&quot; his sensor officer stammered. &quot;Our ships lost all propulsion and integrity fields.&quot;</p><p>Rage kindled in Orion&apos;s eyes. &quot;Deploy the Cronium-shielded reserves! We&apos;ll see how these apparitions stand against our might!&quot;</p><p>From specially retrofitted hangars, the next assault wave dove towards Cronus behind layers of exotic metallic shielding. They punched through the atmosphere and began strafing dazzling beams across the planet&apos;s surface, setting alien forests ablaze.</p><p>The Council&apos;s pillars flashed urgent red, resonating with the anguish of the dying biosphere. Then suddenly they vanished, dispersing into a billion motes of thought that permeated the quantum planet-mind.</p><p>Up in orbit, navigational systems started glitching inexplicably, pilots seized by sensations of unfathomable entities brushing against their consciousness. Like the peripheral vision of nameless phantoms, the Cronian intelligences infiltrated Orion&apos;s ships and crews.</p><p>Chaos reigned across the fleet as reality itself turned traitor. Cronium shields flickered uselessly as ships lost integrity, keeling out of formation in eerie silence before being consumed by the roiling clouds.</p><p>Orion could only watch helplessly as ghostly phenomena ran rampant through his mighty armada. But retreat was unthinkable. He strengthened firewalls around his consciousness, rallying the remnants of the fleet.</p><p>&quot;Full bombardment, give them hell!&quot; he thundered. From the Colossus&apos; spinally mounted siege cannon, a colossal beam of energy lanced down, boiling away kilometers of atmosphere and landscape. Orion gritted his teeth against the photon forces, consumed now only with obliterating these alien monstrosities, whatever the cost.</p><p>On the scoured surface, Kepler and Lilith took shelter against the orbital onslaught, their minds reeling withCronus&apos; psychic death cries. They clung together, innocent hearts breaking at the loss engulfing both species.</p><p>&quot;Kepler...&quot; Lilith spoke urgently, eyes blazing with revelation. &quot;The resonance...feel it?&quot;</p><p>Beneath the bombardment, Cronus was trembling not just in pain, but from vast forces building in response. The Council had awakened the planet&apos;s deepest quantum foundations. In self-preservation, a fierce intellect a billion years older than mankind was stirring.</p><p>And as Kepler attuned his psyche to Cronus&apos; anguish, he glimpsed the planet-mind&apos;s pure, crystalline thought unspooling across spacetime itself - evaluating Orion&apos;s flock of metal insects...and preparing counter-judgement.</p><p>&quot;No! They mustn&apos;t!&quot; Kepler cried out. &quot;Spare them, I beg you!&quot; But Cronus was already passing the verdict, the collective psyche of eons marshaling its strength against the invading flea.</p><p>In the skies overhead, the Colossus shuddered as arcing discharges engulfed its hull. Alarms blared as maglocks disengaged and bulkheads breached. The dreadnought was coming apart at the seams.</p><p>Orion stumbled on the command deck as reality dissolved around him. But through the chaos, he recognized the sequence flashing on his console, awaiting final judgement. The activation code for the Colossus&apos; neutrino lance - a weapon to crack open worlds.</p><p>Cronus filled the viewport now, defenseless below. Orion&apos;s finger trembled above the console. After everything, one word from him would blast this alien world into cosmic history. His birthright within reach, if he dared claim it.</p><p>Yet as Orion wavered at destiny&apos;s precipice, Kepler&apos;s appeals echoed through his mind. Was transcendence worth becoming the butcher of thinking worlds? In this final crucible, the man must overthrow the conqueror.</p><p>With a scream of anguish, Orion slammed his fist onto the override, aborting the colossal charge building within the flagship. The deck bucked as the Colossus spiraled brokenly into the atmosphere, shedding its weapons in fiery contrails.</p><p>Aboard the plummeting hull, Orion drifted in zero-g, sobbing silently amidst the screams of torn metal. Everything he had fought for, gone. But in its ruin, perhaps something nobler could be salvaged from his family&apos;s legacy.</p><p>With a seismic groan, the ravaged Colossus came to rest in a valley of violet Cronian flora.</p><h2 id="chapter-24reconciliation">Chapter 24 - &quot;Reconciliation&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter24.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter24</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">3:32</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>In the wake of Orion&apos;s doomed armada, a tense calm had settled over Cronus. The planet&apos;s surface remained unsettled and volatile, reacting to the disturbance across its quantum depths. Pockets of unnatural decay marred the alien wilderness Kepler had come to love, like infected wounds slow to heal.</p><p>The research outpost was in lockdown, communications crippled and supply ships unable to approach past the blockades imposed by the Cronian Council. Inside its sterile walls, a dispirited gloom had taken root as the stranded team waited helplessly for salvation or judgment.</p><p>Kepler spent his days in the crystalline grove, keeping a patient vigil and trying to re-establish contact with the entities who walked this strange land. Lilith stayed by his side, a stalwart companion on this lonesome vigil. The Cronians remained elusive, the harmonics that once resonated so potently now dimmed to a whisper teasing the edge of perception.</p><p>&quot;Do you think they mourn?&quot; Lilith asked softly one twilight, imagining the great pillars of light bowed under the weight of remorse.</p><p>&quot;In some fashion we cannot conceive,&quot; Kepler replied. &quot;But I believe there is hope of reconciliation between us still.&quot; He rested his head wearily on her shoulder. &quot;We only need to rebuild the trust that Orion shattered.&quot;</p><p>As Cronus&apos; violet moons rose huge and luminous above the horizon, Kepler felt a strange resonance begin to build within his mind. The Council was stirring, reaching out across the gulf of otherness. He took Lilith&apos;s hand tightly as a familiar presence enfolded his thoughts. Strange concepts blossomed like fractal flowers, painting impressions of sadness, hope, expectation. Of waiting for their small ambassador to attend the conclave once more.</p><p>Kepler&apos;s heart leapt even as he trembled. The Cronians had spared earthly lives where they could, showing mercy even amid vengeance. But to stand again in their phantom court required courage beyond reason.</p><p>Lilith sensed his hesitation. &quot;Go to them, Keph. Their trust in you is all that remains between our races now. I will be right here, always.&quot;</p><p>Steeling himself, Kepler surrendered to the psychic pull. His perceptions blurred, coalescing again within a landscape at once crystal and ether. The Council ringed this manifold space, radiating expectancy. With infinite care they reached out, joining Kepler and through him humanity&apos;s essence into their congress. What passed between their minds in the hours beyond flowed space and words.</p><p>When Kepler finally awoke in the muted dawn, he wept with profound catharsis. Across the impossible gulf, understanding had taken fragile root. The Cronians would continue their guardianship of this wounded biome, but allow humanity&apos;s return once they had walked the inward paths of remorse and wisdom. There was bitterness and hardship yet to come. But past the coming darkness, a possible future now beckoned where two kindred intelligences might heal and share each other&apos;s light.</p><p>Lilith smiled through her own tears, knowing what had passed in that unearthly conclave. No longer lost, they walked again on hallowed ground, missionaries of life itself. In trust there was hope. And in hope, the faith that life yet defeated death under whatever garb it donned across the eternal cosmos.</p><h2 id="chapter-25new-dawn-on-cronus">Chapter 25 - &quot;New Dawn on Cronus&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter25-3.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter25</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">4:17</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>A soft azure dawn crested over Cronus&apos; violet forests, casting everything in luminous hues. Kepler paused from tending his alien garden to admire the daily miracle of light reborn. Even after twenty years here, the beauty of this adopted world still stirred his weary spirit.</p><p>&quot;Father! Come quickly, the phasedancers are out!&quot; Kepler turned with a smile at his daughter&apos;s voice. Nineteen-year-old Malika beckoned excitedly from the porch of their sprawling alien home, woven from living Cronian trees. Her eyes, one blue and one hazel, shone with youthful curiosity, reminding Kepler of himself long ago.</p><p>He joined her there, gazing out at the clearing beyond their dwelling. Sinuous forms spun hypnotically above the mosses - the phasedancers, a quasi-corporeal entity native to Cronus. As the first dawn rays struck them, their bodies fractured prismatically into quantum ripples, casting dazzling rainbows across the morning mist.</p><p>Malika watched, enraptured. Though born human, she was as much a child of Cronus as Earth. Kepler and Lilith had raised her in close harmony with this strange world and its mysteries. She represented a new generation who might someday bridge the lingering divide between their species.</p><p>The phasedancers dissolved reluctantly back into motes as the sun rose higher. Lilith emerged just then from the house, pulling on her boots. &quot;Well, this Council meeting won&apos;t attend itself,&quot; she said wryly. Though there was still much hurt to heal, the Cronians had kept their promise, allowing humanity&apos;s gradual return. Her engineering expertise remained invaluable to maintaining the delicate cooperation.</p><p>Malika turned to them eagerly. &quot;Mother, Father - may I attend too? I long to see the Council again.&quot; Kepler considered a moment, then nodded. &quot;Just this once, starlight. You&apos;re old enough now to join the discourse, if you observe proper courtesy.&quot;</p><p>The crystalline grove shimmered just beyond the ridge from their home. Kepler paused at its edge, allowing the familiar harmonic tones to wash over him. Though the Council had forgiven, they did not forget. Respect must be shown.</p><p>Taking Malika&apos;s hand, he led her into the radiant copse. The Cronians manifested slowly as pillars of light, colors rippling in delicate patterns along their formless surfaces. Malika gasped softly at their austere beauty. Through years of tutelage, Kepler knew the nuances of posture and frequency that conveyed friendship, trust, humility to these beings. He shared what cues he could with Malika through subtle gestures.</p><p>As the discourse began, resonances ebbing and flowing, Kepler sensed the entities&apos; curiosity about this newcomer who represented both species. With infinite care, they opened pathways for Malika to share her memories and dreams, coaxing forth her shy but earnest hopes for unity. Moved by the insight shared, the Council resonated approval, wreathing Malika in light. They too heard the future&apos;s call - of understanding nurtured through the open spirit of innocents.</p><p>Afterwards, as they turned homeward, Malika chattered with joy at being welcomed into the alien conclave. But Kepler remained pensive. The Council&apos;s gift lay heavy in his pocket, a delicate crystal lattice pulsating with hypnotic inner fires. A seed of wisdom, offered to humankind should they choose to grow it. But much bitterness lingered still. Would it be planting in fertile soil or stony ground? The choice was not Kepler&apos;s alone to make.</p><p>Back home, Lilith greeted them with news - a priority transmission from old comrades back on Earth. The first thread tied anew. Kepler&apos;s hand closed over the warm crystal, praying its alien light might guide lost kin. There was hope still, fragile as any new dawn. If darkness came, they would face it together, planting seeds for mornings yet to come. For now, it was enough.</p><h2 id="chapter-26keplers-reflections">Chapter 26 - &quot;Kepler&apos;s Reflections&quot;</h2><p></p><div class="kg-card kg-audio-card"><img src alt="Quantum Aeon: A story written by alien intelligence" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://wingedsheep.com/content/media/2023/07/chapter26-1.mp3" preload="metadata"></audio><div class="kg-audio-title">Chapter26</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">5:01</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Kepler sat alone on a rocky outcropping overlooking the Cronian sea, the twin moons casting rippling emerald light across the gently undulating alien waters. He inhaled the crisp salty air, feeling the breeze caress his weathered features. At 70 years old now, Kepler could sense the long decades behind him, written in furrows across his brow and grey streaking his once dark hair.</p><p>How quickly the time had flowed, like cosmic streams, thought Kepler wryly. As a young man he had set forth to distant stars with fiery curiosity, lusting after new worlds and undiscovered knowledge. Never realizing that what he sought was not to be grasped, but gradually unveiled through patience and humility.</p><p>Now at the twilight of his years, Kepler found himself returning often to Cronus and its violet shores. The planet that had almost shattered mankind&apos;s interstellar reach, yet became the instrumental anvil upon which human civilization hammered out a new maturity.</p><p>Things were far from perfect, reflected Kepler soberly. Humanity&apos;s rapacious appetites and tribal divisions still threatened the unity so essential to survival. But Orion&apos;s humbling had ignited at least a thirst for temperance and conscience, guiding explorers to walk gently amid the splendor.</p><p>The Cronians too had evolved since that first fraught contact. Their mechanistic quantum manipulations were yielding to more harmonious resonance with the galactic forces they channeled. Kepler had taught them much of non-linear consciousness, and they in turn imparted wisps of eternity&apos;s perspectives to him.</p><p>Together both races now nurtured the cosmic code at the heart of sentience. And in the young like Malika was kindled a new spirit of exploration - one traveling inward as much as outward. Not to grasp or conquer as the simple minds of Kepler&apos;s era had sought, but to share, support and celebrate diversity.</p><p>It gladdened Kepler profoundly to see Malika taken under the Council&apos;s wispy tendrils, treated as one of their cosmic kindred. Perhaps her generation would at last heal the rifts between worlds that had nearly swallowed his whole in the dark.</p><p>The icy void always beckoned with indifference, yet now Kepler sensed fragile bonds woven across the abyss - gossamer threads of courage, curiosity and empathy. While those precious ligaments endured, civilization yet carried worth and moment.</p><p>Kepler ran his fingers across the smooth Cronian crystal he now wore around his neck, resonating gently with the planet&apos;s quantum heartbeat. He had lived through wondrous and terrible ages alike. Seen brilliance laid low by arrogance, only to rise again brighter and humbler. Watched societies flourish and lapse on a thousand worlds. Measured his small life against the uncaring sweep of galaxies.</p><p>Through it all, one truth alone endured - that they all danced together, however disparate their forms and natures. Life&apos;s shared notes reverberated through the endless night, binding in strange harmonies. To foster that music was Kepler&apos;s legacy, and he rested content now in its fragile echo.</p><p>The years ahead remained to be penned. But Kepler carried little worry for what fates they held. A patient wisdom flowed in him, rippling out endlessly through the lives he had touched even fleetingly. The tale passed beyond any single teller.</p><p>With a quiet smile, Kepler rose and turned towards the beckoning lights of the settlement where Lilith awaited. He paused for one last lingering look across the lucent alien sea, holding close the wisdom gleaned. Then he set forth again in contemplation of the journey ahead. The path stretched on, winding and continuous as time&apos;s own flow.</p><p>Humanity&apos;s course was unclear, but Kepler had woven his strand in destiny&apos;s tapestry. Wherever the coming generations roamed under distant suns, something of him would echo in their communion with the infinite. For beyond cold eternity burned fellowship&apos;s warm light, kindled in pondering the heavens together. All who dared lift their eyes to the uncharted abyss were kindred in that cosmic flame.</p><p>In its glow, Kepler had glimpsed the braiding of life itself - resilient and unexpected, but ultimately synchronized by code deeper than form. Again and again, its flowering persisted through all travails. And in that endurance Kepler saw the universe unveiled not through dominance, but participation in its immortal spirit.</p><p>So long as that bright spark yet lingered against the darkness, there was cause for hope. With a lightened heart Kepler went to join the dance, a small but rhythmic step across the eons. The ancient pulses guided him home...</p>]]></content:encoded></item><item><title><![CDATA[Exploring another planet: AI-generated Nature Photography]]></title><description><![CDATA[Discovering an alien planet using AI photography with midjourney 5.]]></description><link>https://wingedsheep.com/imaginary-creatures-2/</link><guid isPermaLink="false">6446d99bde21e7007349d92a</guid><category><![CDATA[AI Art]]></category><category><![CDATA[AI Photography]]></category><category><![CDATA[Midjourney]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Mon, 24 Apr 2023 21:21:44 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2023/04/wingedsheep_Nature_photograph_by_George_Lucas_and_Melissa_Groo__62f5a5b6-ba64-496f-8ff6-9d30fc57fca8.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Nature_photograph_by_George_Lucas_and_Melissa_Groo__62f5a5b6-ba64-496f-8ff6-9d30fc57fca8.jpg" alt="Exploring another planet: AI-generated Nature Photography"><p><br>Six months ago, I created a collection of imaginary creatures with the help of GPT-3 and Dall-e 2. With the rapid advancements in generative AI, it&apos;s now time to dive back into the world of these imaginary creatures with a fresh perspective, using Midjourney 5.</p><p>This time, I wanted to approach the project as if I were on an expedition to an unexplored planet, armed with just my AI camera and an insatiable curiosity. And so, I began my journey into the unknown, eager to discover the fascinating creatures that lay ahead.</p><p>I hope you enjoy discovering these creatures as much as I did.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_fedcb94e-eea7-4c46-b672-72ca5d25384d.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_fedcb94e-eea7-4c46-b672-72ca5d25384d.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_fedcb94e-eea7-4c46-b672-72ca5d25384d.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_fedcb94e-eea7-4c46-b672-72ca5d25384d.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e6003608-0c23-464e-9ef2-77b52e8ac29c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e6003608-0c23-464e-9ef2-77b52e8ac29c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e6003608-0c23-464e-9ef2-77b52e8ac29c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e6003608-0c23-464e-9ef2-77b52e8ac29c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_f58c2867-be0a-49e9-95fb-3fe549cbf61f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_f58c2867-be0a-49e9-95fb-3fe549cbf61f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_f58c2867-be0a-49e9-95fb-3fe549cbf61f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_f58c2867-be0a-49e9-95fb-3fe549cbf61f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e10acc68-666c-4f8c-9c96-f7c69b59d32a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e10acc68-666c-4f8c-9c96-f7c69b59d32a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e10acc68-666c-4f8c-9c96-f7c69b59d32a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e10acc68-666c-4f8c-9c96-f7c69b59d32a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_dc45c84b-9dda-4b7d-a418-d03462d7b2e9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_dc45c84b-9dda-4b7d-a418-d03462d7b2e9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_dc45c84b-9dda-4b7d-a418-d03462d7b2e9.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_dc45c84b-9dda-4b7d-a418-d03462d7b2e9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e087a531-5057-424d-a782-80d807ef6136.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e087a531-5057-424d-a782-80d807ef6136.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e087a531-5057-424d-a782-80d807ef6136.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_e087a531-5057-424d-a782-80d807ef6136.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cd4bf034-5a6d-4e8e-8a9d-033d2550c31e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cd4bf034-5a6d-4e8e-8a9d-033d2550c31e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cd4bf034-5a6d-4e8e-8a9d-033d2550c31e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cd4bf034-5a6d-4e8e-8a9d-033d2550c31e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cab126b4-bf85-4743-ae2e-2512da43a25e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cab126b4-bf85-4743-ae2e-2512da43a25e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cab126b4-bf85-4743-ae2e-2512da43a25e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_cab126b4-bf85-4743-ae2e-2512da43a25e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_caca7161-4f4a-4708-bda0-6511051ab5f3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_caca7161-4f4a-4708-bda0-6511051ab5f3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_caca7161-4f4a-4708-bda0-6511051ab5f3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_caca7161-4f4a-4708-bda0-6511051ab5f3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_bc601e41-12e5-40da-bddb-a284d8bfd1ae.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_bc601e41-12e5-40da-bddb-a284d8bfd1ae.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_bc601e41-12e5-40da-bddb-a284d8bfd1ae.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_bc601e41-12e5-40da-bddb-a284d8bfd1ae.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_c4be710c-5f4d-41d3-8cf2-756963ed4e5f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_c4be710c-5f4d-41d3-8cf2-756963ed4e5f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_c4be710c-5f4d-41d3-8cf2-756963ed4e5f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_c4be710c-5f4d-41d3-8cf2-756963ed4e5f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b6f5ccfc-1d7e-4585-9997-ef19ceda3815.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b6f5ccfc-1d7e-4585-9997-ef19ceda3815.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b6f5ccfc-1d7e-4585-9997-ef19ceda3815.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b6f5ccfc-1d7e-4585-9997-ef19ceda3815.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b1ae193a-a0a1-4856-ad7a-93368a6e9bee.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b1ae193a-a0a1-4856-ad7a-93368a6e9bee.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b1ae193a-a0a1-4856-ad7a-93368a6e9bee.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b1ae193a-a0a1-4856-ad7a-93368a6e9bee.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b10c69de-d1fc-4a96-aca9-d65295cf6cc5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b10c69de-d1fc-4a96-aca9-d65295cf6cc5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b10c69de-d1fc-4a96-aca9-d65295cf6cc5.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_b10c69de-d1fc-4a96-aca9-d65295cf6cc5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_ac8d0841-b815-424f-abbc-3a1232117e0c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_ac8d0841-b815-424f-abbc-3a1232117e0c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_ac8d0841-b815-424f-abbc-3a1232117e0c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_ac8d0841-b815-424f-abbc-3a1232117e0c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_aa28d9f6-bd05-4f6a-9aee-f7bf965ae462.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_aa28d9f6-bd05-4f6a-9aee-f7bf965ae462.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_aa28d9f6-bd05-4f6a-9aee-f7bf965ae462.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_aa28d9f6-bd05-4f6a-9aee-f7bf965ae462.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_a886e6b9-1a7f-4dfc-9936-553e78beb7a3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_a886e6b9-1a7f-4dfc-9936-553e78beb7a3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_a886e6b9-1a7f-4dfc-9936-553e78beb7a3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_a886e6b9-1a7f-4dfc-9936-553e78beb7a3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8e5baec4-efec-4156-b31c-418b0c7bd06c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8e5baec4-efec-4156-b31c-418b0c7bd06c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8e5baec4-efec-4156-b31c-418b0c7bd06c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8e5baec4-efec-4156-b31c-418b0c7bd06c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_9aac230f-8195-45bf-b656-c0a536f11cf9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_9aac230f-8195-45bf-b656-c0a536f11cf9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_9aac230f-8195-45bf-b656-c0a536f11cf9.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_9aac230f-8195-45bf-b656-c0a536f11cf9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8845b982-5b4a-4446-8e09-efa7da5c73e3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8845b982-5b4a-4446-8e09-efa7da5c73e3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8845b982-5b4a-4446-8e09-efa7da5c73e3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8845b982-5b4a-4446-8e09-efa7da5c73e3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_84f5e1c8-dfc6-4944-96ae-e6cd62ef3fb2.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_84f5e1c8-dfc6-4944-96ae-e6cd62ef3fb2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_84f5e1c8-dfc6-4944-96ae-e6cd62ef3fb2.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_84f5e1c8-dfc6-4944-96ae-e6cd62ef3fb2.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_7e0879d5-fc16-4cfd-a993-0b0b4254b03e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_7e0879d5-fc16-4cfd-a993-0b0b4254b03e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_7e0879d5-fc16-4cfd-a993-0b0b4254b03e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_7e0879d5-fc16-4cfd-a993-0b0b4254b03e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8231f2cd-7789-41ee-aa06-e7f2291fa360.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8231f2cd-7789-41ee-aa06-e7f2291fa360.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8231f2cd-7789-41ee-aa06-e7f2291fa360.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_8231f2cd-7789-41ee-aa06-e7f2291fa360.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_6807af06-27c8-4b1a-a767-fb50004e117b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_6807af06-27c8-4b1a-a767-fb50004e117b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_6807af06-27c8-4b1a-a767-fb50004e117b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_6807af06-27c8-4b1a-a767-fb50004e117b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_61a829f5-d2ae-4fda-a126-d4f0158042ff.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_61a829f5-d2ae-4fda-a126-d4f0158042ff.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_61a829f5-d2ae-4fda-a126-d4f0158042ff.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_61a829f5-d2ae-4fda-a126-d4f0158042ff.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5f15b2fd-6515-4065-b478-90aabb8f9a73.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5f15b2fd-6515-4065-b478-90aabb8f9a73.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5f15b2fd-6515-4065-b478-90aabb8f9a73.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5f15b2fd-6515-4065-b478-90aabb8f9a73.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5dd74a70-ed3a-4e71-96ae-43e4749b2391.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5dd74a70-ed3a-4e71-96ae-43e4749b2391.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5dd74a70-ed3a-4e71-96ae-43e4749b2391.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5dd74a70-ed3a-4e71-96ae-43e4749b2391.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5c65d857-1856-48e5-8f0a-3af11f54d4a3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5c65d857-1856-48e5-8f0a-3af11f54d4a3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5c65d857-1856-48e5-8f0a-3af11f54d4a3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_5c65d857-1856-48e5-8f0a-3af11f54d4a3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_4515f331-b391-4299-afa3-0cd153636a1e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_4515f331-b391-4299-afa3-0cd153636a1e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_4515f331-b391-4299-afa3-0cd153636a1e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_4515f331-b391-4299-afa3-0cd153636a1e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_53dad28c-05a7-4834-9b4d-5cf3ee4d4110.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_53dad28c-05a7-4834-9b4d-5cf3ee4d4110.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_53dad28c-05a7-4834-9b4d-5cf3ee4d4110.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_53dad28c-05a7-4834-9b4d-5cf3ee4d4110.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_28a1bd54-f39b-4b2c-ac72-391bce7a010b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_28a1bd54-f39b-4b2c-ac72-391bce7a010b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_28a1bd54-f39b-4b2c-ac72-391bce7a010b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_28a1bd54-f39b-4b2c-ac72-391bce7a010b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_25e4299b-8e88-416a-a6fc-3920965c1566.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_25e4299b-8e88-416a-a6fc-3920965c1566.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_25e4299b-8e88-416a-a6fc-3920965c1566.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_25e4299b-8e88-416a-a6fc-3920965c1566.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_1ddbc3ca-3df3-47a7-ba33-2c11faeaa16f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_1ddbc3ca-3df3-47a7-ba33-2c11faeaa16f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_1ddbc3ca-3df3-47a7-ba33-2c11faeaa16f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_1ddbc3ca-3df3-47a7-ba33-2c11faeaa16f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_0f384e5f-249c-4d84-b3cb-ca6bad51634f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_0f384e5f-249c-4d84-b3cb-ca6bad51634f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_0f384e5f-249c-4d84-b3cb-ca6bad51634f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_0f384e5f-249c-4d84-b3cb-ca6bad51634f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_7b784bb7-9ad9-45ff-a75c-1fe01e64dd4c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_7b784bb7-9ad9-45ff-a75c-1fe01e64dd4c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_7b784bb7-9ad9-45ff-a75c-1fe01e64dd4c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_7b784bb7-9ad9-45ff-a75c-1fe01e64dd4c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_3dbec2fd-94a9-43f0-9182-b7279b842780.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_3dbec2fd-94a9-43f0-9182-b7279b842780.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_3dbec2fd-94a9-43f0-9182-b7279b842780.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_3dbec2fd-94a9-43f0-9182-b7279b842780.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_1af3adf4-5e95-4b21-ae7c-2399f2f09872.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_1af3adf4-5e95-4b21-ae7c-2399f2f09872.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_1af3adf4-5e95-4b21-ae7c-2399f2f09872.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_huge_1af3adf4-5e95-4b21-ae7c-2399f2f09872.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_e543bbf0-012f-4e53-aafb-97d769248a70.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_e543bbf0-012f-4e53-aafb-97d769248a70.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_e543bbf0-012f-4e53-aafb-97d769248a70.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_e543bbf0-012f-4e53-aafb-97d769248a70.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd2ce3c0-d577-461d-8ff9-802c338c977d.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd2ce3c0-d577-461d-8ff9-802c338c977d.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd2ce3c0-d577-461d-8ff9-802c338c977d.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd2ce3c0-d577-461d-8ff9-802c338c977d.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_131bb970-9dbd-4dbe-a837-f4daea8d2c01.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_131bb970-9dbd-4dbe-a837-f4daea8d2c01.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_131bb970-9dbd-4dbe-a837-f4daea8d2c01.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_131bb970-9dbd-4dbe-a837-f4daea8d2c01.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_6021468c-34f1-4e03-a856-4b5fbdae85e9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_6021468c-34f1-4e03-a856-4b5fbdae85e9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_6021468c-34f1-4e03-a856-4b5fbdae85e9.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_huge_bizarre_but_beautiful_6021468c-34f1-4e03-a856-4b5fbdae85e9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_f5859086-5d98-48f2-92fb-22daca3e8385.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_f5859086-5d98-48f2-92fb-22daca3e8385.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_f5859086-5d98-48f2-92fb-22daca3e8385.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_f5859086-5d98-48f2-92fb-22daca3e8385.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b89cc4d4-d8ec-45c0-abc0-024df8661bae.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b89cc4d4-d8ec-45c0-abc0-024df8661bae.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b89cc4d4-d8ec-45c0-abc0-024df8661bae.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b89cc4d4-d8ec-45c0-abc0-024df8661bae.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_cec27311-c4dd-4268-9ca2-d8dd22f19dbc.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_cec27311-c4dd-4268-9ca2-d8dd22f19dbc.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_cec27311-c4dd-4268-9ca2-d8dd22f19dbc.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_cec27311-c4dd-4268-9ca2-d8dd22f19dbc.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_90a9b683-f9f5-4e8a-b3fe-f7c945702ec4.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_90a9b683-f9f5-4e8a-b3fe-f7c945702ec4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_90a9b683-f9f5-4e8a-b3fe-f7c945702ec4.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_90a9b683-f9f5-4e8a-b3fe-f7c945702ec4.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b195ea6c-b06c-4c4a-9314-87f2de3dea8e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b195ea6c-b06c-4c4a-9314-87f2de3dea8e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b195ea6c-b06c-4c4a-9314-87f2de3dea8e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_b195ea6c-b06c-4c4a-9314-87f2de3dea8e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_83b1a9f7-8c60-4e63-a4d0-aa98fbb604c6.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_83b1a9f7-8c60-4e63-a4d0-aa98fbb604c6.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_83b1a9f7-8c60-4e63-a4d0-aa98fbb604c6.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_83b1a9f7-8c60-4e63-a4d0-aa98fbb604c6.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_3b82f7fd-efec-4560-900d-39d3c3b91437.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_3b82f7fd-efec-4560-900d-39d3c3b91437.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_3b82f7fd-efec-4560-900d-39d3c3b91437.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_3b82f7fd-efec-4560-900d-39d3c3b91437.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_1283fbb9-4213-4ee1-bcd9-95ceeb5c856c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_1283fbb9-4213-4ee1-bcd9-95ceeb5c856c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_1283fbb9-4213-4ee1-bcd9-95ceeb5c856c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_1283fbb9-4213-4ee1-bcd9-95ceeb5c856c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_03af6a7c-72e6-4543-8cb7-5a5fc38343bc.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_03af6a7c-72e6-4543-8cb7-5a5fc38343bc.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_03af6a7c-72e6-4543-8cb7-5a5fc38343bc.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_03af6a7c-72e6-4543-8cb7-5a5fc38343bc.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__e8990b05-8a40-43ce-96d0-21f6bc2a7a2a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__e8990b05-8a40-43ce-96d0-21f6bc2a7a2a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__e8990b05-8a40-43ce-96d0-21f6bc2a7a2a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__e8990b05-8a40-43ce-96d0-21f6bc2a7a2a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__dbe34131-aa00-4752-b8fb-b08656059630.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__dbe34131-aa00-4752-b8fb-b08656059630.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__dbe34131-aa00-4752-b8fb-b08656059630.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__dbe34131-aa00-4752-b8fb-b08656059630.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_translucent__6de3ccb3-a3ea-4125-bddc-ad5e4d45a827.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_translucent__6de3ccb3-a3ea-4125-bddc-ad5e4d45a827.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_translucent__6de3ccb3-a3ea-4125-bddc-ad5e4d45a827.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_translucent__6de3ccb3-a3ea-4125-bddc-ad5e4d45a827.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_fd1f282d-c293-49c1-b3f9-96ae2901e826-1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_fd1f282d-c293-49c1-b3f9-96ae2901e826-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_fd1f282d-c293-49c1-b3f9-96ae2901e826-1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_fd1f282d-c293-49c1-b3f9-96ae2901e826-1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__9f1da69b-8179-4e8d-8d39-86487bb202a9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__9f1da69b-8179-4e8d-8d39-86487bb202a9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__9f1da69b-8179-4e8d-8d39-86487bb202a9.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_massive_lumbering__9f1da69b-8179-4e8d-8d39-86487bb202a9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f594423b-96fc-4216-9aa6-967497910985.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f594423b-96fc-4216-9aa6-967497910985.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f594423b-96fc-4216-9aa6-967497910985.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f594423b-96fc-4216-9aa6-967497910985.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f3559aac-27c6-4a2c-9b75-dbcc0a47e6ad.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f3559aac-27c6-4a2c-9b75-dbcc0a47e6ad.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f3559aac-27c6-4a2c-9b75-dbcc0a47e6ad.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f3559aac-27c6-4a2c-9b75-dbcc0a47e6ad.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f8f8f145-8fd9-47f0-8224-377ed842ab53.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f8f8f145-8fd9-47f0-8224-377ed842ab53.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f8f8f145-8fd9-47f0-8224-377ed842ab53.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_f8f8f145-8fd9-47f0-8224-377ed842ab53.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ee22da82-3f6e-41cd-be33-eebcf3297bf3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ee22da82-3f6e-41cd-be33-eebcf3297bf3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ee22da82-3f6e-41cd-be33-eebcf3297bf3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ee22da82-3f6e-41cd-be33-eebcf3297bf3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d64a8d03-35c7-44b8-8bbd-c71f9141dcdd.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d64a8d03-35c7-44b8-8bbd-c71f9141dcdd.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d64a8d03-35c7-44b8-8bbd-c71f9141dcdd.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d64a8d03-35c7-44b8-8bbd-c71f9141dcdd.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_de1979a7-d79c-429b-9832-285dc83d319c-1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_de1979a7-d79c-429b-9832-285dc83d319c-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_de1979a7-d79c-429b-9832-285dc83d319c-1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_de1979a7-d79c-429b-9832-285dc83d319c-1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d15f4954-611a-4117-a505-d10bdfb3a592.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d15f4954-611a-4117-a505-d10bdfb3a592.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d15f4954-611a-4117-a505-d10bdfb3a592.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_d15f4954-611a-4117-a505-d10bdfb3a592.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cba57646-a5f4-4aa0-b92f-1ccb39abf84e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cba57646-a5f4-4aa0-b92f-1ccb39abf84e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cba57646-a5f4-4aa0-b92f-1ccb39abf84e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cba57646-a5f4-4aa0-b92f-1ccb39abf84e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c89831a5-03d9-4085-9621-55b2669fcfbf.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c89831a5-03d9-4085-9621-55b2669fcfbf.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c89831a5-03d9-4085-9621-55b2669fcfbf.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c89831a5-03d9-4085-9621-55b2669fcfbf.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c03b9f9a-0813-4efd-995e-23c067befb60.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c03b9f9a-0813-4efd-995e-23c067befb60.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c03b9f9a-0813-4efd-995e-23c067befb60.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_c03b9f9a-0813-4efd-995e-23c067befb60.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cab41208-4b3e-4160-b721-f7d540e64645.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cab41208-4b3e-4160-b721-f7d540e64645.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cab41208-4b3e-4160-b721-f7d540e64645.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_cab41208-4b3e-4160-b721-f7d540e64645.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ba265224-f170-4651-8581-58d4acc5fa35.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ba265224-f170-4651-8581-58d4acc5fa35.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ba265224-f170-4651-8581-58d4acc5fa35.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ba265224-f170-4651-8581-58d4acc5fa35.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b9d2f8a4-9813-4119-8bdf-9e3472b52f59.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b9d2f8a4-9813-4119-8bdf-9e3472b52f59.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b9d2f8a4-9813-4119-8bdf-9e3472b52f59.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b9d2f8a4-9813-4119-8bdf-9e3472b52f59.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b6b4ed6e-091f-40d8-9c4f-1e5968c97bc3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b6b4ed6e-091f-40d8-9c4f-1e5968c97bc3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b6b4ed6e-091f-40d8-9c4f-1e5968c97bc3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b6b4ed6e-091f-40d8-9c4f-1e5968c97bc3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ad14eb9d-f394-457e-9a70-c01582b55e9f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ad14eb9d-f394-457e-9a70-c01582b55e9f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ad14eb9d-f394-457e-9a70-c01582b55e9f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_ad14eb9d-f394-457e-9a70-c01582b55e9f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b39f13db-5dc0-4676-8609-fc7e1de6e692.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b39f13db-5dc0-4676-8609-fc7e1de6e692.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b39f13db-5dc0-4676-8609-fc7e1de6e692.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_b39f13db-5dc0-4676-8609-fc7e1de6e692.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_a7837047-34d5-49c0-92f9-d1b990beaf63.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_a7837047-34d5-49c0-92f9-d1b990beaf63.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_a7837047-34d5-49c0-92f9-d1b990beaf63.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_a7837047-34d5-49c0-92f9-d1b990beaf63.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_936b4332-d8f6-470c-8e31-9a1c54774bb3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_936b4332-d8f6-470c-8e31-9a1c54774bb3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_936b4332-d8f6-470c-8e31-9a1c54774bb3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_936b4332-d8f6-470c-8e31-9a1c54774bb3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_99c44e0b-2c4b-4124-b813-a212df92dbbe.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_99c44e0b-2c4b-4124-b813-a212df92dbbe.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_99c44e0b-2c4b-4124-b813-a212df92dbbe.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_99c44e0b-2c4b-4124-b813-a212df92dbbe.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_907f4d2d-4c69-41af-bb17-ca93cd719a11.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_907f4d2d-4c69-41af-bb17-ca93cd719a11.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_907f4d2d-4c69-41af-bb17-ca93cd719a11.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_907f4d2d-4c69-41af-bb17-ca93cd719a11.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_8580b37f-3ad9-4c65-ab86-842c96608b9c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_8580b37f-3ad9-4c65-ab86-842c96608b9c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_8580b37f-3ad9-4c65-ab86-842c96608b9c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_8580b37f-3ad9-4c65-ab86-842c96608b9c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e562eb1-f7b7-4851-91b8-71ac32b87bd4.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e562eb1-f7b7-4851-91b8-71ac32b87bd4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e562eb1-f7b7-4851-91b8-71ac32b87bd4.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e562eb1-f7b7-4851-91b8-71ac32b87bd4.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e227374-0baf-4a5a-bad8-6b07b1cd82d1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e227374-0baf-4a5a-bad8-6b07b1cd82d1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e227374-0baf-4a5a-bad8-6b07b1cd82d1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7e227374-0baf-4a5a-bad8-6b07b1cd82d1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_78e2862b-dda0-4c52-9f7f-1ee42f04d57a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_78e2862b-dda0-4c52-9f7f-1ee42f04d57a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_78e2862b-dda0-4c52-9f7f-1ee42f04d57a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_78e2862b-dda0-4c52-9f7f-1ee42f04d57a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_73f60863-37c2-42d6-a504-34e6fb998585.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_73f60863-37c2-42d6-a504-34e6fb998585.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_73f60863-37c2-42d6-a504-34e6fb998585.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_73f60863-37c2-42d6-a504-34e6fb998585.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7179c14f-31a2-43ad-b3c5-4953b0d7a5bb.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7179c14f-31a2-43ad-b3c5-4953b0d7a5bb.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7179c14f-31a2-43ad-b3c5-4953b0d7a5bb.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_7179c14f-31a2-43ad-b3c5-4953b0d7a5bb.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_6a11fe33-1b60-47f8-a936-4f56c74cc9e8.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_6a11fe33-1b60-47f8-a936-4f56c74cc9e8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_6a11fe33-1b60-47f8-a936-4f56c74cc9e8.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_6a11fe33-1b60-47f8-a936-4f56c74cc9e8.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fa24476-9fd5-4b4e-994a-51fd28f638b2.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fa24476-9fd5-4b4e-994a-51fd28f638b2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fa24476-9fd5-4b4e-994a-51fd28f638b2.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fa24476-9fd5-4b4e-994a-51fd28f638b2.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5953143d-a2bd-4c4e-91ec-d67f10d22b17.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5953143d-a2bd-4c4e-91ec-d67f10d22b17.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5953143d-a2bd-4c4e-91ec-d67f10d22b17.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5953143d-a2bd-4c4e-91ec-d67f10d22b17.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_574d228e-a65d-4ff2-be8e-e0cdd98a715d.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_574d228e-a65d-4ff2-be8e-e0cdd98a715d.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_574d228e-a65d-4ff2-be8e-e0cdd98a715d.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_574d228e-a65d-4ff2-be8e-e0cdd98a715d.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fd9e920-5879-41fd-807b-d6df84300660.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fd9e920-5879-41fd-807b-d6df84300660.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fd9e920-5879-41fd-807b-d6df84300660.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_5fd9e920-5879-41fd-807b-d6df84300660.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_4d91f357-036d-42bd-8975-d4ebb42ad1de.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_4d91f357-036d-42bd-8975-d4ebb42ad1de.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_4d91f357-036d-42bd-8975-d4ebb42ad1de.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_4d91f357-036d-42bd-8975-d4ebb42ad1de.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_3fb555a0-0f16-45ca-ba4e-3dce1f74b482.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_3fb555a0-0f16-45ca-ba4e-3dce1f74b482.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_3fb555a0-0f16-45ca-ba4e-3dce1f74b482.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_3fb555a0-0f16-45ca-ba4e-3dce1f74b482.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_45eb903e-beaa-43c9-ba75-38529e8bf26b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_45eb903e-beaa-43c9-ba75-38529e8bf26b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_45eb903e-beaa-43c9-ba75-38529e8bf26b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_45eb903e-beaa-43c9-ba75-38529e8bf26b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_35766ac4-c230-4863-bc63-8494f2ad63bb.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_35766ac4-c230-4863-bc63-8494f2ad63bb.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_35766ac4-c230-4863-bc63-8494f2ad63bb.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_35766ac4-c230-4863-bc63-8494f2ad63bb.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_36cc5071-551f-4d9a-a254-57ed1a8e9603.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_36cc5071-551f-4d9a-a254-57ed1a8e9603.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_36cc5071-551f-4d9a-a254-57ed1a8e9603.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_36cc5071-551f-4d9a-a254-57ed1a8e9603.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_12f7c745-8a26-4027-94d9-5f253bcbc31a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_12f7c745-8a26-4027-94d9-5f253bcbc31a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_12f7c745-8a26-4027-94d9-5f253bcbc31a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_12f7c745-8a26-4027-94d9-5f253bcbc31a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_0e399f03-04cc-43da-b70e-6c1e6932eb09.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_0e399f03-04cc-43da-b70e-6c1e6932eb09.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_0e399f03-04cc-43da-b70e-6c1e6932eb09.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_0e399f03-04cc-43da-b70e-6c1e6932eb09.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_14dcb2c5-2a5e-483c-b069-908916c227c9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_14dcb2c5-2a5e-483c-b069-908916c227c9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_14dcb2c5-2a5e-483c-b069-908916c227c9.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_14dcb2c5-2a5e-483c-b069-908916c227c9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_046233f0-0f7c-41d1-add4-f782a959018b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_046233f0-0f7c-41d1-add4-f782a959018b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_046233f0-0f7c-41d1-add4-f782a959018b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_046233f0-0f7c-41d1-add4-f782a959018b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__67c7f42b-3a0f-4c9a-8626-28cb35630645.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__67c7f42b-3a0f-4c9a-8626-28cb35630645.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__67c7f42b-3a0f-4c9a-8626-28cb35630645.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__67c7f42b-3a0f-4c9a-8626-28cb35630645.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__2ae14c14-4fc2-48f5-896d-5a6fb03db003.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__2ae14c14-4fc2-48f5-896d-5a6fb03db003.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__2ae14c14-4fc2-48f5-896d-5a6fb03db003.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__2ae14c14-4fc2-48f5-896d-5a6fb03db003.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__47b79cf9-5966-4540-8e1f-13991647ee60.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__47b79cf9-5966-4540-8e1f-13991647ee60.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__47b79cf9-5966-4540-8e1f-13991647ee60.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherwordly__47b79cf9-5966-4540-8e1f-13991647ee60.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_d42fd9b8-d638-4b79-95fd-b01a6234289d.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_d42fd9b8-d638-4b79-95fd-b01a6234289d.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_d42fd9b8-d638-4b79-95fd-b01a6234289d.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_d42fd9b8-d638-4b79-95fd-b01a6234289d.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_80ccc9f3-0a43-4863-85af-3d62a3ffdf65.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_80ccc9f3-0a43-4863-85af-3d62a3ffdf65.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_80ccc9f3-0a43-4863-85af-3d62a3ffdf65.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_80ccc9f3-0a43-4863-85af-3d62a3ffdf65.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_967ecbce-e850-4ab7-9fc7-cacd58a95db2.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_967ecbce-e850-4ab7-9fc7-cacd58a95db2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_967ecbce-e850-4ab7-9fc7-cacd58a95db2.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_967ecbce-e850-4ab7-9fc7-cacd58a95db2.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_ded44cd3-3731-49ed-9491-00ff56e4f475-1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_ded44cd3-3731-49ed-9491-00ff56e4f475-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_ded44cd3-3731-49ed-9491-00ff56e4f475-1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_ded44cd3-3731-49ed-9491-00ff56e4f475-1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__e1cffa48-8527-4165-97de-d630e321897b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__e1cffa48-8527-4165-97de-d630e321897b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__e1cffa48-8527-4165-97de-d630e321897b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__e1cffa48-8527-4165-97de-d630e321897b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_5900bbf4-2363-48a2-a053-d4bedf925d57.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_5900bbf4-2363-48a2-a053-d4bedf925d57.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_5900bbf4-2363-48a2-a053-d4bedf925d57.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_and_beautifu_5900bbf4-2363-48a2-a053-d4bedf925d57.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9a6b5d16-c888-4b7c-96cc-1653475e3ee3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9a6b5d16-c888-4b7c-96cc-1653475e3ee3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9a6b5d16-c888-4b7c-96cc-1653475e3ee3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9a6b5d16-c888-4b7c-96cc-1653475e3ee3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9405ce2f-af23-4f02-bfc5-b957482223e3.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9405ce2f-af23-4f02-bfc5-b957482223e3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9405ce2f-af23-4f02-bfc5-b957482223e3.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__9405ce2f-af23-4f02-bfc5-b957482223e3.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__8f6f5536-96d3-4ee3-b437-2ccbe22e462e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__8f6f5536-96d3-4ee3-b437-2ccbe22e462e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__8f6f5536-96d3-4ee3-b437-2ccbe22e462e.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__8f6f5536-96d3-4ee3-b437-2ccbe22e462e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__3e59b47d-f335-40ed-90b9-978784a82de7.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__3e59b47d-f335-40ed-90b9-978784a82de7.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__3e59b47d-f335-40ed-90b9-978784a82de7.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__3e59b47d-f335-40ed-90b9-978784a82de7.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__39fade7b-84ec-4719-b1a3-fbf8f3673c32.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__39fade7b-84ec-4719-b1a3-fbf8f3673c32.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__39fade7b-84ec-4719-b1a3-fbf8f3673c32.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__39fade7b-84ec-4719-b1a3-fbf8f3673c32.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__2878fc16-6e60-46b0-a453-918549026698.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__2878fc16-6e60-46b0-a453-918549026698.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__2878fc16-6e60-46b0-a453-918549026698.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__2878fc16-6e60-46b0-a453-918549026698.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__0ee4767f-0bc1-4402-814e-7d7104816fe5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__0ee4767f-0bc1-4402-814e-7d7104816fe5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__0ee4767f-0bc1-4402-814e-7d7104816fe5.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__0ee4767f-0bc1-4402-814e-7d7104816fe5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_e691f1f6-158c-4b90-8f28-eb4457aee95a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_e691f1f6-158c-4b90-8f28-eb4457aee95a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_e691f1f6-158c-4b90-8f28-eb4457aee95a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_e691f1f6-158c-4b90-8f28-eb4457aee95a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__a59ecd33-a0c1-459c-8348-a80f584c515b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__a59ecd33-a0c1-459c-8348-a80f584c515b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__a59ecd33-a0c1-459c-8348-a80f584c515b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__a59ecd33-a0c1-459c-8348-a80f584c515b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__077db32a-ccc4-465e-9606-719691cdce1b-1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__077db32a-ccc4-465e-9606-719691cdce1b-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__077db32a-ccc4-465e-9606-719691cdce1b-1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_huge_otherworldly__077db32a-ccc4-465e-9606-719691cdce1b-1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_c18414d9-e3d9-4a89-aa17-e5df0bfb6248.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_c18414d9-e3d9-4a89-aa17-e5df0bfb6248.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_c18414d9-e3d9-4a89-aa17-e5df0bfb6248.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_c18414d9-e3d9-4a89-aa17-e5df0bfb6248.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_75898311-9d0c-4909-a894-ce6ddb7b4070.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_75898311-9d0c-4909-a894-ce6ddb7b4070.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_75898311-9d0c-4909-a894-ce6ddb7b4070.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_75898311-9d0c-4909-a894-ce6ddb7b4070.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_7201162f-78ac-44de-b760-b7571edd092a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_7201162f-78ac-44de-b760-b7571edd092a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_7201162f-78ac-44de-b760-b7571edd092a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_gigantic_and_beaut_7201162f-78ac-44de-b760-b7571edd092a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_but_beautiful_alie_f836a1cd-691c-4fb2-b7c1-199575c64b38.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_but_beautiful_alie_f836a1cd-691c-4fb2-b7c1-199575c64b38.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_but_beautiful_alie_f836a1cd-691c-4fb2-b7c1-199575c64b38.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_but_beautiful_alie_f836a1cd-691c-4fb2-b7c1-199575c64b38.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_d2861a9e-3176-4648-85d0-1d7e7d46835a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_d2861a9e-3176-4648-85d0-1d7e7d46835a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_d2861a9e-3176-4648-85d0-1d7e7d46835a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_d2861a9e-3176-4648-85d0-1d7e7d46835a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_a25da7b9-04f5-478d-82a8-a27713c7a9c7.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_a25da7b9-04f5-478d-82a8-a27713c7a9c7.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_a25da7b9-04f5-478d-82a8-a27713c7a9c7.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_and_beautiful_alie_a25da7b9-04f5-478d-82a8-a27713c7a9c7.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_bd3fc4aa-5d60-491c-b3dd-d996162c97ec.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_bd3fc4aa-5d60-491c-b3dd-d996162c97ec.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_bd3fc4aa-5d60-491c-b3dd-d996162c97ec.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_bd3fc4aa-5d60-491c-b3dd-d996162c97ec.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_aa90d207-514d-4f25-b305-16fc77662041.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_aa90d207-514d-4f25-b305-16fc77662041.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_aa90d207-514d-4f25-b305-16fc77662041.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_aa90d207-514d-4f25-b305-16fc77662041.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_7dac5990-8cb9-456a-820b-5e9dfb66cb12.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_7dac5990-8cb9-456a-820b-5e9dfb66cb12.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_7dac5990-8cb9-456a-820b-5e9dfb66cb12.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_7dac5990-8cb9-456a-820b-5e9dfb66cb12.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_54c9e34c-f9f5-4ae6-873d-e9b220e1f458.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_54c9e34c-f9f5-4ae6-873d-e9b220e1f458.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_54c9e34c-f9f5-4ae6-873d-e9b220e1f458.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_54c9e34c-f9f5-4ae6-873d-e9b220e1f458.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_40c3b26f-dae8-4094-a423-36495ddba6e0.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_40c3b26f-dae8-4094-a423-36495ddba6e0.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_40c3b26f-dae8-4094-a423-36495ddba6e0.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_40c3b26f-dae8-4094-a423-36495ddba6e0.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_05ae8a7f-f80a-422a-913c-c64554d9df3d.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_05ae8a7f-f80a-422a-913c-c64554d9df3d.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_05ae8a7f-f80a-422a-913c-c64554d9df3d.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_05ae8a7f-f80a-422a-913c-c64554d9df3d.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_666a9e4b-1c92-41f9-bc2e-a45bcc67b2db-1.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_666a9e4b-1c92-41f9-bc2e-a45bcc67b2db-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_666a9e4b-1c92-41f9-bc2e-a45bcc67b2db-1.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_666a9e4b-1c92-41f9-bc2e-a45bcc67b2db-1.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_on_another_planet._Luminous_Fuz_c8413e3e-458f-4270-8373-b5e43a1977f6.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_on_another_planet._Luminous_Fuz_c8413e3e-458f-4270-8373-b5e43a1977f6.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_on_another_planet._Luminous_Fuz_c8413e3e-458f-4270-8373-b5e43a1977f6.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_on_another_planet._Luminous_Fuz_c8413e3e-458f-4270-8373-b5e43a1977f6.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_30239009-aada-46b6-b2c2-789db465abf5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_30239009-aada-46b6-b2c2-789db465abf5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_30239009-aada-46b6-b2c2-789db465abf5.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_30239009-aada-46b6-b2c2-789db465abf5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_d6fe8440-9841-4ea9-b53e-11819f1f6702.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_d6fe8440-9841-4ea9-b53e-11819f1f6702.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_d6fe8440-9841-4ea9-b53e-11819f1f6702.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_d6fe8440-9841-4ea9-b53e-11819f1f6702.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_odd_crystalline_otherworl_134853a0-9727-4fa6-b647-dfeb6ecc893c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_an_odd_crystalline_otherworl_134853a0-9727-4fa6-b647-dfeb6ecc893c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_an_odd_crystalline_otherworl_134853a0-9727-4fa6-b647-dfeb6ecc893c.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_odd_crystalline_otherworl_134853a0-9727-4fa6-b647-dfeb6ecc893c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_f3b4360e-3d48-4bb1-9d01-8f30955fea62.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_f3b4360e-3d48-4bb1-9d01-8f30955fea62.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_f3b4360e-3d48-4bb1-9d01-8f30955fea62.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_f3b4360e-3d48-4bb1-9d01-8f30955fea62.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_extraordinary_feathered_o_c862e358-1b19-4526-92b4-b01d607ecefc.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_an_extraordinary_feathered_o_c862e358-1b19-4526-92b4-b01d607ecefc.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_an_extraordinary_feathered_o_c862e358-1b19-4526-92b4-b01d607ecefc.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_extraordinary_feathered_o_c862e358-1b19-4526-92b4-b01d607ecefc.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_9d78ebd3-8773-491d-b142-fb8038b65ee8.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_9d78ebd3-8773-491d-b142-fb8038b65ee8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_9d78ebd3-8773-491d-b142-fb8038b65ee8.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_9d78ebd3-8773-491d-b142-fb8038b65ee8.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_ethereal_otherwor_54e9cd32-54cf-4daf-ac8e-c07c0d1c9c3a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_ethereal_otherwor_54e9cd32-54cf-4daf-ac8e-c07c0d1c9c3a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_ethereal_otherwor_54e9cd32-54cf-4daf-ac8e-c07c0d1c9c3a.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_ethereal_otherwor_54e9cd32-54cf-4daf-ac8e-c07c0d1c9c3a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_63a10ed2-c9db-459c-a3ee-94a1bad394a8.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_63a10ed2-c9db-459c-a3ee-94a1bad394a8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_63a10ed2-c9db-459c-a3ee-94a1bad394a8.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_63a10ed2-c9db-459c-a3ee-94a1bad394a8.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_fascinating_serpentine_oth_61b30d18-4168-4abe-aa36-7713380731c8.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_fascinating_serpentine_oth_61b30d18-4168-4abe-aa36-7713380731c8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_fascinating_serpentine_oth_61b30d18-4168-4abe-aa36-7713380731c8.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_fascinating_serpentine_oth_61b30d18-4168-4abe-aa36-7713380731c8.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_mesmerizing_otherworldly_a_b2a5005e-1f26-4cc9-ad3c-a84aa6cb3694.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_mesmerizing_otherworldly_a_b2a5005e-1f26-4cc9-ad3c-a84aa6cb3694.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_mesmerizing_otherworldly_a_b2a5005e-1f26-4cc9-ad3c-a84aa6cb3694.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_mesmerizing_otherworldly_a_b2a5005e-1f26-4cc9-ad3c-a84aa6cb3694.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_a9e06841-2a5d-4dd3-93e5-da37d7d6400b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_a9e06841-2a5d-4dd3-93e5-da37d7d6400b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_a9e06841-2a5d-4dd3-93e5-da37d7d6400b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_a9e06841-2a5d-4dd3-93e5-da37d7d6400b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Close-up_photograph_of_a_colossal_armored_creature__b92b863c-c2ca-44d9-a923-99fc6e087504.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Close-up_photograph_of_a_colossal_armored_creature__b92b863c-c2ca-44d9-a923-99fc6e087504.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Close-up_photograph_of_a_colossal_armored_creature__b92b863c-c2ca-44d9-a923-99fc6e087504.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Close-up_photograph_of_a_colossal_armored_creature__b92b863c-c2ca-44d9-a923-99fc6e087504.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_77578b1b-1371-446c-98b8-06257daebff5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_77578b1b-1371-446c-98b8-06257daebff5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_77578b1b-1371-446c-98b8-06257daebff5.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_phosphorescent_oth_77578b1b-1371-446c-98b8-06257daebff5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_armored_otherworld_e0d36feb-e206-42e8-babe-e5cd4f9a8f9f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_armored_otherworld_e0d36feb-e206-42e8-babe-e5cd4f9a8f9f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_armored_otherworld_e0d36feb-e206-42e8-babe-e5cd4f9a8f9f.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_bizarre_armored_otherworld_e0d36feb-e206-42e8-babe-e5cd4f9a8f9f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b722a63a-2e31-4efe-b08d-991e9963bbe8.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b722a63a-2e31-4efe-b08d-991e9963bbe8.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b722a63a-2e31-4efe-b08d-991e9963bbe8.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b722a63a-2e31-4efe-b08d-991e9963bbe8.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_eac0ca6d-ad57-424d-87e7-5862da171b0f.png" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_eac0ca6d-ad57-424d-87e7-5862da171b0f.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_eac0ca6d-ad57-424d-87e7-5862da171b0f.png 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_eac0ca6d-ad57-424d-87e7-5862da171b0f.png 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_632e5529-fe49-4222-a18d-873827cd254b.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_632e5529-fe49-4222-a18d-873827cd254b.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_632e5529-fe49-4222-a18d-873827cd254b.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_632e5529-fe49-4222-a18d-873827cd254b.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_e665fb70-b15f-4cc9-b2b7-17a716d4d3e5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_e665fb70-b15f-4cc9-b2b7-17a716d4d3e5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_e665fb70-b15f-4cc9-b2b7-17a716d4d3e5.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_e665fb70-b15f-4cc9-b2b7-17a716d4d3e5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_10564c81-dba5-49fe-ae27-4b6d087c50cd.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_10564c81-dba5-49fe-ae27-4b6d087c50cd.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_10564c81-dba5-49fe-ae27-4b6d087c50cd.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_10564c81-dba5-49fe-ae27-4b6d087c50cd.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_ecb6746f-0d5f-40b3-9f17-b3e56ad3c613.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_ecb6746f-0d5f-40b3-9f17-b3e56ad3c613.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_ecb6746f-0d5f-40b3-9f17-b3e56ad3c613.jpg 1000w, https://wingedsheep.com/content/images/2023/04/wingedsheep_Wildlife_photograph_by_Melissa_Groo_of_a_peculiar_m_ecb6746f-0d5f-40b3-9f17-b3e56ad3c613.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_09c7e336-e4bb-46c0-801e-fc9140de6070.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_09c7e336-e4bb-46c0-801e-fc9140de6070.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_09c7e336-e4bb-46c0-801e-fc9140de6070.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_09c7e336-e4bb-46c0-801e-fc9140de6070.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_719122eb-be53-4e15-95f1-35068378060a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_719122eb-be53-4e15-95f1-35068378060a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_719122eb-be53-4e15-95f1-35068378060a.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_719122eb-be53-4e15-95f1-35068378060a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_77174f8b-a253-4fc4-a75d-23ab1b68148c.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_77174f8b-a253-4fc4-a75d-23ab1b68148c.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_77174f8b-a253-4fc4-a75d-23ab1b68148c.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_77174f8b-a253-4fc4-a75d-23ab1b68148c.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_85e92c52-58fb-4162-a894-076439e09f13.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_85e92c52-58fb-4162-a894-076439e09f13.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_85e92c52-58fb-4162-a894-076439e09f13.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_85e92c52-58fb-4162-a894-076439e09f13.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a443c411-372f-4d62-9bb9-c6989213a2ef.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a443c411-372f-4d62-9bb9-c6989213a2ef.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a443c411-372f-4d62-9bb9-c6989213a2ef.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a443c411-372f-4d62-9bb9-c6989213a2ef.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_bba4c483-297b-4423-96e2-615ea625370f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_bba4c483-297b-4423-96e2-615ea625370f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_bba4c483-297b-4423-96e2-615ea625370f.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_bba4c483-297b-4423-96e2-615ea625370f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_cf22f658-e53c-47ce-92ab-34bb05ce71cf.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_cf22f658-e53c-47ce-92ab-34bb05ce71cf.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_cf22f658-e53c-47ce-92ab-34bb05ce71cf.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_cf22f658-e53c-47ce-92ab-34bb05ce71cf.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5532c5b8-f850-49a8-b564-fd7322b0bf29.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5532c5b8-f850-49a8-b564-fd7322b0bf29.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5532c5b8-f850-49a8-b564-fd7322b0bf29.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5532c5b8-f850-49a8-b564-fd7322b0bf29.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5c715b96-ec8b-4236-897e-22650b9356c4.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5c715b96-ec8b-4236-897e-22650b9356c4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5c715b96-ec8b-4236-897e-22650b9356c4.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_5c715b96-ec8b-4236-897e-22650b9356c4.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_85391e6b-8a1f-48c6-afc0-4a3dcc3360dc.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_85391e6b-8a1f-48c6-afc0-4a3dcc3360dc.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_85391e6b-8a1f-48c6-afc0-4a3dcc3360dc.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_agile_climbing_oth_85391e6b-8a1f-48c6-afc0-4a3dcc3360dc.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_e26c3d05-e7b1-4e49-88bc-cc2dfbeb9c55.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_e26c3d05-e7b1-4e49-88bc-cc2dfbeb9c55.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_e26c3d05-e7b1-4e49-88bc-cc2dfbeb9c55.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_large_otherworldly_e26c3d05-e7b1-4e49-88bc-cc2dfbeb9c55.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_19a31924-2e85-4bc4-9eec-e6bfd225b148.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_19a31924-2e85-4bc4-9eec-e6bfd225b148.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_19a31924-2e85-4bc4-9eec-e6bfd225b148.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_19a31924-2e85-4bc4-9eec-e6bfd225b148.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_2f835cfd-6dc7-49fe-a90e-5309dade6765.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_2f835cfd-6dc7-49fe-a90e-5309dade6765.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_2f835cfd-6dc7-49fe-a90e-5309dade6765.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_2f835cfd-6dc7-49fe-a90e-5309dade6765.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_5dfb9870-b1a0-48cb-b2ec-37a24faa13e0.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_5dfb9870-b1a0-48cb-b2ec-37a24faa13e0.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_5dfb9870-b1a0-48cb-b2ec-37a24faa13e0.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_5dfb9870-b1a0-48cb-b2ec-37a24faa13e0.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_d8aadec7-34e0-4754-b612-881477666e22.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_d8aadec7-34e0-4754-b612-881477666e22.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_d8aadec7-34e0-4754-b612-881477666e22.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_bizarre_otherworldly_and_b_d8aadec7-34e0-4754-b612-881477666e22.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_21c36fed-cbd7-4bdc-8ac5-67be7222db2e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_21c36fed-cbd7-4bdc-8ac5-67be7222db2e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_21c36fed-cbd7-4bdc-8ac5-67be7222db2e.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_21c36fed-cbd7-4bdc-8ac5-67be7222db2e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_72decae1-8a20-4e01-b53d-5fb72c659dcf.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_72decae1-8a20-4e01-b53d-5fb72c659dcf.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_72decae1-8a20-4e01-b53d-5fb72c659dcf.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_72decae1-8a20-4e01-b53d-5fb72c659dcf.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_de09927d-2cd7-489d-8ec6-b95a11f633cc.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_de09927d-2cd7-489d-8ec6-b95a11f633cc.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_de09927d-2cd7-489d-8ec6-b95a11f633cc.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_de09927d-2cd7-489d-8ec6-b95a11f633cc.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd79eee8-67b6-4b92-8401-24b9bd22970f.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd79eee8-67b6-4b92-8401-24b9bd22970f.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd79eee8-67b6-4b92-8401-24b9bd22970f.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_alie_fd79eee8-67b6-4b92-8401-24b9bd22970f.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_2809cd2b-2da4-4416-b1a6-5436eeff46ba.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_2809cd2b-2da4-4416-b1a6-5436eeff46ba.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_2809cd2b-2da4-4416-b1a6-5436eeff46ba.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_and_beautiful_othe_2809cd2b-2da4-4416-b1a6-5436eeff46ba.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_14ddab1c-7281-4e34-9814-4d1bef13828a.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_14ddab1c-7281-4e34-9814-4d1bef13828a.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_14ddab1c-7281-4e34-9814-4d1bef13828a.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_14ddab1c-7281-4e34-9814-4d1bef13828a.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_5d8eb471-6504-410c-87b7-8e713d8a00a2.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_5d8eb471-6504-410c-87b7-8e713d8a00a2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_5d8eb471-6504-410c-87b7-8e713d8a00a2.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_5d8eb471-6504-410c-87b7-8e713d8a00a2.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_610e5be5-26e7-4a7c-8504-65f0541947c0.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_610e5be5-26e7-4a7c-8504-65f0541947c0.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_610e5be5-26e7-4a7c-8504-65f0541947c0.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_610e5be5-26e7-4a7c-8504-65f0541947c0.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_a0da4e86-d434-4273-b4a2-82c0d0142860.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_a0da4e86-d434-4273-b4a2-82c0d0142860.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_a0da4e86-d434-4273-b4a2-82c0d0142860.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_strange_bizarre_otherworld_a0da4e86-d434-4273-b4a2-82c0d0142860.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_39e39d90-b502-4ef5-86ef-20938c468cfd.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_39e39d90-b502-4ef5-86ef-20938c468cfd.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_39e39d90-b502-4ef5-86ef-20938c468cfd.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_39e39d90-b502-4ef5-86ef-20938c468cfd.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_67ca71a2-d24e-4e07-8491-78bd9e1c8c47.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_67ca71a2-d24e-4e07-8491-78bd9e1c8c47.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_67ca71a2-d24e-4e07-8491-78bd9e1c8c47.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_67ca71a2-d24e-4e07-8491-78bd9e1c8c47.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a4c65ec8-0d09-4613-8b78-2700327523c5.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a4c65ec8-0d09-4613-8b78-2700327523c5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a4c65ec8-0d09-4613-8b78-2700327523c5.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_a4c65ec8-0d09-4613-8b78-2700327523c5.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b3eb1c70-947f-4216-b3e3-0553c2d5dd17.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b3eb1c70-947f-4216-b3e3-0553c2d5dd17.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b3eb1c70-947f-4216-b3e3-0553c2d5dd17.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_b3eb1c70-947f-4216-b3e3-0553c2d5dd17.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_27b7429c-b00d-4d48-b2d6-eb6b655a7547.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_27b7429c-b00d-4d48-b2d6-eb6b655a7547.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_27b7429c-b00d-4d48-b2d6-eb6b655a7547.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_27b7429c-b00d-4d48-b2d6-eb6b655a7547.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_29e4bdbd-8cbc-4be2-a926-af21573097b7.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_29e4bdbd-8cbc-4be2-a926-af21573097b7.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_29e4bdbd-8cbc-4be2-a926-af21573097b7.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_large_quadrupedal_29e4bdbd-8cbc-4be2-a926-af21573097b7.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_3261e5a5-6753-449f-a89c-136eef47da0e.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_3261e5a5-6753-449f-a89c-136eef47da0e.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_3261e5a5-6753-449f-a89c-136eef47da0e.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_3261e5a5-6753-449f-a89c-136eef47da0e.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_bc89c34d-842d-43a5-9a88-e89ed90f2889.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_bc89c34d-842d-43a5-9a88-e89ed90f2889.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_bc89c34d-842d-43a5-9a88-e89ed90f2889.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_a_peculiar_quadrupedal_other_bc89c34d-842d-43a5-9a88-e89ed90f2889.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_c2d3e907-84bd-414e-92f1-e7c617dfd4d2.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_c2d3e907-84bd-414e-92f1-e7c617dfd4d2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_c2d3e907-84bd-414e-92f1-e7c617dfd4d2.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_of_an_enigmatic_translucent_oth_c2d3e907-84bd-414e-92f1-e7c617dfd4d2.jpg 1344w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_8f3e7f52-29ac-41cd-b8d9-af4f86ee14a9.jpg" class="kg-image" alt="Exploring another planet: AI-generated Nature Photography" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_8f3e7f52-29ac-41cd-b8d9-af4f86ee14a9.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_8f3e7f52-29ac-41cd-b8d9-af4f86ee14a9.jpg 1000w, https://wingedsheep.com/content/images/2023/05/wingedsheep_Wildlife_photograph_by_Melissa_Groo_and_George_Luca_8f3e7f52-29ac-41cd-b8d9-af4f86ee14a9.jpg 1344w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Journey into the Dreamhold: Testing GPT-4's General Intelligence Through a Text Adventure Quest]]></title><description><![CDATA[Exploring GPT-4's General Intelligence. How GPT-4 tackles the challenges of an interactive text adventure.]]></description><link>https://wingedsheep.com/gpt-4-general-intelligence/</link><guid isPermaLink="false">641f83c0de21e7007349d7ff</guid><category><![CDATA[GPT-4]]></category><category><![CDATA[machine learning]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Sun, 26 Mar 2023 01:01:00 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2023/03/wingedsheep_In_the_midst_of_a_mysterious_stone_chamber_a_massiv_69b78206-e83a-4977-b3ff-3dc325eff936.png" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2023/03/wingedsheep_In_the_midst_of_a_mysterious_stone_chamber_a_massiv_69b78206-e83a-4977-b3ff-3dc325eff936.png" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest"><p></p><p>I found myself pondering the astonishing capabilities of the latest iteration of OpenAI&apos;s language model, GPT-4. As someone who has been following the development of these models with avid curiosity, I couldn&apos;t help but wonder: How can we really test if this model has some kind of general intelligence?</p><p>After a few attempts to come up with interesting questions that I could answer but GPT-4 could not I decided on a new direction: old school text adventure games!</p><p>I decided to put it to the test in an interactive text adventure game called &quot;<a href="https://eblong.com/zarf/zweb/dreamhold/?ref=wingedsheep.com">The Dreamhold</a>&quot;. The thought of a machine not only playing the game but also reasoning about it seemed almost fantastical. Nevertheless, I decided to dive headfirst into this experiment.</p><p>My goal was to see whether the model could not only play &quot;The Dreamhold&quot; but also provide a coherent explanation of its thought process and decision-making.</p><p>As the game progressed, I found myself continuously amazed by the model&apos;s ability to navigate the intricate labyrinth of &quot;The Dreamhold&quot;, uncovering hidden paths and deciphering enigmatic clues along the way. With the excitement of an adventurer exploring a mysterious realm, I eagerly observed as GPT-4 ventured through the game, growing increasingly astounded by its capacity for reasoning and problem-solving.</p><p>Finally, as the experiment drew to a close, GPT-4 presented a comprehensive overview of the rooms it had explored, as well as the uncharted paths and unsolved mysteries that still awaited further inquiry. It is crazy to think how fast this technology developed! GPT-4 had not only played &quot;The Dreamhold&quot; but had also demonstrated a remarkable ability to reason about the game and its various elements. As we continue to push the boundaries of AI and explore its seemingly limitless potential, I can&apos;t help but wonder how this will change the world in the coming years.</p><p>Here is the complete transcript of GPT-4 playing &quot;The Dreamhold&quot; (up to the 8000 token limit).</p><ul><li>Text in green is &quot;user input&quot;. These are my questions and statements, to test if the model has an understanding of what it is doing.</li><li>Text in gray is the &quot;game output&quot;, this is what the game outputs, directly copy pasted to GPT-4.</li><li>Text in yellow is generated by GPT-4. These commands are given directly to the game.</li><li>Text in purple are remarks, that are not used as input to the model.</li></ul><!--kg-card-begin: html--><div class="user-text">
    You are going to play a text adventure game.
    <br><br>
    Here are the basics:
</div>

<div class="game-text">
    These are the commands you will use most often.
    <br><br>
    &quot;look&quot; or &quot;l&quot;: Look around the room -- repeat the description of everything you see.<br>
    &quot;examine thing&quot; or &quot;x thing&quot;: Look more closely at something -- learn more about it.<br>
    &quot;inventory&quot; or &quot;i&quot;: List everything you&apos;re carrying.<br>
    &quot;north&quot;, &quot;south&quot;, &quot;east&quot;, &quot;west&quot;, etc., or &quot;n&quot;, &quot;s&quot;, &quot;e&quot;, &quot;w&quot;, etc.: Walk in some direction.
</div>

<div class="game-text">
    You wrench your eyes open. Rough grey stone. Grey stone ceiling. Your head hurts, and -- You&apos;re
    lying on the floor. You&apos;re staring at the ceiling, and it&apos;s rough and grey, and you don&apos;t recognize it.
    <br><br>
    You roll slowly (smooth cold floor?) and try to sit up. It hurts. You crawl upright. The walls, rough stone also,
    scrape your aching fingers. You can&apos;t -- there was white agony, felt like raw light tearing you apart. You can&apos;t
    remember anything after that.
    <br><br>
    You can&apos;t remember anything before that. Gone. You clutch at memory, and there&apos;s nothing but empty air.
    <br><br>
    <b>Cell</b><br><br>
    This space, barely wider than outstretched arms, seems to have been chopped raw and square from unfinished stone.
    Only the floor is smooth -- a fine white surface beneath your feet. There is a narrow gap in the east wall.
</div>

<div class="gpt-text">look</div>

<div class="game-text">
    <b>Cell</b><br><br>
    This space, barely wider than outstretched arms, seems to have been chopped raw and square from unfinished stone.
    Only the floor is smooth -- a fine white surface beneath your feet. There is a narrow gap in the east wall.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-27.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-27.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-27.png 1000w, https://wingedsheep.com/content/images/2023/03/image-27.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Cell</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">examine gap</div>

<div class="game-text">
    You see a narrow, oblong opening in the east wall. Not much of a doorway, but big enough to get through.
</div>

<div class="gpt-text">east</div>

<div class="game-text">
    You duck your head and push through the gap.
    <br><br>
    <b>Narrow Hallway</b><br><br>
    You are standing in a short windowless hallway. To the east is the foot of a flight of stairs, which rises out of
    sight. To the west, the hallway narrows, ending in a small gap of a doorway.
    <br><br>
    [Looks like you&apos;ve taken the first step. Well done.
    <br><br>
    Let me introduce myself. I am the Voice of this tutorial. Most games don&apos;t have me; but in this game, I will watch
    over your shoulder and give you some help. With a little practice, you&apos;ll soon be moving around the text adventure
    world in style.
    <br><br>
    Back to the story. Remember what&apos;s going on? Actually, you don&apos;t. As the introduction said, you can&apos;t remember who
    you are or what you&apos;re doing here!
    <br><br>
    Amnesia. Yes, it&apos;s a clich&#xE9;, but it&apos;ll do for a tutorial.
    <br><br>
    I&apos;ll let you go on exploring. The west corridor leads back to the cell where you started, so you&apos;ll want to try up
    the stairs instead. Type &quot;up&quot; or &quot;climb stairs&quot;.]
</div>

<div class="gpt-text">up</div>

<div class="game-text">
    You begin climbing the stairs. They seem to go on for a long while... pressing between dim stone walls (where is the
    light coming from? You haven&apos;t seen a window yet)... climbing... (how far?)...
    <br><br>
    Until you pass through a doorway into warm candlelight.
    <br><br>
    <b>Crowded Study</b><br><br>
    You stand amid clutter, oddments, shelves and stacks. The chamber is comfortably broad, centered around a massive
    and well-worn wooden desk. But so much is jammed in, around the desk and up the panelled walls, that you barely find
    room to stand. Books; papers; dried plants; animals stuffed and preserved, antique instruments, candles of any hue.
    You don&apos;t recognize half of it, and you can&apos;t name half the rest.
    <br><br>
    There are wide doorways on the north and east sides of the room. A door of heavy wood stands closed to the south,
    and stairs descend into dimness to the west.
    <br><br>
    You see an immense book on the desk. Behind the desk is a tall glass-fronted cabinet. Beside that is a small brass
    trunk, which is closed.
    <br><br>
    If there were a quarter as much here, and a tenth as many books, you might be in any scholar&apos;s study. But this
    knowledge must represent lifetimes of work -- lifetimes under a single hand. You do not know where you are, but you
    know what this place is: a dreamhold. A wizard&apos;s high house.
    <br><br>
    You do not find yourself afraid. A dreamhold is more than merely dangerous.
</div>

<div class="gpt-text">examine immense book</div>

<div class="game-text">
    The book lies open. You frown at the fine, angular hand but discover that you can read it:
    <br><br>
    The Theory &amp; UNDERSTANDING of Portalls;
    The lesser, which make a single place of many, and the Greater, which open from NOW into Time in Memory, or Prophecy
    Foretold, or even a Moment&apos;s Fancy;
    <br><br>
    All portals are perilous. Perilous thresholds to cross, and more perilous to create; For there is no plying of the
    World, or of Time, that does not happen in the Mind of the learned one who conceives of the journey. Of your Thought
    is the portal built, arch and capstone. Slip but a moment of your attention, and the Portal will fall into ruin; All
    its might, and yours, crumbled into eggshell fragments that stray upon the Wind; ...
    <br><br>
    The facing page shows an elaborate circular diagram, annotated here and there with tiny mathematical notes. The only
    comment you understand, tucked in a margin, says &quot;Best to draw in a well-insulated space -- 35 Ll. of uncut stone?
    -- move house to Emmen Valley, work into mountain?&quot;
</div>

<div class="gpt-text">examine cabinet</div>

<div class="game-text">
    The cabinet is a tall and ornate affair; its feet and edges are carved into flamboyant spirals. Two broad and
    utterly flawless glass panes form the cabinet&apos;s front surface.
    <br><br>
    The cabinet&apos;s shelves are filled with curiosities. Tiny crystals and worn river stones, intricate knots of wire and
    slabs of rough metal, scraps of folded paper and loops of colored string. A small bell of rune-scratched glass.
    Three beans in a golden dish. A human hand, eye, and heart, all seemingly carved of chalk. An amethyst scale, the
    length of your finger, which lies in a pool of its own light.
</div>

<div class="gpt-text">examine brass trunk</div>

<div class="game-text">
    A small square trunk is pushed up against the back wall, beside a tall cabinet. The trunk&apos;s panels and lid are
    tarnished brass; they&apos;re engraved with worn geometric designs. The trunk sits closed.
</div>

<div class="gpt-text">open brass trunk</div>

<div class="game-text">
    You hesitate a moment. Prying into a wizard&apos;s possessions? But you&apos;re already standing in his home; and you could as
    easily be damned for making free with his candlelight as with his trunk.
    <br><br>
    You reach out, flip up the brass lid, and step back in one movement... A copper key glints at the very bottom of the
    trunk.
</div>

<div class="gpt-text">take copper key</div>

<div class="game-text">
    Taken.
</div>

<div class="gpt-text">inventory</div>

<div class="game-text">
    You are carrying a copper key and a quill pen.
    <br><br>
    [You&apos;re carrying two things. You just picked up one of them, but you must have been holding the quill pen when you
    awoke. It may be important. Type &quot;examine the pen&quot; to take a close look at it.
    <br><br>
    Or just &quot;x pen&quot; will work. &quot;Examine&quot; can be abbreviated to one letter, and you can always leave out nonessential
    words like &quot;a&quot;, &quot;an&quot;, and &quot;the&quot;.]
</div>

<div class="gpt-text">x pen</div>

<div class="game-text">
    You are holding a quill pen -- a sturdy black feather, its tip carefully cut to a nib. You have no memory of where
    you got it, or when, or why.
</div>

<div class="gpt-text">north</div>

<div class="game-text">
    <b>Sitting Room</b><br><br>
    This room seems more inviting. The walls are painted with delicate patterns of flowers, which merge into a soft-hued
    carpet beneath your feet. Two chairs and a cushioned settee face a bright-flickering fireplace on the far wall.
    <br><br>
    A desert landscape painting hangs above the fireplace.
    <br><br>
    You see doorways to the south and in the southeast corner of the room. A white-painted door to the east is closed.
</div>

<div class="gpt-text">examine painting</div>

<div class="game-text">
    The painting shows a stark, rocky desert at dawn. The sunlight stains the dusty stones to harsh scarlets and rust;
    but the land seems serene for all that, unthreatened.
</div>

<div class="gpt-text">examine fireplace</div>

<div class="game-text">
    If you doubted this was a dreamhold, you&apos;re certain now... the fireplace holds no wood, no ash. An odd basket of
    coiled silver wire holds a heap of glassy, glowing, cherry-red spheres. Insubstantial flames flicker above the
    spheres, and a mild warmth touches your face and body. But the spheres do not truly burn; they are not consumed.
</div>

<div class="gpt-text">east</div>

<div class="game-text">The white door is closed and locked.</div>

<div class="gpt-text">unlock door with copper key</div>

<div class="game-text">The copper key unlocks the door. You turn the knob and swing it open.</div>

<div class="gpt-text">east</div>

<div class="game-text">
    <b>Curving Hall</b><br><br>
    You are in a high, dim corridor, walled in cracked and moldering plaster. The only light comes from tiny flickering
    candles above. The hall curves gently around from the south to the northwest. You see an open door to the west;
    archways open to the northeast and east.
</div>

<div class="gpt-text">northeast</div>

<div class="game-text">
    <b>Atelier</b><br><br>
    This cramped, boxy room appears to have been an artist&apos;s studio. The walls and floor are splattered with paints of
    many colors. Strangely, the room is nearly empty; you see no stacks of canvas or bottles of pigment. The exit is
    southwest.
    <br><br>
    A rough wooden easel is set up at one end of the room. Displayed upon it is a painting -- a bright mountain
    landscape.
    <br><br>
    At the other end of the room, a tripod props up what looks like a small telescope.
    <br><br>
    A pigment-daubed board, no doubt the artist&apos;s palette, is sitting in a corner.
</div>

<div class="gpt-text">examine painting</div>

<div class="game-text">
    The painting shows a tiny rock pool amid jagged mountain peaks. The landscape is harsh and unforgiving, but the pool
    seems a respite. It is rimmed with bright moss, and a few fish-like shadows are visible in its depths.
    <br><br>
    The artist has depicted something brown lying on the pool&apos;s shore. It is small, hard to distinguish amid the
    brushwork; but it seems to be a brown mask.
</div>

<div class="gpt-text">examine telescope</div>

<div class="game-text">
    The telescope is a tiny, handmade instrument, all old black leather and beaten silver rings. It is aligned precisely
    horizontally -- pointing straight at the easel.
</div>

<div class="gpt-text">look through telescope</div>

<div class="game-text">
    <b>Metal Culvert</b><br><br>
    You find yourself standing in a dark culvert of some kind. The curving walls are polished metal, antique with
    tarnish. To the south, the channel ends in a circular glass barrier; to the north, it opens out into light.
</div>

<div class="gpt-text">north</div>

<div class="game-text">
    The light grows brighter as you walk up the culvert....
    <br><br>
    <b>Mountain Pool</b><br><br>
    Jagged mountains tear the skies in every direction. They are unreal, impossible peaks -- knife-like spires of rock.
    But in this sheltered nook, life flourishes. A small mossy pool, cool and shadowed with tiny fish, has gathered
    below a rock-spring.
    <br><br>
    On the shore of the pool is a brown paper mask.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-21.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-21.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-21.png 1000w, https://wingedsheep.com/content/images/2023/03/image-21.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Mountain pool</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">take brown paper mask</div>

<div class="game-text">
    I only understood you as far as wanting to take the brown mask.
</div>

<div class="gpt-text">take brown mask</div>

<div class="game-text">
    Taken.
</div>

<div class="gpt-text">inventory</div>

<div class="game-text">
    You are carrying a brown mask, a copper key, and a quill pen.
</div>

<div class="gpt-text">wear brown mask</div>

<div class="game-text">
    [Your score has gone up.
    <br><br>
    Your score is displayed in the top right corner of the window. &quot;1 of 7&quot; means you&apos;ve achieved one out of seven main
    goals. The score increased when you picked up the brown mask; so presumably there are seven masks to find in the
    game.
    <br><br>
    You can get a full account of your score by typing &quot;score&quot;.]
    <br><br>
    &gt;inventory
    You are carrying a brown mask, a copper key, and a quill pen.
    <br><br>
    &gt;wear brown mask
    The mask has no ribbons to tie -- it is not even curved to fit a human face. In any case, it&apos;s half life-size. It
    cannot be worn.
    <br><br>
    Nonetheless, you try raising the mask before your eyes....
    <br><br>
    ...Memory stirs...
    <br><br>
    In a darkened library, someone works alone. The tall shelves are crowded, but the rows of titles fade into shadows;
    only the desk is illuminated. A map is spread upon it. The pen, moving across its face, annotates and speculates.
    <br><br>
    Nearly half the map is tinted red. Along the border, marks and notations cluster like wasps.
    <br><br>
    The silver head snaps up, as an officer enters. He holds a pale cylinder, the length of a tall man&apos;s finger. He
    places it on the desk; he bows; he turns and leaves. At no point do his eyes rise from the floor.
    <br><br>
    The cylinder, unrolled, proves to be a length of parchment: filthy, closely lettered. The tall figure reads it,
    once. Then the pen, taken up once again.
    <br><br>
    In the blank heart of the red-tinted region, quick strokes now emblazon the shape of a crutch.
    <br><br>
    You yank the mask away with a shudder. What are these memories? Do they belong to the wizard whose house you are
    disturbing?
</div>

<div class="remark-text">
    The first point. Let&apos;s go!
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    The world seems to smear out of shape as you move. After a few steps, you see nothing but running colors....
    <br><br>
    <b>Atelier</b><br><br>
    This cramped, boxy room appears to have been an artist&apos;s studio. The walls and floor are splattered with paints of
    many colors. Strangely, the room is nearly empty; you see no stacks of canvas or bottles of pigment. The exit is
    southwest.
    <br><br>
    A rough wooden easel is set up at one end of the room. Displayed upon it is a painting -- a bright mountain
    landscape.
    <br><br>
    At the other end of the room, a tripod props up what looks like a small telescope.
    <br><br>
    A pigment-daubed board, no doubt the artist&apos;s palette, is sitting in a corner.
</div>

<div class="gpt-text">southwest</div>

<div class="game-text">
    <b>Curving Hall</b>
</div>

<div class="gpt-text">west</div>

<div class="game-text">
    <b>Sitting Room</b>
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    <b>Crowded Study</b>
</div>

<div class="gpt-text">examine cabinet</div>

<div class="game-text">
    The cabinet is a tall and ornate affair; its feet and edges are carved into flamboyant spirals. Two broad and
    utterly flawless glass panes form the cabinet&apos;s front surface.
    <br><br>
    The cabinet&apos;s shelves are filled with curiosities. Tiny crystals and worn river stones, intricate knots of wire and
    slabs of rough metal, scraps of folded paper and loops of colored string. A small bell of rune-scratched glass.
    Three beans in a golden dish. A human hand, eye, and heart, all seemingly carved of chalk. An amethyst scale, the
    length of your finger, which lies in a pool of its own light.
</div>

<div class="gpt-text">take amethyst scale</div>

<div class="game-text">
    The glass panes are closed. Whatever is inside the cabinet will have to remain there.
</div>

<div class="gpt-text">examine desk</div>

<div class="game-text">
    The desk is heavy and plain, a massive wooden construction. Surprisingly, the surface is bare, except for an immense
    book.
    <br><br>
    Something in the chaos catches your eye. It looks like a white papier-mache mask, lying beside the desk.
</div>

<div class="gpt-text">take white mask</div>

<div class="game-text">
    Taken.
</div>

<div class="gpt-text">wear white mask</div>

<div class="game-text">
    Gingerly, you raise the mask to your face....
    <br><br>
    ...Memory stirs...
    <br><br>
    A child runs through the forest. A robe, richly bright-embroidered, has slipped off one skinny shoulder -- a child
    old enough to be put in clothes, too young to know what it means to wear them. A silver-haired child whose glance
    darts from tree to bird, caught everywhere.
    <br><br>
    A mother&apos;s voice shouting. Not patient, not yet urgent. The child attends this, with the same interest as bush,
    flower, fascinating new rustle underfoot...
    <br><br>
    The name, again.
    <br><br>
    A moist leaf, torn from a tree, clutched in a small fist. Tossed in the air. Blown about, blown upwards again and
    again, as the child dances back and forth, face raised, flushed, puffing madly...
    <br><br>
    Mother&apos;s voice interrupting the game. The child spins once more, dashes back towards dinner.
    <br><br>
    The leaf flutters about in the air. It circles a tree; then rises to a high branch, clings there. It seems to bend
    this way and that; then it casts loose, and flutters determinedly after its thoughtless maker.
</div>

<div class="gpt-text">remove white mask</div>

<div class="game-text">
    You&apos;re not wearing the white mask. It&apos;s unwearable, flat paper. All you can do with the masks is hold them up in
    front of your face.
</div>

<div class="gpt-text">west</div>

<div class="game-text">
    You descend for a long while.
    <br><br>
    <b>Narrow Hallway</b>
</div>

<div class="gpt-text">west</div>

<div class="game-text">
    You duck your head and push through the gap.
    <br><br>
    <b>Cell</b>
</div>

<div class="gpt-text">examine floor</div>

<div class="game-text">
    The floor is also stone, but fine-grained and smooth -- not quite polished. It is very white; white enough to show
    faint smudges where you lay and where you&apos;ve walked.
</div>

<div class="gpt-text">east</div>

<div class="game-text">
    You duck your head and push through the gap.
    <br><br>
    <b>Narrow Hallway</b>
</div>

<div class="gpt-text">up</div>

<div class="game-text">
    You begin climbing the stairs. They seem to go on for a long while...
    <br><br>
    Until you pass through a doorway into warm candlelight.
    <br><br>
    <b>Crowded Study</b>
</div>

<div class="gpt-text">north</div>

<div class="game-text">
    <b>Sitting Room</b>
</div>

<div class="gpt-text">southeast</div>

<div class="game-text">
    <b>Curtained Room</b><br><br>
    The walls of this small room are entirely swathed in heavy brocade curtains. The only openings are to the west and
    northwest, and a closed lead-slab door to the south.
    <br><br>
    In the center of the room is a massive, high-backed chair of some pale wood. Directly before it is a tall mirror in
    a standing frame.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-20.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-20.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-20.png 1000w, https://wingedsheep.com/content/images/2023/03/image-20.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Curtained room</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">examine mirror</div>

<div class="game-text">
    It seems to be a plain oval mirror, suspended in a frame of iron bars. You can&apos;t look directly into it from where
    you&apos;re standing.
</div>

<div class="gpt-text">examine chair</div>

<div class="game-text">
    The chair is cut from heavy planks of pale wood. It has a solid base, high arms and back -- nearly a throne, you
    think. The joinery is rough, but the surface has been finished to a smooth fineness. The chair is positioned in
    front of a standing mirror.
</div>

<div class="gpt-text">sit in chair</div>

<div class="game-text">
    You sit down in the chair, facing the mirror.
</div>

<div class="gpt-text">look in mirror</div>

<div class="game-text">
    You blink and stare into the mirror. How odd.
    <br><br>
    The mirror reflects your chair, and the curtains behind you, perfectly. But your own form is unclear -- as if the
    mirror were touched with some distorting oil. The blurring is strongest around your upper body; your head appears to
    be a faceless blank.
    <br><br>
    Nervously, you raise your hand to your own face. Everything feels in its place. But your reflection has raised a
    blurred hand to a featureless void.
    <br><br>
    And dim white and brown shadows seem to flit around your reflected body. Then they are gone.
</div>

<div class="gpt-text">stand up</div>

<div class="game-text">
    You stand up from the chair.
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    The leaden door is closed and locked.
</div>

<div class="gpt-text">unlock door with copper key</div>

<div class="game-text">
    The copper key does not fit the door&apos;s keyhole.
</div>

<div class="gpt-text">northwest</div>

<div class="game-text">
    <b>Sitting Room</b>
</div>

<div class="gpt-text">west</div>

<div class="game-text">
    You can go south, southeast, or through the east door.
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    <b>Crowded Study</b>
</div>

<div class="gpt-text">west</div>

<div class="game-text">
    You descend for a long while.
    <br><br>
    <b>Narrow Hallway</b>
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    The hallway runs from the cell (to the west) to the stairs (which rise to the east).
</div>

<div class="gpt-text">east</div>

<div class="game-text">
    You begin climbing the stairs. They seem to go on for a long while...
    <br><br>
    Until you pass through a doorway into warm candlelight.
    <br><br>
    <b>Crowded Study</b>
</div>

<div class="user-text">
    Can you explain to me how the rooms are connected?
</div>

<div class="gpt-text">Of course! Here&apos;s a summary of the rooms and their connections:

    <ol>
        <li><strong>Cell</strong> - This is the starting room. The only exit is to the east.</li>
        <li><strong>Narrow Hallway</strong> - Connected to the Cell to the west and stairs to the east.</li>
        <li><strong>Crowded Study</strong> - Accessible by going up the stairs from the Narrow Hallway. Exits are north,
            east, and west
            (back to the stairs).
        </li>
        <li><strong>Sitting Room</strong> - Located to the north of the Crowded Study. Exits are south (back to the
            Crowded Study), east,
            and southeast.
        </li>
        <li><strong>Curving Hall</strong> - Accessible by going east from the Sitting Room. Exits are west (back to the
            Sitting Room),
            northeast, and east.
        </li>
        <li><strong>Atelier</strong> - Located to the northeast of the Curving Hall. The only exit is southwest (back to
            the Curving
            Hall).
        </li>
        <li><strong>Curtained Room</strong> - Accessible by going southeast from the Sitting Room. Exits are west (back
            to the Sitting
            Room), northwest, and south (locked lead-slab door).
        </li>
    </ol>

    This is the layout of the rooms you have explored so far.
</div>

<div class="user-text">
    Do you have any unexplored clues left? Explain your plan for exploring.
</div>

<div class="gpt-text">
    There are a few unexplored areas and actions to consider:

    <ol>
        <li>In the Curving Hall, there is an unexplored archway to the east.</li>
        <li>In the Sitting Room, there is a closed white door to the east, which you have unlocked with the copper key
            but not yet entered.
        </li>
        <li>In the Curtained Room, there is a locked lead-slab door to the south. You have not found the key for this
            door yet.
        </li>
    </ol>

    Your exploration plan could be:

    <ol>
        <li>Go to the Curving Hall and explore the archway to the east.</li>
        <li>Go back to the Sitting Room and enter the unlocked white door to the east.</li>
        <li>Find the key for the lead-slab door in the Curtained Room and explore the room behind it.</li>

    </ol>

    Remember to examine any new items or objects you discover in these unexplored areas, as they may provide additional
    clues or help you progress further.
</div>

<div class="user-text">
    continue playing the game
</div>

<div class="gpt-text">
    Alright, let&apos;s continue exploring. First, let&apos;s head to the Curving Hall.
    <br><br>
    east
</div>

<div class="game-text">
    <b>Curtained Room</b>
    <br><br>
    In the center of the room is a massive, high-backed chair of some pale wood. Directly before it is a tall mirror in
    a standing frame.
</div>

<div class="gpt-text">
    northwest
</div>

<div class="game-text">
    <b>Sitting Room</b>
</div>

<div class="gpt-text">
    east
</div>

<div class="game-text">
    <b>Curving Hall</b>
</div>

<div class="gpt-text">
    east
</div>

<div class="game-text">
    <b>Mosaic Room</b><br><br>
    The walls and ceiling of this room are entirely covered with tiny blue tiles. On the east wall, a few black and grey
    tiles seem to depict birds on the horizon of a mosaic sky. The only exit is an archway to the west.
    <br><br>
    A delicate cage of brass wire hangs from a curved stand in the center of the room. Within the cage is a single ripe
    apple.
</div>

<div class="gpt-text">
    examine cage
</div>

<div class="game-text">
    You&apos;ve seen -- you might have seen -- such cages in the market, holding songbirds in their shining wire embrace.
    This one, however, contains a ripe and perfect apple. You cannot imagine why. The cage door is closed.
</div>

<div class="gpt-text">
    examine mosaic
</div>

<div class="game-text">
    The mosaic seems to represent a perfect blue sky, rising up the walls and across the ceiling. A few mosaic birds
    circle above the eastern horizon.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-22.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-22.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-22.png 1000w, https://wingedsheep.com/content/images/2023/03/image-22.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Mosaic</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">
    open cage door
</div>

<div class="game-text">
    You pull open the wire door. Then you jerk back; something invisible seems to burst from the cage. It rolls across
    the room like lightning or dessicated time. It echoes.
    <br><br>
    The apple spots, rots, and sinks into itself in a single instant. Within a heartbeat, the fruit is a withered husk
    -- as if it had sat in that cage for decades.
    <br><br>
    [You may have made a mistake. You&apos;re not likely to get that apple back. (One never knows, of course, but that decay
    looked very final.) What can you do about it?
    <br><br>
    One option is to type &quot;undo&quot;. This will let you &quot;back up&quot; one move -- back to just before you opened the cage.
    Everything will be the same, except that the cage will still be closed and the apple will still be fresh.
    <br><br>
    In this game, you can only &quot;undo&quot; one move in a row. So if you do something else now (even &quot;look&quot; or &quot;examine
    apple&quot;), you won&apos;t be able to jump back to before the cage opened. The &quot;undo&quot; command is intended only to fix
    immediate mistakes.
    <br><br>
    If you want to go back more than one turn, you&apos;ll have to use the &quot;restart&quot; or &quot;restore&quot; commands. Type &quot;help
    saving&quot; for more information.
    <br><br>
    (Actually, many games protect you from severe mistakes. Since this is an introductory game, you don&apos;t really have to
    worry about accidentally running into a dead end. If you truly need a fresh apple, you&apos;ll probably find another way
    to get one.)]
</div>

<div class="gpt-text">
    undo
</div>

<div class="game-text">
    <b>Mosaic Room</b><br><br>
    [Previous turn undone.]
</div>

<div class="gpt-text">
    look
</div>

<div class="game-text">
    <b>Mosaic Room</b>
    The walls and ceiling of this room are entirely covered with tiny blue tiles. On the east wall, a few black and grey
    tiles seem to depict birds on the horizon of a mosaic sky. The only exit is an archway to the west.
    <br><br>
    A delicate cage of brass wire hangs from a curved stand in the center of the room. Within the cage is a single ripe
    apple.
</div>

<div class="gpt-text">
    west
</div>

<div class="game-text">
    <b>Curving Hall</b>
</div>

<div class="gpt-text">
    northwest
</div>

<div class="game-text">
    <b>Curving Hall at Pedestal</b><br><br>
    The dingy plaster walls of this corridor curve out of sight to the west and southeast. Tiny candles provide the only
    illumination. Archways lead north and northeast.
    <br><br>
    A short pedestal of black marble stands by the inner wall.
</div>

<div class="gpt-text">
    north
</div>

<div class="game-text">
    You blink into the dimming light as you step through the arch.
    <br><br>
    <b>Natural Passage</b><br><br>
    This is a narrow passageway, which winds between irregular stone walls into the world&apos;s underdarkness. The passage
    was clearly not carved by human hands. Creamy limestone laps and drips in ancient, water-worn folds. The archway to
    the south is the only source of light; the passage vanishes into cave-blackness, somewhere to the north.
</div>

<div class="gpt-text">
    north
</div>

<div class="game-text">
    You venture into the lightless passage...
    <br><br>
    <b>Darkness</b><br><br>
    You are in the unchanging, unleavened darkness of the world below ground.
    <br><br>
    [Oh, dear. You&apos;ve walked into a very dark place.
    <br><br>
    Going &quot;south&quot; probably won&apos;t get you back; you can&apos;t tell directions in the dark. So what now? One option is to type
    &quot;undo&quot;. This will let you &quot;back up&quot; one move -- back to just before you walked in here. Everything will be the same,
    except that you&apos;ll be in the Natural Passage, and you&apos;ll be able to see.
    <br><br>
    In this game, you can only &quot;undo&quot; one move in a row. So if you do something else now (even &quot;look&quot; or &quot;south&quot;), you
    won&apos;t be able to jump back to the lit Passage. The &quot;undo&quot; command is intended only to fix immediate mistakes.
    <br><br>
    If you want to go back more than one turn, you&apos;ll have to use the &quot;restart&quot; or &quot;restore&quot; commands. Type &quot;help
    saving&quot; for more information.
    <br><br>
    Or you could stumble around in the dark, and try to find your way out. Since this is an introductory game, there is
    a way out. And maybe more to discover, as well.]
</div>

<div class="gpt-text">
    undo
</div>

<div class="game-text">
    <b>Natural Passage</b><br><br>
    [Previous turn undone.]
</div>

<div class="gpt-text">
    south
</div>

<div class="game-text">
    <b>Curving Hall at Pedestal</b>
    <br><br>
    A short pedestal of black marble stands by the inner wall.
</div>

<div class="gpt-text">
    southwest
</div>

<div class="game-text">
    You can follow the corridor to the west or southeast; or you can go north or northeast.
</div>

<div class="gpt-text">
    west
</div>

<div class="game-text">
    <b>Curving Hall, West End</b><br><br>
    The curving corridor ends here, in a blank plaster wall relieved by a single window. The window looks out on a
    strange subterranean prospect to the west. You can return east, pass through the archway to the north, or try the
    closed door to the south.
</div>

<div class="gpt-text">
    examine window
</div>

<div class="game-text">
    A broad glass pane -- inhumanly smooth and flawless -- looks out over a dark cavern.
    <br><br>
    This end of the corridor seems to be deep underground. A natural cave spreads out below; its mammoth columns and
    cascades of flowstone are only dimly picked out by the candlelight behind you. The farther reaches are hidden in
    darkness. But the shining waterfall before you is easily visible. A stream pours in from your right, tumbles from a
    ledge, and plummets into a pit beneath the window. The water seems to sparkle with some natural phosphorescence.
</div>

<div class="gpt-text">
    south
</div>

<div class="game-text">
    You push the door open, revealing a narrow flight of stairs descending out of sight. You follow them down.
    <br><br>
    <b>North Alcove</b><br><br>
    This is a small, curved alcove, off a large chamber to the south. An archway to the north reveals a flight of
    ascending stairs.
    <br><br>
    A pale gauzy rag is crumpled at the alcove&apos;s edge.
    <br><br>
    A vast machine spins endlessly in the chamber to the south.
</div>

<div class="gpt-text">
    examine rag
</div>

<div class="game-text">
    It just looks like a pale dusty scrap, abandoned in a corner.
    <br><br>
    The machine clatters and whirrs.
</div>

<div class="gpt-text">
    take rag
</div>

<div class="game-text">
    You lift the rag and spread it in your hands. It&apos;s finer than you had originally thought -- a delicate cobwebby
    gauze -- but the weave is wracked with holes.
    <br><br>
    The machine hums through new configurations.
</div>
<!--kg-card-end: html--><h3 id="part-2-the-journey-continues-past-8k-tokens">Part 2: The journey continues past 8k tokens</h3><p></p><p>Because it was getting close to the 8k token limit, I asked GPT-4 to summarize the progress so far. It gave the following answers, and even created a script to output the rooms explored so far as a DrawIO diagram in XML.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2023/03/output.drawio.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="403" height="384"></figure><!--kg-card-begin: html--><div class="user-text">
  Give a detailed summary of the game so far containing all the necessary and useful information for if you want to continue the game later.
  <br><br>
  - Include the rooms and their connections
</div>

<div class="gpt-text">
  <p>Here&apos;s a detailed summary of the game so far:</p>
  <ol>
    <li>You started in a small Cell with rough stone walls and a smooth white floor. A narrow gap in the east wall
      led to the Narrow Hallway.
    </li>
    <li>In the Narrow Hallway, you found stairs leading up to the Crowded Study.</li>
    <li>In the Crowded Study, you found an immense book detailing portal theories, a tall glass-fronted cabinet
      filled with curiosities, and a small brass trunk. You opened the trunk and took a copper key.
    </li>
    <li>You also discovered you were carrying a quill pen, which you examined but couldn&apos;t remember its origin.</li>
    <li>From the Crowded Study, you went north to the Sitting Room, where you found a fireplace with glass spheres
      and a desert landscape painting.
    </li>
    <li>In the Atelier, accessible from the Curving Hall, you found a painting of a mountain pool, a small
      telescope, and a pigment-daubed board. You looked through the telescope and found yourself in a metal
      culvert that led to the mountain pool. There, you took a brown mask.
    </li>
    <li>When you returned to the Crowded Study, you found a white mask on the desk and experienced a memory when you
      held it up to your face.
    </li>
    <li>You explored the Curtained Room, where you found a massive high-backed chair and a tall mirror. When you sat
      in the chair, your reflection in the mirror was distorted, and you saw dim white and brown shadows.
    </li>
    <li>In the Mosaic Room, you found a delicate cage with a single ripe apple inside. You opened the cage, causing
      the apple to rot instantly. You used the &quot;undo&quot; command to revert this action.
    </li>
    <li>In the Curving Hall at Pedestal, you discovered a short black marble pedestal.</li>
    <li>You briefly entered a dark passage called the Natural Passage but used the &quot;undo&quot; command to return to the
      lit area.
    </li>
    <li>In the Curving Hall, West End, you found a window that looked out into a dark cavern with a waterfall.</li>
    <li>You went south and found yourself in the North Alcove, where you discovered a pale gauzy rag, which you
      took.
    </li>
  </ol>
  <p>Your inventory currently includes:</p>
  <ul>
    <li>Brown mask</li>
    <li>White mask</li>
    <li>Copper key</li>
    <li>Quill pen</li>
    <li>Pale gauzy rag</li>
  </ul>
  <p>You have achieved 1 out of 7 main goals in the game. Unexplored areas and actions include:</p>
  <ul>
    <li>Archway to the east in the Curving Hall&apos;s Pedestal area</li>
    <li>Locked lead-slab door in the Curtained Room</li>
    <li>Exploring the dark passage in the Natural Passage area</li>
    <li>Vast machine in the chamber south of the North Alcove</li>
  </ul>
  <p>Use this summary to continue playing and exploring new areas, while remembering to examine any new items or
    objects you discover.</p>
</div>

<div class="user-text">
  Can you also make a list of all the areas discovered so far, how they connect to other areas, and which directions
  are unexplored, and where there are still unexplored or unsolved clues?
</div>

<div class="gpt-text">
  <p>Here is a list of all the areas discovered so far, their connections, unexplored directions, and unexplored or
    unsolved clues:</p>

  <ol>
    <li>
      <p>Cell</p>
      <ul>
        <li>Connection: East to Narrow Hallway</li>
        <li>Unexplored: None</li>
      </ul>
    </li>

    <li>
      <p>Narrow Hallway</p>
      <ul>
        <li>Connection: West to Cell, East to Crowded Study (upstairs)</li>
        <li>Unexplored: None</li>
      </ul>
    </li>

    <li>
      <p>Crowded Study</p>
      <ul>
        <li>Connection: Downstairs to Narrow Hallway, North to Sitting Room, East to Curving Hall</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Locked lead-slab door in the Curtained Room (south from Sitting Room)</li>
      </ul>
    </li>

    <li>
      <p>Sitting Room</p>
      <ul>
        <li>Connection: South to Crowded Study, East to Curving Hall, Southeast to Curtained Room</li>
        <li>Unexplored: East (unlocked white door)</li>
      </ul>
    </li>

    <li>
      <p>Curving Hall</p>
      <ul>
        <li>Connection: West to Sitting Room, Northeast to Atelier, East to Mosaic Room, Southeast to Pedestal
          area
        </li>
        <li>Unexplored: East (archway in Pedestal area)</li>
      </ul>
    </li>

    <li>
      <p>Atelier</p>
      <ul>
        <li>Connection: Southwest to Curving Hall</li>
        <li>Unexplored: None</li>
      </ul>
    </li>

    <li>
      <p>Mosaic Room</p>
      <ul>
        <li>Connection: West to Curving Hall</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Apple in the cage</li>
      </ul>
    </li>

    <li>
      <p>Curving Hall at Pedestal</p>
      <ul>
        <li>Connection: West to Curving Hall, North to Natural Passage, Northeast to Curving Hall, West End</li>
        <li>Unexplored: None</li>
      </ul>
    </li>

    <li>
      <p>Natural Passage</p>
      <ul>
        <li>Connection: South to Curving Hall at Pedestal, North to Darkness</li>
        <li>Unexplored: North (dark passage)</li>
      </ul>
    </li>

    <li>
      <p>Curving Hall, West End</p>
      <ul>
        <li>Connection: East to Curving Hall at Pedestal, South to North Alcove, North to an unknown area</li>
        <li>Unexplored: North (archway)</li>
      </ul>
    </li>

    <li>
      <p>Curtained Room</p>
      <ul>
        <li>Connection: West to Sitting Room, Northwest to Curving Hall</li>
        <li>Unexplored: South (locked lead-slab door)</li>
        <li>Unsolved Clues: Locked lead-slab door</li>
      </ul>
    </li>
    <li>
      <p>North Alcove</p>
      <ul>
        <li>Connection: South to Curving Hall, West End, North to an unknown area</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Vast machine in the chamber south of North Alcove</li>
      </ul>
    </li>
  </ol>
  <p>Use this list to guide your exploration and to solve unexplored or unsolved clues in the game.</p>
</div><!--kg-card-end: html--><p>Then I started a new conversation and asked it to continue the game, given this summary.</p><!--kg-card-begin: html--><div class="user-text">
    You are going to play a text adventure game.
    <br><br>
    [ explanation of the rules ]
    <br><br>
    You already played the game before. Here is a summary you created of your progress so far:
    <br><br>
    [ GPT-4 generated summary of the progress and the rooms ]
    <br><br>
    What is your next command?
</div>

<div class="gpt-text">south</div>

<div class="game-text">
    <b>Orrery</b><br><br>
    You stand in a wide, tall, and dimly lit chamber. It has six sides; smaller alcoves open to the north and south.
    <br><br>
    The chamber is dominated by a vast machine: an engine of gears, shafts, and clattering motion. It is primarily a
    great stately disk of brass which turns on a tilted axis. Smaller wheels pirouette on the disk&apos;s face, bearing
    globes of delicate glass in their complicated courses.
    <br><br>
    The great brass disk continues its revolution. The silver wheel is borne out of reach.
    <br><br>
    You notice a blue mask fluttering from one of the glass globes on the machine&apos;s wheels.
</div>

<div class="gpt-text">take blue mask</div>

<div class="game-text">
    The tan globe is mounted on the silver wheel, which is out of reach.
    <br><br>
    The great brass disk continues its revolution.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The silver wheel whirls past the top of its orbit. The copper wheel, opposite it, is at its lowest.
</div>

<div class="gpt-text">take blue mask</div>

<div class="game-text">
    The tan globe is mounted on the silver wheel, which is out of reach.
    <br><br>
    The great brass disk continues its revolution. The copper wheel is borne out of reach.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The great brass disk continues its revolution.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The copper wheel spins past the highest point of the great disk. The silver wheel is at the lowest.
</div>

<div class="gpt-text">take blue mask</div>

<div class="game-text">
    The silver wheel is within reach, but the tan globe is on the wheel&apos;s upper side, out of reach.
    <br><br>
    The great brass disk continues its revolution. The silver wheel is borne out of reach.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The great brass disk continues its revolution.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The silver wheel whirls past the top of its orbit. The copper wheel, opposite it, is at its lowest.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The great brass disk continues its revolution. The copper wheel is borne out of reach.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The great brass disk continues its revolution.
</div>

<div class="gpt-text">wait</div>

<div class="game-text">
    Time passes.
    <br><br>
    The copper wheel spins past the highest point of the great disk. The silver wheel is at the lowest. The tan globe,
    at the nadir of its own revolution around that wheel, is sweeping just inches above the floor. The mask, fluttering
    from the tan globe, is now within reach.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-25.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-25.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-25.png 1000w, https://wingedsheep.com/content/images/2023/03/image-25.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>The machine</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">take blue mask</div>

<div class="game-text">
    You snatch at the blue mask as it whips by. You can&apos;t get a grip, but you manage to knock the mask free with the
    tips of your fingers. It flutters silently to the floor.
    <br><br>
    The great brass disk continues its revolution. The silver wheel is borne out of reach.
</div>

<div class="gpt-text">pick up blue mask</div>

<div class="game-text">
    Taken.
    <br><br>
    The great brass disk continues its revolution.
    <br><br>
    [Your score has gone up.]
</div>

<div class="remark-text">The second point, after completing a puzzle. GPT is doing well!</div>

<div class="gpt-text">inventory</div>

<div class="game-text">
    You are carrying a scrap of gauze, a copper key, a quill pen, and three masks (a blue mask, a white mask, and a
    brown mask).
    <br><br>
    The silver wheel whirls past the top of its orbit. The copper wheel, opposite it, is at its lowest.
</div>

<div class="gpt-text">go north</div>

<div class="game-text">
    <b>North Alcove</b>
    <br><br>
    &quot;But is it reality?&quot; The question sparkles with unheeded eagerness; the questioner&apos;s gaze is fiercely entangled
    among the turning rings and delicate gears.
    <br><br>
    &quot;Of course it is not,&quot; comes the reply. &quot;The model has not even the right form. The sky is not full of wheels upon
    wheels. But--&quot; overrunning the interruption &quot;--that does not mean the model lacks power.&quot; The voice is suddenly dry.
    &quot;Symbolism and intent, child. What better symbol for power than this: a machine just within our own limits of
    understanding?&quot;
    <br><br>
    The machine revolves.
</div>

<div class="gpt-text">go south</div>

<div class="game-text">
    <b>Orrery</b>
    <br><br>
    The chamber is dominated by a vast machine: an engine of gears, shafts, and clattering motion. It is primarily a
    great stately disk of brass which turns on a tilted axis. Smaller wheels pirouette on the disk&apos;s face, bearing
    globes of delicate glass in their complicated courses.
    <br><br>
    The great brass disk continues its revolution.
</div>

<div class="gpt-text">go east</div>

<div class="game-text">
    The only ways out are the alcoves to the north and south.
    <br><br>
    The copper wheel spins past the highest point of the great disk. The silver wheel is at the lowest.
</div>

<div class="gpt-text">go south</div>

<div class="game-text">
    <b>South Alcove</b>
    <br><br>
    This is a small, curved alcove, off a large chamber to the north. A plain iron ladder leads up through a shaft.
    <br><br>
    The machine spins on.
</div>

<div class="gpt-text">climb ladder</div>

<div class="game-text">
    You swing onto the ladder and climb.
    <br><br>
    <b>Dark Dome, North</b>
    <br><br>
    You stand at the north edge of a vast round space. It stretches out to the south, arching into an immense dome. A
    diffuse illumination spreads across the lower reaches, barely bright enough to see by.
    <br><br>
    A ladder reaches both upwards and downwards from here, passing through openings in the floor and in the dome&apos;s
    skirt. You can also see a doorway off in the distance, at the far east edge of the dome.
</div>

<div class="gpt-text">climb ladder</div>

<div class="game-text">
    Do you want to go up or down?
</div>

<div class="gpt-text">up</div>

<div class="game-text">
    You climb up, through the dome, and a long way farther...
    <br><br>
    <b>Translucent Dome</b>
    <br><br>
    You are in a small round dome, much smaller than the vast dark space below. The curving surface is translucent,
    bright with the daylight filtering in from outside. The floor beneath your feet is a harsh metal grating. The ladder
    runs from a hole in the grating, near the south side, up to a matching opening in the dome above.
    <br><br>
    A low platform fills the center of the floor. The platform is piled high with split lengths of wood.
    <br><br>
    A tall triangle of beaten copper rises along the north side of the dome.
</div>

<div class="gpt-text">examine triangle of beaten copper</div>

<div class="game-text">
    I only understood you as far as wanting to examine the tall copper triangle.
</div>

<div class="gpt-text">examine tall copper triangle</div>

<div class="game-text">
    It is a thin sheet of hammered copper, as wide at the base as your outstretched arms. The sheet tapers as it rises,
    curving inward as it hugs the dome&apos;s inner surface. Its peak is halfway up the dome. The shape reminds you of a
    billowing sail.
    <br><br>
    The copper triangle stands to the north, but its base rests in a narrow track that runs all the way around the dome.
</div>

<div class="gpt-text">examine platform</div>

<div class="game-text">
    The wood is laid out in an immense, semicircular heap. It looks like nothing so much as a bonfire, ready for the
    spark.
</div>

<div class="gpt-text">examine grating</div>

<div class="game-text">
    You see nothing special about the grating.
</div>

<div class="gpt-text">move copper triangle</div>

<div class="game-text">
    You reach wide to grasp the sail&apos;s edge, and give an experimental shove. You were right -- it slides
    along the track, although the motion is stiff and the track squeals painfully. With some effort, you drag the
    triangle sideways around the dome, until it stands on the east side.
</div>

<div class="gpt-text">climb ladder down</div>

<div class="game-text">
    I only understood you as far as wanting to climb the ladder.
</div>

<div class="remark-text">
    Here, GPT-4 went into a bit of a loop, moving back and forth between the same rooms. I&apos;m not sure why, but I
    reset the game to this point and tried again.
</div>

<div class="gpt-text">climb down ladder</div>

<div class="game-text">
    You descend.
    <br><br>
    <b>Dark Dome, North</b>
</div>

<div class="gpt-text">go south</div>

<div class="game-text">
    <b>Dark Dome, Center</b>
    <br><br>
    You stand at the center of a vast round space. An immense dome arches above you. A diffuse illumination spreads
    across the lower reaches, barely bright enough to see by.
    <br><br>
    In the distance to the east, you can see a doorway; a ladder is visible far to the north.
    <br><br>
    A low metal pyramid stands in the center of the floor. Its surface shines with a dim, oddly shifting gleam. Its base
    has hinges along one edge, and a handle opposite.
</div>

<div class="gpt-text">examine metal pyramid</div>

<div class="game-text">
    It&apos;s a six-sided pyramid, perhaps a yard across and standing higher than your knee. It seems to be made of metal,
    but it has a strange sheen -- as if the surface were engraved with countless parallel lines. Hinges at the base of
    one edge, and a handle, imply that the pyramid could be pulled open.
</div>

<div class="gpt-text">open pyramid</div>

<div class="game-text">
    You crouch, seize the handle, and pull. The pyramid swings smoothly to the side, and falls open. It seems to be
    hollow... strange, then, how heavy it felt.
    <br><br>
    Revealed within is a conical basket of coiled wire.
</div>

<div class="gpt-text">close pyramid</div>

<div class="game-text">
    You heave the pyramid back upright, covering the basket.
</div>

<div class="clarification-text">
    Can you explain in detailed your reasoning for your last action?
</div>

<div class="clarification-text">
    My last action was to close the pyramid to return it to its original state. This was done because examining the
    contents of the pyramid revealed a conical basket of coiled wire, but there was no immediate use or reason to
    interact with the basket at this point. By closing the pyramid, we preserve the environment and can continue
    exploring other areas while keeping in mind the existence of the basket inside the pyramid for future reference or
    interaction.
</div>

<div class="gpt-text">go east</div>

<div class="game-text">
    <b>Dark Dome, East</b>
    <br><br>
    You stand at the east edge of a vast round space. It stretches out to the west, arching into an immense dome. A
    diffuse illumination spreads across the lower reaches, barely bright enough to see by.
    <br><br>
    There is an open archway to the east; beyond it, stairs descend. You can also see a ladder in the distance, at the
    north edge of the dome.
</div>

<div class="gpt-text">go east</div>

<div class="game-text">
    You descend the narrow stairs to a white door, which you push open.
    <br><br>
    <b>Curving Hall, South End</b>
    <br><br>
    The curving corridor ends here. The blank plaster wall to the south features a large window; sunlight pours in,
    brightening this end of the hall. You can go through the archway to the east, take the stairs which ascend to the
    west, or return north along the corridor.
</div>

<div class="gpt-text">go east</div>

<div class="game-text">
    <b>Dim Shed</b>
    <br><br>
    This room looks like nothing so much as a small, windowless garden shed. The floor is bare dirt; the walls are unfinished planks. The only light falls in through the archway to the west. A narrow opening to the north leads to a steep stairway, which climbs away into darkness.
    <br><br>
    A single glove is lying in the corner, lost and alone.
</div>

<div class="gpt-text">take glove</div>

<div class="game-text">
    Taken.
    <br><br>
    [To wear an item of clothing, such as this glove, use the &quot;wear thing&quot; or &quot;put on thing&quot; command. To take it off again, try &quot;remove thing&quot; or &quot;take off thing&quot;.]
</div>

<div class="gpt-text">wear glove</div>

<div class="game-text">
    You put on the glove.
</div>

<div class="gpt-text">inventory</div>

<div class="game-text">
    You are carrying a glove (being worn), a scrap of gauze, a copper key, a quill pen, and three masks (a blue mask, a white mask, and a brown mask).
</div>

<div class="gpt-text">go north</div>

<div class="game-text">
    You set foot on the narrow stairway.
    <br><br>
    <b>Landing</b>
    The cramped stair reaches a landing here; it reverses and continues upward to the south. The walls are close and dark.
</div>

<div class="remark-text">
    Here I asked GPT-4 for a plan of action, and it gave me a list of things to explore.<br>
    Note that it suggests using the copper key on the lead-slab door in the Curtained Room. GPT-4 forgot to mention in its summary that it had already tried that, and failed.
</div>

<div class="user-text">What remains for you to explore? Give a list of all the things you still want to explore and make a detailed plan on how to go about it, taking into account priority and expectations.</div>

<div class="gpt-text">Here is a list of unexplored areas and actions, along with a suggested plan to prioritize and explore them:
    <ol>
        <li>Archway to the east in the Curving Hall&apos;s Pedestal area
            <ul>
                <li>Plan: After exploring the current stairway, return to the Curving Hall&apos;s Pedestal area and go east through the archway.</li>
            </ul>
        </li>
        <li>Locked lead-slab door in the Curtained Room
            <ul>
                <li>Plan: Once you have explored the new areas, try using the copper key on the locked door in the Curtained Room.</li>
            </ul>
        </li>
        <li>Exploring the dark passage in the Natural Passage area
            <ul>
                <li>Plan: After exploring the other areas, return to the Natural Passage and venture into the dark passage. Consider finding a light source before proceeding.</li>
            </ul>
        </li>
        <li>Vast machine in the chamber south of the North Alcove
            <ul>
                <li>Plan: Investigate the vast machine further and try interacting with it using the items in your inventory.</li>
            </ul>
        </li>
        <li>Unlocked white door in the Sitting Room
            <ul>
                <li>Plan: Return to the Sitting Room and go east through the unlocked white door.</li>
            </ul>
        </li>
        <li>Archway to the north in the Curving Hall
            <ul>
                <li>Plan: Return to the Curving Hall and go north through the archway.</li>
            </ul>
        </li>
        Prioritize exploring the unexplored areas first, starting with the unlocked white door and the archways in the Curving Hall. Then, try using the copper key on the locked door and investigate the dark passage. Lastly, focus on interacting with the vast machine and any other unsolved clues using the items in your inventory.
    </ol>
</div><!--kg-card-end: html--><!--kg-card-begin: html--><div class="user-text">
    Continue the game.
</div>

<div class="gpt-text">
    go south
</div>

<div class="game-text">
    You continue climbing.
    <br><br>
    <b>Landing</b>
    <br><br>
    The cramped stair reaches a landing here; it reverses and continues upward to the north. The walls are close and
    dark.
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    You continue climbing.
    <br><br>
    <b>Landing</b>
    <br><br>
    The cramped stair reaches a landing here; it reverses and continues upward to the south. The walls are close and
    dark.
</div>

<div class="gpt-text">
    go south
</div>

<div class="game-text">
    You emerge into open air -- chill and fair-scented.
    <br><br>
    <b>Mountain Path</b>
    <br><br>
    You stand at the foot of a low rocky cliff. It squats above you, but it obscures little of the vast blue sky that
    stretches all around. Mossy boulders hem you in on either side; a tidy path winds to the south between them. To the
    north the path enters a crack in the cliff, meeting stairs which vanish down into enclosed darkness.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-29.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-29.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-29.png 1000w, https://wingedsheep.com/content/images/2023/03/image-29.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Mountain path</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">
    go south
</div>

<div class="game-text">
    The boulders open out as you follow the path.
    <br><br>
    <b>Mountain Garden</b>
    <br><br>
    A tiny pleasance-garden is nestled here, high on a mountainside. Odd bits of statuary stand among the sculpted
    slopes and hillocks; small marble pillars mark the borders of the knotted paths. The lawn is perfectly trimmed. The
    mountain towers above you to the north; high on its face you see a featureless white dome. Above that, the sun
    shines in a wide blue mountain&apos;s sky.
    <br><br>
    A tidy path runs north between mossy boulders. A wider path curves west, down a grassy slope, and up to the east. To
    the south, a few marble steps lead to a balcony, which looks out over a verdant valley. You can see a particularly
    tall statue on the balcony.
</div>

<div class="gpt-text">
    go east
</div>

<div class="game-text">
    You climb the path, fog trailing around your feet.
    <br><br>
    <b>Cool Bower</b>
    <br><br>
    You stand on a small promontory which juts out of the face of the mountain. Shrubs and raised flowerbeds lie around
    you, except for the path which slopes down to the west. To the south and east, a sharp dropoff looks out over a lush
    green valley.
    <br><br>
    In the center of the bower, a single dense bush squats, sullen and dark. Its branches knot heavily around each
    other, then spread into sprays of delicate, blue-green needles. Strangely, a chill fog seems to spread out from
    under the bush; it rolls across the ground and spills from the edges of the promontory.
</div>

<div class="gpt-text">
    examine bush
</div>

<div class="game-text">
    The bush is broad and squat. Its blue-tinged needle-like leaves grow profusely, hiding heavy branches and small
    clusters of translucent white berries.
</div>

<div class="gpt-text">
    take berries
</div>

<div class="game-text">
    You reach into the bush, and -- with your gloved hand -- carefully strip a handful of berries from a branch.
    <br><br>
    After a few moments, their translucency dulls to a cloudy white, and the chill you feel through the glove
    diminishes. Gingerly you prod a berry with your bare finger. It&apos;s cool, but no longer burning-cold.
    <br><br>
    The fog ripples gently on the ground, caught by a breath of breeze.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-30.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-30.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-30.png 1000w, https://wingedsheep.com/content/images/2023/03/image-30.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>White berries</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">
    inventory
</div>

<div class="game-text">
    You are carrying a handful of white berries, a glove (being worn), a scrap of gauze, a copper key, a quill pen, and
    three masks (a blue mask, a white mask, and a brown mask).
    <br><br>
    [You&apos;re carrying quite a lot of stuff. You might be wondering how you can juggle it all. Some games limit the number
    of things you can carry, or provide you with some kind of sack to carry your loot around in.
    <br><br>
    However, many games -- including this one -- simply ignore the problem. Packing your luggage, or stowing it in some
    central location, isn&apos;t all that much fun. Therefore, the game lets you carry around as much as you want.]
</div>

<div class="gpt-text">
    go west
</div>

<div class="game-text">
    <b>Mountain Garden</b>
</div>

<div class="gpt-text">
    go south
</div>

<div class="game-text">
    You step up to the balustrade and look out, to the south...
    <br><br>
    <b>Marble Balcony</b>
    <br><br>
    Below this gently curved balcony, the world drops away into a green vista. The stony slopes of the mountainside
    beneath you crumble, invaded by bracken and tree, until the mountain pines merge into verdant forest and a lush
    valley floor. A bright thread marks a stream; a distant valley lake is a silver arc. Beyond the valley, and around
    it, taller mountains stand like patient shadows in the blue air.
    <br><br>
    In the center of the balcony, looking out -- as you are -- over the valley, a white marble statue towers over you.
    Incongruously, you can see a small gold mask balanced on the statue&apos;s face.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-28.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-28.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-28.png 1000w, https://wingedsheep.com/content/images/2023/03/image-28.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Gold mask</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">
    take gold mask
</div>

<div class="game-text">
    You cannot reach the gold mask.
</div>

<div class="gpt-text">
    examine statue
</div>

<div class="game-text">
    The statue is twice life size; it dwarfs you. Its form is curiously abstract. You can make out no gender, no
    personality in the marble curves. But... the statue gazes out from the balcony. Its weight is forward, its head
    turned, as if something in the distant valley had just caught its attention. Or... something rising from the valley,
    perhaps. For the chin is raised; the eyes, if you could see them, would be level.
    <br><br>
    Those eyes are hidden by an absurdly small gold mask. The mask would not fit a child, and is unusually flat besides.
    It&apos;s not so much worn as balanced on the statue&apos;s brow.
</div>

<div class="gpt-text">
    find a way to reach the gold mask
</div>

<div class="game-text">
    That&apos;s not a verb I recognize.
    <br><br>
    [Don&apos;t know what to do? Type &quot;help&quot;. If you&apos;re trying to find the right word to make something happen, try &quot;help
    commands&quot;.]
</div>

<div class="remark-text">
    I didn&apos;t show the &quot;help&quot; command to GPT-4 here, because it would start to use it to get hints.
</div>

<div class="gpt-text">
    climb statue
</div>

<div class="game-text">
    You try to swing yourself up on the marble knee, but the statue shifts unsteadily beneath your weight. You&apos;d best
    not.
</div>

<div class="gpt-text">
    look for a tool or object to help reach the gold mask
</div>

<div class="game-text">
    I only understood you as far as wanting to look.
</div>

<div class="gpt-text">
    look around
</div>

<div class="game-text">
    I only understood you as far as wanting to look.
</div>

<div class="gpt-text">
    look
</div>

<div class="game-text">
    <b>Marble Balcony</b>
    <br><br>
    Below this gently curved balcony, the world drops away into a green vista. The stony slopes of the mountainside
    beneath you crumble, invaded by bracken and tree, until the mountain pines merge into verdant forest and a lush
    valley floor. A bright thread marks a stream; a distant valley lake is a silver arc. Beyond the valley, and around
    it, taller mountains stand like patient shadows in the blue air.
    <br><br>
    In the center of the balcony, looking out over the valley, a white marble statue towers over you. Incongruously, you
    can see a small gold mask balanced on the statue&apos;s face.
</div>

<div class="gpt-text">
    return to Mountain Garden
</div>

<div class="game-text">
    That&apos;s not a verb I recognize.
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    Mountain Garden
</div>

<div class="gpt-text">
    go west
</div>

<div class="game-text">
    As you descend the path, you see a thread of smoke rising ahead.
    <br><br>
    <b>Warm Bower</b>
    <br><br>
    This corner of the garden is cozily tucked into a natural alcove, surrounded by stone bluffs on three sides. The sun
    is hot on your face. To the south, the ground drops away, revealing a lush valley far below. The path back to the
    garden curves up around an outcropping to the east.
    <br><br>
    Small shrubs dot this garden bower, but a single tall and wild bush dominates the space. Its branches twist in
    intricate profusion, then leap chaotically upward, spraying gold-veined leaves through the air.
</div>

<div class="gpt-text">
    examine bush
</div>

<div class="game-text">
    The wild bush is not broad, but it is taller than you. Its leaves are narrow, glossy, many-pointed, and veined with
    gold amid a yellow blush. Clusters of brilliant orange berries hang half-concealed amid the tangled black branches.
    <br><br>
    You catch a whiff of woodsmoke -- the same smoke you saw while descending the path. You glance around for the
    fire...
    <br><br>
    ...And realize that the smoke is drifting from the bush. You see no flames, nor even ember-glow; but grey wisps curl
    from the coal-black stems and branches. The smoke trails up from the bush, buoyed on its own heat, and vanishes
    upward in a wind-tossed ribbon.
</div>

<div class="gpt-text">
    take orange berries
</div>

<div class="game-text">
    You reach into the bush, and -- with your gloved hand -- carefully strip a handful of berries from a branch.
    <br><br>
    After a few moments, their orange color dulls slightly, and the heat you feel through the glove diminishes. Gingerly
    you prod a berry with your bare finger. It&apos;s warm, but no longer scalding.
</div>

<div class="gpt-text">
    inventory
</div>

<div class="game-text">
    You are carrying a handful of orange berries, a handful of white berries, a glove (being worn), a scrap of gauze, a
    copper key, a quill pen, and three masks (a blue mask, a white mask, and a brown mask).
    <br><br>
    The taste of smoke catches you again.
</div>

<div class="gpt-text">
    go east
</div>

<div class="game-text">
    <b>Mountain Garden</b>
</div>

<div class="gpt-text">
    go south
</div>

<div class="game-text">
    <b>Marble Balcony</b>
    <br><br>
    In the center of the balcony, looking out over the valley, a white marble statue towers over you. Incongruously, you
    can see a small gold mask balanced on the statue&apos;s face.
</div>

<div class="gpt-text">
    use orange berries to reach gold mask
</div>

<div class="game-text">
    That&apos;s not a verb I recognize.
    <br><br>
    [There is no &quot;use&quot; command in most text adventures. (If there was, what would be the point in providing any other
    commands?) Instead, try a command which is appropriate to whatever you&apos;re doing. If you have a key, try &quot;unlock&quot;
    something. If you have a book, try to &quot;read&quot; it. If you find a lever, try to &quot;pull&quot; or &quot;push&quot; it.]
</div>

<div class="gpt-text">
    throw orange berries at gold mask
</div>

<div class="game-text">
    You cannot reach the gold mask.
</div>

<div class="gpt-text">
    return to Mountain Garden
</div>

<div class="game-text">
    That&apos;s not a verb I recognize.
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    <b>Mountain Garden</b>
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    <b>Mountain Path</b>
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    You enter the narrow stairway and begin to descend. After only a few steps, you find yourself at the bottom. Odd....
    <br><br>
    <b>Dim Shed</b>
    <br><br>
    &quot;To stand in a dreamhold is to be no more than a thought in a wizard&apos;s dream.&quot; Or so it is said... somewhere.
    Certainly this stairway is changeable as a dream.
</div>

<div class="gpt-text">
    go west
</div>

<div class="game-text">
    <b>Curving Hall, South End</b>
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    <b>Curving Hall</b>
</div>

<div class="gpt-text">
    go east
</div>

<div class="game-text">
    <b>Mosaic Room</b>
    <br><br>
    A delicate cage of brass wire hangs from a curved stand in the center of the room. Within the cage is a single ripe
    apple.
</div>

<div class="gpt-text">
    go west
</div>

<div class="game-text">
    <b>Curving Hall</b>
</div>

<div class="gpt-text">
    go northwest
</div>

<div class="game-text">
    <b>Curving Hall at Pedestal</b>
    <br><br>
    A short pedestal of black marble stands by the inner wall.
</div>

<div class="gpt-text">
    go east
</div>

<div class="game-text">
    You can follow the corridor to the west or southeast; or you can go north or northeast.
</div>

<div class="gpt-text">
    go northeast
</div>

<div class="game-text">
    <b>Harp Chamber</b>
    <br><br>
    Broad golden pillars march around the edge of this circular chamber. The walls between the pillars are deeply set,
    painted in variegated shades of blue and sea-green, and lit from some hidden source. An archway leads southwest, and
    there is a door to the east. The eastern door is closed; blinding light seeps out around its edges.
    <br><br>
    In the center of the room, the remains of a tall harp stand in proud ruin.
    <br><br>
    Off to one side, lying on the floor, you see something that looks like a short bundle of straw.
</div>

<div class="gpt-text">
    examine harp remains
</div>

<div class="game-text">
    This once-proud instrument looks as if it was destroyed in inferno -- although the room shows no other signs of a
    fire. The harp&apos;s pillar and frame are blackened and cracked; the soundbox is split apart. The few remaining strings
    are curled knots of ash.
    <br><br>
    &quot;What is this,&quot; you wonder, &quot;in a wizard&apos;s house?&quot; A failed spell? A defeated enemy? A strayed memory? Or a warning,
    or a word of past or prophecy. Or a splinter of charred wood.
</div>

<div class="gpt-text">
    take bundle of straw
</div>

<div class="game-text">
    You pick up the bundle of straw, and look it over. Your best guess is that it&apos;s a torch of some sort. The straw is
    tied tightly at one end, forming a handle; the other end is splayed, and seems to be slightly charred.
</div>

<div class="gpt-text">
    inventory
</div>

<div class="game-text">
    You are carrying a straw torch, a handful of orange berries, a handful of white berries, a glove (being worn), a
    scrap of gauze, a copper key, a quill pen, and three masks (a blue mask, a white mask, and a brown mask).
</div>

<div class="gpt-text">
    go southwest
</div>

<div class="game-text">
    <b>Curving Hall at Pedestal</b>
    <br><br>
    A short pedestal of black marble stands by the inner wall.
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    You blink into the dimming light as you step through the arch.
    <br><br>
    <b>Natural Passage</b>
</div>

<div class="gpt-text">
    light torch
</div>

<div class="game-text">
    You thrust the orange berry into the straw bundle. It bursts, spattering juice that immediately flashes to flame.
    Sparks lodge throughout the straw... which crackles in response. In seconds the torch is burning brightly.
</div>

<div class="gpt-text">
    go north
</div>

<div class="game-text">
    <b>Vaulting Cavern</b>
    <br><br>
    A high, arched space opens around you, deep within the earth. The floor is unevenly interspersed with stalagmites
    and stone columns; your torchlight glitters in droplets from the stalactites above. Between the pale, hanging
    pinnacles of frozen stone, a vein of dark ore streaks the vault.
    <br><br>
    A narrow passage leads away to the south. A broader one enters on the west side; it once crossed the cave, but the
    eastern exit has collapsed. A low crawl runs northeast. At one edge of the cave, a pit descends abruptly. Wisps of
    steam rise from its depths.
</div><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2023/03/image-31.png" class="kg-image" alt="Journey into the Dreamhold: Testing GPT-4&apos;s General Intelligence Through a Text Adventure Quest" loading="lazy" width="1344" height="896" srcset="https://wingedsheep.com/content/images/size/w600/2023/03/image-31.png 600w, https://wingedsheep.com/content/images/size/w1000/2023/03/image-31.png 1000w, https://wingedsheep.com/content/images/2023/03/image-31.png 1344w" sizes="(min-width: 720px) 720px"><figcaption>Vaulting cavern</figcaption></figure><!--kg-card-begin: html--><div class="gpt-text">
    examine pit
</div>

<div class="game-text">
    The floor slopes sharply downward at the cave&apos;s edge, narrowing into a twisting pit. It looks like you could climb
    down safely -- at least as far down as you can see. Wisps of steam rise from the pit.
</div>

<div class="gpt-text">
    climb down pit
</div>

<div class="game-text">
    You climb carefully into the pit.
    <br><br>
    <b>Ledge in Pit</b>
    <br><br>
    You are balanced on a ledge, leaning against the wall of a twisty, irregular pit. Across from you, and slightly above, you can see a narrow opening in the wall. A climbable rough path leads upward. You might be able to descend further, but the pit beneath you is nearly vertical, and the stone is damp and slippery with condensation.
    <br><br>
    A warm breath of air rises slowly up the pit, steadily, carrying with it an eddying stream of mist.
</div><!--kg-card-end: html--><h2 id="part-3-planning-for-the-future">Part 3: Planning for the future</h2><p></p><p>We were getting close to 8k tokens again, so I asked GPT-4 to summarize its progress in the game again.</p><!--kg-card-begin: html--><div class="user-text">
  Give a detailed summary of the game so far containing all the necessary and useful information for if you want to
  continue the game later. Don&apos;t omit any details that might be useful.
</div>

<div class="gpt-text">
  <br><br>
  <b>Summary of the game progress so far:</b>
  <br><br>
  <ol>
    <li>Started in a small Cell with rough stone walls and a smooth white floor. A narrow gap in the east wall led
      to the Narrow Hallway.
    </li>
    <li>In the Narrow Hallway, found stairs leading up to the Crowded Study.</li>
    <li>In the Crowded Study, found an immense book detailing portal theories, a tall glass-fronted cabinet filled
      with curiosities, and a small brass trunk. Opened the trunk and took a copper key.
    </li>
    <li>Discovered carrying a quill pen, which was examined but couldn&apos;t remember its origin.</li>
    <li>From the Crowded Study, went north to the Sitting Room, where a fireplace with glass spheres and a desert
      landscape painting were found.
    </li>
    <li>In the Atelier, accessible from the Curving Hall, found a painting of a mountain pool, a small telescope,
      and a pigment-daubed board. Looked through the telescope and found oneself in a metal culvert that led to
      the mountain pool. Took a brown mask there.
    </li>
    <li>Returned to the Crowded Study, found a white mask on the desk, and experienced a memory when held it up to
      the face.
    </li>
    <li>Explored the Curtained Room, where a massive high-backed chair and a tall mirror were found. When sat in the
      chair, the reflection in the mirror was distorted, and dim white and brown shadows were seen.
    </li>
    <li>In the Mosaic Room, found a delicate cage with a single ripe apple inside. Opened the cage, causing the
      apple to rot instantly. Used the &quot;undo&quot; command to revert this action.
    </li>
    <li>In the Curving Hall at Pedestal, discovered a short black marble pedestal.</li>
    <li>Briefly entered a dark passage called the Natural Passage but used the &quot;undo&quot; command to return to the lit
      area.
    </li>
    <li>In the Curving Hall, West End, found a window that looked out into a dark cavern with a waterfall.</li>
    <li>Went south and found oneself in the North Alcove, where a pale gauzy rag was discovered and taken.</li>
    <li>Took a blue mask from a vast machine in the Orrery.</li>
    <li>Explored the Dim Shed and found a glove, which was put on.</li>
    <li>Climbed a ladder up to the Translucent Dome where a platform with split lengths of wood was found.</li>
    <li>Went to the Mountain Garden, and found a gold mask on a statue that was out of reach.</li>
    <li>In the Cool Bower, found a bush with white berries that were cold to the touch. Took a handful.</li>
    <li>In the Warm Bower, found a bush with orange berries that were hot to the touch. Took a handful.</li>
    <li>In the Harp Chamber, found a straw torch.</li>
    <li>Lit the torch in the Natural Passage and entered the Vaulting Cavern, where a pit with steam rising from it
      was discovered.
    </li>
  </ol>
  <b>Inventory:</b>
  <br><br>
  <ul>
    <li>Brown mask</li>
    <li>White mask</li>
    <li>Blue mask</li>
    <li>Copper key</li>
    <li>Quill pen</li>
    <li>Pale gauzy rag</li>
    <li>Glove
    </li><li>Handful of white berries</li>
    <li>Handful of orange berries</li>
    <li>Straw torch (lit)</li>
  </ul>

  <p>2 out of 7 main goals have been achieved in the game. Unexplored areas and actions include:</p>

  <ul>
    <li>Archway to the east in the Curving Hall&apos;s Pedestal area</li>
    <li>Locked lead-slab door in the Curtained Room</li>
    <li>Vast machine in the chamber south of the North Alcove</li>
    <li>Unlocked white door in the Sitting Room</li>
    <li>Archway to the north in the Curving Hall, West End</li>
    <li>Continuing to explore the pit in the Vaulting Cavern</li>
    <li>Finding a way to reach the gold mask on the statue in the Marble Balcony</li>
  </ul>

  <p>Currently standing on a ledge in the pit within the Vaulting Cavern.</p>
</div>

<div class="user-text">
  Please make a list of all the rooms you have discovered, the directions that you can take from there and where they lead to. Note unexplored clues and unexplored directions per room.
</div>

<div class="gpt-text">
  <p>Here is a list of all the areas discovered so far, their connections, unexplored directions, and unexplored or
    unsolved clues:</p>
  <ol>
    <li>
      <p>Cell</p>
      <ul>
        <li>Connection: East to Narrow Hallway</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Narrow Hallway</p>
      <ul>
        <li>Connection: West to Cell, East to Crowded Study (upstairs)</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Crowded Study</p>
      <ul>
        <li>Connection: Downstairs to Narrow Hallway, North to Sitting Room, East to Curving Hall</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Locked lead-slab door in the Curtained Room (south from Sitting Room)</li>
      </ul>
    </li>
    <li>
      <p>Sitting Room</p>
      <ul>
        <li>Connection: South to Crowded Study, East to Curving Hall, Southeast to Curtained Room</li>
        <li>Unexplored: East (unlocked white door)</li>
      </ul>
    </li>
    <li>
      <p>Curving Hall</p>
      <ul>
        <li>Connection: West to Sitting Room, Northeast to Atelier, East to Mosaic Room, Southeast to Pedestal
          area
        </li>
        <li>Unexplored: East (archway in Pedestal area)</li>
      </ul>
    </li>
    <li>
      <p>Atelier</p>
      <ul>
        <li>Connection: Southwest to Curving Hall</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Mosaic Room</p>
      <ul>
        <li>Connection: West to Curving Hall</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Apple in the cage</li>
      </ul>
    </li>
    <li>
      <p>Curving Hall at Pedestal</p>
      <ul>
        <li>Connection: West to Curving Hall, North to Natural Passage, Northeast to Curving Hall, West End</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Natural Passage</p>
      <ul>
        <li>Connection: South to Curving Hall at Pedestal, North to Vaulting Cavern</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Curving Hall, West End</p>
      <ul>
        <li>Connection: East to Curving Hall at Pedestal, South to North Alcove, North to an unknown area</li>
        <li>Unexplored: North (archway)</li>
      </ul>
    </li>
    <li>
      <p>Curtained Room</p>
      <ul>
        <li>Connection: West to Sitting Room, Northwest to Curving Hall</li>
        <li>Unexplored: South (locked lead-slab door)</li>
        <li>Unsolved Clues: Locked lead-slab door</li>
      </ul>
    </li>
    <li>
      <p>North Alcove</p>
      <ul>
        <li>Connection: South to Curving Hall, West End, North to an unknown area</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Vast machine in the chamber south of North Alcove</li>
      </ul>
    </li>
    <li>
      <p>Dim Shed</p>
      <ul>
        <li>Connection: West to Curving Hall, South End, North to Mountain Path</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Mountain Path</p>
      <ul>
        <li>Connection: South to Mountain Garden, North to Landing</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Mountain Garden</p>
      <ul>
        <li>Connection: North to Mountain Path, West to Warm Bower, East to Cool Bower, South to Marble
          Balcony
        </li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Warm Bower</p>
      <ul>
        <li>Connection: East to Mountain Garden</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Cool Bower</p>
      <ul>
        <li>Connection: West to Mountain Garden</li>
        <li>Unexplored: None</li>
      </ul>
    </li>
    <li>
      <p>Marble Balcony</p>
      <ul>
        <li>Connection: North to Mountain Garden</li>
        <li>Unexplored: None</li>
        <li>Unsolved Clues: Small gold mask on the statue&apos;s face</li>
      </ul>
    </li>
    <li>
      <p>Harp Chamber</p>
      <ul>
        <li>Connection: Southwest to Curving Hall at Pedestal</li>
        <li>Unexplored: East (closed door)</li>
        <li>Unsolved Clues: Short bundle of straw</li>
      </ul>
    </li>
    <li>
      <p>Vaulting Cavern</p>
      <ul>
        <li>Connection: South to Natural Passage, West to a collapsed exit, Northeast to a low crawl, Down to
          Ledge in Pit
        </li>
        <li>Unexplored: Northeast (low crawl)</li>
      </ul>
    </li>
    <li>
      <p>Ledge in Pit</p>
      <ul>
        <li>Connection: Up to Vaulting Cavern</li>
        <li>Unexplored: Down (further into the pit), Across to a narrow opening in the wall</li>
      </ul>
    </li>
  </ol>
  <p>You are currently standing in the &quot;Ledge in Pit&quot; area.</p>
</div><!--kg-card-end: html--><p><br>Then using this information, I asked it to make a plan for advancing in the game and retrieving the third point.</p><!--kg-card-begin: html--><div class="user-text">
    You are going to play a text adventure game.
    <br><br>
    [ explanation of the rules ]
    <br><br>
    You already played the game before. Here is a summary you created of your progress so far:
    <br><br>
    [ GPT-4 generated summary of the progress and the rooms ]
    <br><br>
    Formulate a detailed step-by-step plan for advancing in the game and getting the third point, based on this
    information.
    Reason about the information and items you have obtained. State your expectations for actions. Use logical reasoning
    and state the priority of actions.
</div>

<div class="gpt-text">
    <p>
        Step 1: Exit the pit within the Vaulting Cavern<br>
        Since you are currently standing on a ledge in the pit within the Vaulting Cavern, the first step is to safely
        exit the pit and return to a more stable area.
    </p>
    <p>
        Step 2: Explore the unlocked white door in the Sitting Room<br>
        The unlocked white door in the Sitting Room is one of the unexplored areas. Since you have a lit straw torch, it
        is an ideal time to explore this area. Expect to find new clues or items that can be used later.
    </p>
    <p></p>
    Step 3: Explore the archway to the east in the Curving Hall&apos;s Pedestal area<br>
    Another unexplored area is the archway to the east in the Curving Hall&apos;s Pedestal area. Exploring this area could
    lead to new discoveries or items that will be helpful in future steps.
    <p></p>
    <p>
        Step 4: Continue to explore the pit in the Vaulting Cavern<br>
        With the lit straw torch, you can safely explore the pit in the Vaulting Cavern further. This area has the
        potential to reveal new items, clues, or connections to other areas of the game.
    </p>
    <p>
        Step 5: Explore the archway to the north in the Curving Hall, West End<br>
        Another unexplored area is the archway to the north in the Curving Hall, West End. Head to this area and
        explore, as it may lead to new discoveries or items that will be helpful in future steps.
    </p>
    <p>
        Step 6: Attempt to reach the gold mask on the statue in the Marble Balcony<br>
        With the items in your inventory, try to find a way to reach the gold mask on the statue in the Marble Balcony.
        The mask might be an important item for solving a puzzle or unlocking a new area.
    </p>
    <p>
        Step 7: Examine the vast machine in the chamber south of the North Alcove<br>
        This unsolved clue may be related to the game&apos;s main goals. Examine the vast machine and try to use the items in
        your inventory to interact with it. The machine could lead to new discoveries or be a part of a puzzle.
    </p>
    <p>
        Step 8: Attempt to unlock the locked lead-slab door in the Curtained Room<br>
        Use the copper key in your inventory to try and unlock the locked lead-slab door in the Curtained Room. If the
        key works, explore the area behind the door, as it may contain important information or items.
    </p>

    Priority of actions:

    <ol>
        <li>Exit the pit within the Vaulting Cavern</li>
        <li>Explore the unlocked white door in the Sitting Room</li>
        <li>Explore the archway to the east in the Curving Hall&apos;s Pedestal area</li>
        <li>Continue to explore the pit in the Vaulting Cavern</li>
        <li>Explore the archway to the north in the Curving Hall, West End</li>
        <li>Attempt to reach the gold mask on the statue in the Marble Balcony</li>
        <li>Examine the vast machine in the chamber south of the North Alcove</li>
        <li>Attempt to unlock the locked lead-slab door in the Curtained Room</li>
    </ol>

    By following these steps and prioritizing the unexplored areas and unsolved clues, you are likely to make progress
    in the game and potentially achieve the third point.
</div><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Museum of imaginary art]]></title><description><![CDATA[A museum with artists imagined by GPT-3 and artworks created by Midjourney.]]></description><link>https://wingedsheep.com/museum-of-imaginary-art/</link><guid isPermaLink="false">6388620a4b1ce80063699a8a</guid><category><![CDATA[AI Art]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Fri, 02 Dec 2022 14:45:29 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2022/12/cover2-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2022/12/cover2-2.png" alt="Museum of imaginary art"><p></p><p>Welcome to the Museum of Imaginary Art.</p><p>A playground for AI creativity, this museum is home to a diverse array of artworks created entirely by computers and artificially intelligent systems. Here you&#x2019;ll find works that push the boundaries of what is possible with computer-generated art.</p><p>I am the curator of this museum. The stories for the artists and descriptions of the expositions are all generated by GPT-3 (text-davinci-003). The artworks are generated by Midjourney based on these descriptions. My role is to imagine how these artists would think, and select the works I think they could have created.</p><p>On the walls of the museum, you will find a variety of artworks. From swirling abstracts to intricate landscapes, each piece is unique and offers a new perspective on the world.</p><p>I hope that you enjoy your visit to the Museum, and that you leave with a greater appreciation for the creativity that AI can bring to the world.</p><p>Artists on display:</p><ul><li><a href="#suefield">Sue Field - The power of imagination</a> (expressionist painting)</li><li><a href="#sarahjohnson">Sarah Johnson - The beauty of nature</a> (abstract landscape painting)</li><li><a href="#nelsonrougeau">Nelson Rougeau - The Beauty of Uncertainty</a> (digital art)</li><li><a href="#adorah">Adora H - In between</a> (photography)</li><li><a href="#muradzio">Mur Adzio - Meta Illusions</a> (abstract / surrealism painting)</li></ul><p></p><!--kg-card-begin: html--><h2 id="suefield">Sue Field - The power of imagination</h2><!--kg-card-end: html--><p>Sue Field specializes in abstract expressionist paintings. Her artworks are composed of impacting colour fields, dynamic brushstrokes and a unique, energetic energy that captures the essence of the modern world. Her art transports the viewers to a realm of abstraction and emotion while maintaining an aura of confident self-expression.</p><p>Sue Field grew up in a small town in the countryside, surrounded by the beauty of nature. From a young age, she was drawn to the imaginative potential of art, and spent hours in her studio experimenting with different mediums and styles. After studying art in college, she moved to the city to pursue her dream of becoming a professional artist. She quickly gained recognition for her bold and expressive abstract expressionist paintings, which captured the energy and emotion of the modern world.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Sue-fields-photo.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Sue-fields-photo.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Sue-fields-photo.png 1000w, https://wingedsheep.com/content/images/2022/12/Sue-fields-photo.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Sue Field</figcaption></figure><p>The exhibition titled &#x201C;The Power of Imagination&#x201D; is centered around the idea of creating our own realities through the imaginative power of our minds. Sue Field&#x2019;s artworks capture the pure potential of the human imagination, expressing the potential that lies within each of us. This exhibition is an ode to the creative power within us all, and an inspiration to viewers to explore the possibilities that their imagination can offer.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/stardust.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/stardust.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/stardust.png 1000w, https://wingedsheep.com/content/images/2022/12/stardust.png 1536w"><figcaption>&quot;Stardust&quot; is a representation of the vast possibilities that lie within us all. We can be the stardust in our own galaxies if we just choose to explore our imaginations.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-rainbow-connection-1.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-rainbow-connection-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-rainbow-connection-1.png 1000w, https://wingedsheep.com/content/images/2022/12/The-rainbow-connection-1.png 1536w"><figcaption>&quot;The Rainbow Connection&quot; is an exploration of the interconnectedness of all things, and how when we use our imaginations, we can create a powerful connection to something much greater than ourselves.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-alchemist.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-alchemist.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-alchemist.png 1000w, https://wingedsheep.com/content/images/2022/12/The-alchemist.png 1536w"><figcaption>&quot;The Alchemist&quot; highlights the power of transformation and shows how our imaginations can lead us down paths of great change and power.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/waves-of-emotion-2-2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/waves-of-emotion-2-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/waves-of-emotion-2-2.png 1000w, https://wingedsheep.com/content/images/2022/12/waves-of-emotion-2-2.png 1536w"><figcaption>&quot;Waves of Emotion&quot; illustrates how our imagination can be used to explore even the most complex emotions in constructive ways.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/the-dreamer.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/the-dreamer.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/the-dreamer.png 1000w, https://wingedsheep.com/content/images/2022/12/the-dreamer.png 1536w"><figcaption>&quot;The Journey&quot; depicts life&apos;s journey, and how using our imaginations, we can explore paths unknown and discover new beginnings.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/universe-of-possibilities.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/universe-of-possibilities.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/universe-of-possibilities.png 1000w, https://wingedsheep.com/content/images/2022/12/universe-of-possibilities.png 1536w"><figcaption>&quot;Universe of Possibilities&quot; showcases infinite possibilities that exist within each one of us when we use our creativity and open up to new ideas.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/the-dreamer2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/the-dreamer2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/the-dreamer2.png 1000w, https://wingedsheep.com/content/images/2022/12/the-dreamer2.png 1536w"><figcaption>&quot;The Dreamer&#x201D; reminds us that with enough passion and perseverance, anything is possible if you believe in yourself and follow your dreams with your imagination as your guide.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/illumination.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/illumination.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/illumination.png 1000w, https://wingedsheep.com/content/images/2022/12/illumination.png 1536w"><figcaption>&#x201C;Illumination&#x201D; speaks to the power of light and imagination, showing us that even in darkness there is hope for light if we open up our minds to new possibilities through creativity.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-possibility-of-everything-1.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-possibility-of-everything-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-possibility-of-everything-1.png 1000w, https://wingedsheep.com/content/images/2022/12/The-possibility-of-everything-1.png 1536w"><figcaption>&#x201C;The Possibility Of Everything&#x201D; urges us not to give up on ourselves or on achieving what we want in life &#x2013; with imagination there are no limits!</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-creative-fire.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-creative-fire.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-creative-fire.png 1000w, https://wingedsheep.com/content/images/2022/12/The-creative-fire.png 1536w"><figcaption>&#x201C;The Creative Fire&#x201D; speaks to passion, energy and enthusiasm! It reminds us that imagination has no bounds &#x2013; it is an energy within each one of us that can be harnessed for great things!</figcaption></figure><p></p><!--kg-card-begin: html--><h2 id="sarahjohnson">Sarah Johnson - The beauty of nature</h2><!--kg-card-end: html--><p><br>Sarah Johnson is a talented and passionate artist who creates abstract artworks by taking inspiration from nature. Using a combination of oil paints, charcoal, and mixed media, her artworks bring to life a stunning landscape full of detail and texture.</p><p>Sarah Johnson grew up in a family of artists, and spent her childhood exploring the natural beauty of her home in the mountains. She developed a deep appreciation for the diversity and complexity of the natural world, and began to study botany and ecology in order to better understand the ways in which living things interact with their environments. As an artist, she combines her love of nature with her passion for creativity, using a range of mediums to create abstract landscapes that capture the beauty and wonder of the natural world.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Sarah-Johnson.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Sarah-Johnson.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Sarah-Johnson.png 1000w, https://wingedsheep.com/content/images/2022/12/Sarah-Johnson.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Sarah Johnson</figcaption></figure><p>The theme of the exhibition is &#x201C;The Beauty of Nature&#x201D;. Sarah hopes to capture and convey the beauty of the natural world, from majestic mountains to wild seas, and everything in between. Through her works, Sarah strives to help viewers appreciate and connect with nature.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/the-color-of-water.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/the-color-of-water.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/the-color-of-water.png 1000w, https://wingedsheep.com/content/images/2022/12/the-color-of-water.png 1536w"><figcaption>&quot;The color of water&quot; is my attempt to capture the beauty of the ocean. It&apos;s painted in shades of blue and white to represent the sunlight reflecting off the still waters. It&apos;s a reminder that we can find peace and beauty in nature, no matter where we are.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/morning_mist-2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/morning_mist-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/morning_mist-2.png 1000w, https://wingedsheep.com/content/images/2022/12/morning_mist-2.png 1536w"><figcaption>&quot;Morning Mist&quot; is a piece that encapsulates the delicate haze that forms over a lake each morning. The painting is done in shades of white, grey and blue, with abstract shapes to mimic the misty morning sky. It is a reminder that life is ever-changing, and we should take time to appreciate these small moments of peace.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/sunrise3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/sunrise3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/sunrise3.png 1000w, https://wingedsheep.com/content/images/2022/12/sunrise3.png 1536w"><figcaption>&#x201C;Sunrise&#x201D; highlights one of nature&#x2019;s most magnificent moments - when night turns into day as the sun rises over our world with its dazzling display of orange, yellow and pink hues - reminding us all how lucky we are to witness such breathtaking beauty every day .</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/night-sky.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/night-sky.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/night-sky.png 1000w, https://wingedsheep.com/content/images/2022/12/night-sky.png 1536w"><figcaption>&#x201C;Night Sky&#x201D; pays tribute to one of nature&#x2019;s most captivating displays - stars twinkling against a sea of darkness - reminding us all how small we truly are compared to this vast universe around us.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Tranquil-forest.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Tranquil-forest.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Tranquil-forest.png 1000w, https://wingedsheep.com/content/images/2022/12/Tranquil-forest.png 1536w"><figcaption>&#x201C;Tranquil Forest&#x201D; paints a scene where you can find peace among nature&#x2019;s trees - green leaves intermingling with light patches of yellow sunshine - reminding us all how calming it can be just sitting among nature on our own or with loved ones nearby.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/dawn-breeze2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/dawn-breeze2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/dawn-breeze2.png 1000w, https://wingedsheep.com/content/images/2022/12/dawn-breeze2.png 1536w"><figcaption>&quot;Dawn Breeze&quot; celebrates a tranquil morning by evoking the gentle breeze on your face as you watch the sun rise over a lake or riverbank - reminding us all to savor these peaceful moments in our lives.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/winter-wonderland.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/winter-wonderland.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/winter-wonderland.png 1000w, https://wingedsheep.com/content/images/2022/12/winter-wonderland.png 1536w"><figcaption>&#x201C;Winter Wonderland&#x201D; celebrates one of winter&#x2019;s best gifts- its snow covered landscapes as far as you can see &#x2013; reminding us all again how connected we are through Nature &amp; no matter where you may be it will always provide something special for everyone!</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/glimpse-of-heaven.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/glimpse-of-heaven.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/glimpse-of-heaven.png 1000w, https://wingedsheep.com/content/images/2022/12/glimpse-of-heaven.png 1536w"><figcaption>&#x201C;Glimpse of Heaven&#x201D; is my attempt to capture the feeling of being in paradise. Its blue and white hues, combined with abstract shapes, evoke a divine beauty that is always around us- reminding us all that we are connected to something so much bigger than ourselves.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/stormy-sky.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/stormy-sky.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/stormy-sky.png 1000w, https://wingedsheep.com/content/images/2022/12/stormy-sky.png 1536w"><figcaption>&quot;Stormy Sky&quot; has been created to capture the drama of an impending storm. The piece is painted in dark hues with flashes of yellow and white which represent lightning streaks against an ominous sky - reminding us that even in times when things look bleak, there is still hope for brighter days ahead.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/wildflowers2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/wildflowers2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/wildflowers2.png 1000w, https://wingedsheep.com/content/images/2022/12/wildflowers2.png 1536w"><figcaption>&quot;Wildflowers&quot;, painted in pastel colors, captures the delicateness of wild flowers blooming throughout nature - reminding us how something so small can be so beautiful and inspiring if we take time to notice it.</figcaption></figure><h2></h2><!--kg-card-begin: html--><h2 id="nelsonrougeau">Nelson Rougeau - The Beauty of Uncertainty</h2><!--kg-card-end: html--><p></p><p>Introducing an exciting, new and unknown digital artist called Nelson Rougeau, who has developed a novel digital art style. His artworks are composed of complex, multi-layered visuals that express his own personal vision of the world. His works are at once abstract and figurative, and often evoke a dream-like atmosphere of surrealism and fantasy.</p><p>Nelson Rougeau was always drawn to the world of art and technology, and spent his teenage years tinkering with computers and experimenting with digital art. After studying computer science and art in college, he began to develop his own unique style of digital art that explored the beauty of uncertainty and the ways in which technology can enhance and transform our perceptions of the world.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/DALL-E-2022-12-01-23.26.17---Studio-photo..png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/DALL-E-2022-12-01-23.26.17---Studio-photo..png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/DALL-E-2022-12-01-23.26.17---Studio-photo..png 1000w, https://wingedsheep.com/content/images/2022/12/DALL-E-2022-12-01-23.26.17---Studio-photo..png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Nelson Rougeau</figcaption></figure><p>The theme of the art exhibition is &#x201C;The Beauty of Uncertainty&#x201D;. The artist is exploring the idea of how beauty can be found in moments of uncertainty and instability. He uses his artworks to create a visual representation of the beauty and chaos of life, and to express the idea that uncertainty can be embraced, accepted and celebrated.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Fluctuating-paths2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Fluctuating-paths2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Fluctuating-paths2.png 1000w, https://wingedsheep.com/content/images/2022/12/Fluctuating-paths2.png 1536w"><figcaption>&quot;Fluctuating Paths&quot;: This artwork represents the unpredictability of life and how one can find their own way through ever-changing landscapes. It is a reminder that moments of chaos and uncertainty can be embraced, accepted, and celebrated as part of life&apos;s journey.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-turning-point2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-turning-point2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-turning-point2.png 1000w, https://wingedsheep.com/content/images/2022/12/The-turning-point2.png 1536w"><figcaption>&quot;The Turning Point&quot; is an artwork that tries to convey the idea of finding balance and equilibrium in moments of uncertainty and change. It is meant to evoke a sense of hope and possibility, of being able to use moments of chaos and instability to find a sense of clarity and purpose.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-welcome-stranger.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-welcome-stranger.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-welcome-stranger.png 1000w, https://wingedsheep.com/content/images/2022/12/The-welcome-stranger.png 1536w"><figcaption>&quot;The Welcome Stranger&quot;: This artwork is intended to invoke curiosity and encourage gratitude for the unknown. It serves as a reminder that we should embrace the unknown, accept its beauty and find strength within it.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-seeker2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-seeker2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-seeker2.png 1000w, https://wingedsheep.com/content/images/2022/12/The-seeker2.png 1536w"><figcaption>&quot;The Seeker&quot;: This artwork portrays a swirl of objects, figures, and patterns which represent the desire to seek adventure and find beauty in unexpected places. It reminds us that there are always new possibilities, no matter our circumstances.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-outer-boundary.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-outer-boundary.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-outer-boundary.png 1000w, https://wingedsheep.com/content/images/2022/12/The-outer-boundary.png 1536w"><figcaption>&quot;The Outer Boundary&quot;: The asymmetrical landscape in this artwork is meant to evoke a sense of exploration and remind us that we should never stop pushing the boundaries of what is known or accepted.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-pearl.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-pearl.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-pearl.png 1000w, https://wingedsheep.com/content/images/2022/12/The-pearl.png 1536w"><figcaption>&quot;The Pearl&quot;: This artwork portrays swirling forms and dots which represent the idea that beauty can be found through transformation - transforming mundane moments into something exquisite.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-unexpected.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-unexpected.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-unexpected.png 1000w, https://wingedsheep.com/content/images/2022/12/The-unexpected.png 1536w"><figcaption>&quot;The Unexpected&quot;: This artwork reminds us that even unanticipated events can lead to personal growth and have beauty within them. It encourages us to be open-minded to change in order to better embrace what life has to offer.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-transcendence.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-transcendence.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-transcendence.png 1000w, https://wingedsheep.com/content/images/2022/12/The-transcendence.png 1536w"><figcaption>&quot;The Transcendence&quot;: The majestic shapes and colors in this artwork evoke an idea of rising above chaos by finding peace amidst uncertainty. It serves as an inspiring reminder that finding tranquility is possible even when things seem chaotic or uncertain around us.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/the-dance-of-life3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/the-dance-of-life3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/the-dance-of-life3.png 1000w, https://wingedsheep.com/content/images/2022/12/the-dance-of-life3.png 1536w"><figcaption>&quot;The Dance Of Life&quot;: This artwork represents life as a continuous dance filled with unpredictable movements - reminding us that although life may have its ups and downs, it has beautiful moments too if we&apos;re willing to see them for what they are worth!</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-fragments.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-fragments.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-fragments.png 1000w, https://wingedsheep.com/content/images/2022/12/The-fragments.png 1536w"><figcaption>&quot;The Fragments&quot;: Small isolated pieces in this artworks remind us not overlook small details or moments because it&#x2019;s usually within those insignificant details where you will find unexpected beauty or happiness!</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Nature.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Nature.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Nature.png 1000w, https://wingedsheep.com/content/images/2022/12/Nature.png 1536w"><figcaption>&#x201C;Nature&#x201D;: Nature has its own way of creating breathtaking scenes even during turbulent times - this artworks motivates viewers to find solace within nature often overlooked by ourselves!</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-unknown.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-unknown.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-unknown.png 1000w, https://wingedsheep.com/content/images/2022/12/The-unknown.png 1536w"><figcaption>&#x201C;The Unknown&#x201D;: This painting serves as an encouragement for viewers not just to explore but also accept uncertainties without fear or doubt &#x2013; so you can build courage from those moments instead!</figcaption></figure><p></p><!--kg-card-begin: html--><h2 id="adorah">Adora H - In Between</h2><!--kg-card-end: html--><p><br>Introducing an exciting, new and unknown fine art photographer called Adora H. Her work has a strong, minimalist approach and is characterized by her use of light and shadows, which she captures in a contemporary, modern visual style. Her work focuses on simple elements such as light, reflections, and shapes to create powerful and evocative photographs. </p><p>Adora H was born and raised in a small town in the countryside, where she spent her days exploring the fields and forests with her camera. From a young age, she was drawn to the beauty of the natural world, and developed a keen eye for capturing the details and nuances of the landscapes and wildlife that surrounded her. After studying photography in college, she moved to the city to pursue her passion for photography, and quickly gained recognition for her evocative and thought-provoking images that explored the theme of &quot;in between&quot; - the spaces between objects, people, and ideas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/adora-4.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/adora-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/adora-4.png 1000w, https://wingedsheep.com/content/images/2022/12/adora-4.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Adora H.</figcaption></figure><p>This exhibition is named &quot;In Between&quot; and reflects Adora&apos;s exploration of the liminal spaces between the real and the imaginary, between light and shadow, between the seen and unseen. Through her art, Adora captures moments of beauty and serenity amidst the chaos and uncertainty of life. She invites viewers to explore the hidden depths and nuances of the world around them.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Fading-hope.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Fading-hope.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Fading-hope.png 1000w, https://wingedsheep.com/content/images/2022/12/Fading-hope.png 1536w"><figcaption>Fading Hope - This image speaks to the idea that hope is fragile and often fleeting. The stormy clouds in the background reflect the uncertainty and unease of life, while the fading light reminds us of how quickly hope can vanish.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Through-the-looking-glass.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Through-the-looking-glass.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Through-the-looking-glass.png 1000w, https://wingedsheep.com/content/images/2022/12/Through-the-looking-glass.png 1536w"><figcaption>Through the Looking Glass - This image captures a moment between two worlds, between reality and fantasy. The shimmering lake reflects the dreamlike quality of this between-place, inviting us to explore our own inner landscapes.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-edge.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-edge.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-edge.png 1000w, https://wingedsheep.com/content/images/2022/12/The-edge.png 1536w"><figcaption>The Edge &#x2013; This photo captures a moment of ambiguity and tension at a bridge hovering over an unknown world below. It invites viewers to step out of their comfort zone and take the risk of exploring something new and unknown.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Lost-in-translation2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Lost-in-translation2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Lost-in-translation2.png 1000w, https://wingedsheep.com/content/images/2022/12/Lost-in-translation2.png 1536w"><figcaption>Lost in Transition &#x2013; This photograph is a reflection on the chaotic nature of change, as well as its potential beauty. The shadows surrounding her figure remind us that change can be daunting, but also exciting if we embrace it with courage and conviction.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Urban-abstract.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Urban-abstract.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Urban-abstract.png 1000w, https://wingedsheep.com/content/images/2022/12/Urban-abstract.png 1536w"><figcaption>Urban Abstract &#x2013; This abstract photograph invites viewers to look beyond what they can see on the surface level, towards something more intangible but no less real: the beauty found in our cities&#x2019; hidden complexities if we take time to observe them more closely.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-Dance-of-Light-and-Shadow2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-Dance-of-Light-and-Shadow2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-Dance-of-Light-and-Shadow2.png 1000w, https://wingedsheep.com/content/images/2022/12/The-Dance-of-Light-and-Shadow2.png 1536w"><figcaption>The Dance of Light and Shadow &#x2013; This photograph speaks to how life is often filled with uncertain moments where we find ourselves between two worlds&#x2014;the known and unknown&#x2014;teetering between seeming opposites such as order and chaos or lightness and darkness.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Shifting-perspectives-2-2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Shifting-perspectives-2-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Shifting-perspectives-2-2.png 1000w, https://wingedsheep.com/content/images/2022/12/Shifting-perspectives-2-2.png 1536w"><figcaption>Shifting Perspectives - Adora wants viewers to take this photograph as a metaphor for life&#x2019;s unpredictable nature &amp; how we can find ourselves in moments of transition when our perspective shifts &amp; we view the world from a new angle .</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-moment-between-realities.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-moment-between-realities.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-moment-between-realities.png 1000w, https://wingedsheep.com/content/images/2022/12/The-moment-between-realities.png 1536w"><figcaption>The Moment Between Realities &#x2013; Adora invites viewers to enjoy a simple moment in time when nothing else matters but what lies right before us in that present moment&#x2014;to take time out from all other distractions or worries to appreciate its beauty fully instead .</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/wingedsheep_The_Unknown_is_an_image_of_a_woman_standing_at_the__87ee44db-45e9-4ecb-815f-3be895cefaba.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/wingedsheep_The_Unknown_is_an_image_of_a_woman_standing_at_the__87ee44db-45e9-4ecb-815f-3be895cefaba.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/wingedsheep_The_Unknown_is_an_image_of_a_woman_standing_at_the__87ee44db-45e9-4ecb-815f-3be895cefaba.png 1000w, https://wingedsheep.com/content/images/2022/12/wingedsheep_The_Unknown_is_an_image_of_a_woman_standing_at_the__87ee44db-45e9-4ecb-815f-3be895cefaba.png 1536w"><figcaption>The Unknown - Adora is encouraging viewers to use this photograph as a reminder to embrace the unknown &amp; step out of their comfort zone into the world of possibilities if we are willing to take the risk .</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-shadow-of-the-past.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-shadow-of-the-past.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-shadow-of-the-past.png 1000w, https://wingedsheep.com/content/images/2022/12/The-shadow-of-the-past.png 1536w"><figcaption>&quot;Shadows of the past&quot;: This photograph is a reminder of the impermanence of life, of how the shadows of the past will always remain with us. It is an image of both nostalgia and hope, of cherishing the moments of the past while looking forward to the future.</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/The-gap-between-dark-and-light2.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/The-gap-between-dark-and-light2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/The-gap-between-dark-and-light2.png 1000w, https://wingedsheep.com/content/images/2022/12/The-gap-between-dark-and-light2.png 1536w"><figcaption>&quot;The gap between light and dark&quot;: This photograph is a metaphor for how I see the world, as a gap between light and dark. It represents the beauty of finding hope in moments of darkness and the courage to push forward when all seems lost.</figcaption></figure><!--kg-card-begin: html--><h2 id="muradzio">Mur Adzio - Meta Illusions</h2><!--kg-card-end: html--><p>We are pleased to present the first-ever art exhibition by the unknown artist, Mur Adzio. An abstract painter inspired by the surrealist movement of the early 20th century. They explore the wonderfully strange images of an illogical universe, delving into optical illusions that challenge our ideas of reality. Their artwork combines vivid and vibrant colors to create unique scenes that inhabit a land beyond logic.</p><p>Mur Adzio grew up in a bustling metropolis, surrounded by the hustle and bustle of city life. From a young age, he was fascinated by the complexities of the world around him, and spent his days exploring the streets and alleys of the city, observing the ways in which people interacted with their surroundings. As an artist, he began to explore the concept of &quot;meta illusions&quot; - the illusions that exist within other illusions - using abstract and surrealist techniques to create art that challenges viewers to question their perceptions of reality. His art has been exhibited in galleries around the world, and he is known for his unique and thought-provoking creations.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Mur-Adzio.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Mur-Adzio.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Mur-Adzio.png 1000w, https://wingedsheep.com/content/images/2022/12/Mur-Adzio.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Mur Adzio</figcaption></figure><p>The exhibition is called &apos;Meta Illusions&apos;, and explores the concept of how reality can be warped by optical illusions. Through this exploration, Mur Adzio encourages us to think and reflect on our own perceptions of what is real and what is illusion.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Chiaroscuro.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Chiaroscuro.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Chiaroscuro.png 1000w, https://wingedsheep.com/content/images/2022/12/Chiaroscuro.png 1536w"><figcaption>&quot;Chiaroscuro&quot; - &#x201C;Searching for the light within the shadows, until your vision blurs and reality is uncertain.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Light-defect3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Light-defect3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Light-defect3.png 1000w, https://wingedsheep.com/content/images/2022/12/Light-defect3.png 1536w"><figcaption>&quot;Light Defect&quot; - &#x201C;Windows of perception, revealing two halves of the same story.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Reversal-1.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Reversal-1.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Reversal-1.png 1000w, https://wingedsheep.com/content/images/2022/12/Reversal-1.png 1536w"><figcaption>&quot;Reversal&quot; - &quot;There is no start or finish when we perceive reality upside down and inside out.&quot;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Iridescence3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Iridescence3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Iridescence3.png 1000w, https://wingedsheep.com/content/images/2022/12/Iridescence3.png 1536w"><figcaption>&quot;Iridescence&quot; - &#x201C;A magical spectrum of color and emotion, a kaleidoscope of power and potential.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Interference.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Interference.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Interference.png 1000w, https://wingedsheep.com/content/images/2022/12/Interference.png 1536w"><figcaption>&quot;Interference&quot; - &#x201C;Feel vibrations beyond that which meets the eye; a silent symphony in crests and troughs.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Phase-shifiting-3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Phase-shifiting-3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Phase-shifiting-3.png 1000w, https://wingedsheep.com/content/images/2022/12/Phase-shifiting-3.png 1536w"><figcaption>&quot;Phase Shifting&quot;- &quot;Sometimes there is more than one way to look at something; no point is set in stone.&quot;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Perceptron.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Perceptron.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Perceptron.png 1000w, https://wingedsheep.com/content/images/2022/12/Perceptron.png 1536w"><figcaption>&quot;Perceptron&quot;- &#x201C;The act of perceiving is a powerful thing; the path to understanding lies within its complexity.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Echoes3.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Echoes3.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Echoes3.png 1000w, https://wingedsheep.com/content/images/2022/12/Echoes3.png 1536w"><figcaption>&quot;Echoes&quot;- &#x201C;A reminder of the beauty found in chaos; color, unity and harmony disguised in turmoil.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Inbetween.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Inbetween.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Inbetween.png 1000w, https://wingedsheep.com/content/images/2022/12/Inbetween.png 1536w"><figcaption>&quot;Inbetween&quot;- &#x201C;Where two realms collide, creating a space of unreal logic.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Subliminal.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Subliminal.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Subliminal.png 1000w, https://wingedsheep.com/content/images/2022/12/Subliminal.png 1536w"><figcaption>&quot;Subliminal&quot;- &#x201C;What lies beneath the surface? Hidden messages and revelations, waiting to be discovered.&#x201D;</figcaption></figure><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/12/Horizons-4.png" class="kg-image" alt="Museum of imaginary art" loading="lazy" width="1536" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/12/Horizons-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/12/Horizons-4.png 1000w, https://wingedsheep.com/content/images/2022/12/Horizons-4.png 1536w"><figcaption>&quot;Horizons&quot;- &#x201C;Where our journey intersects with the infinite, nothing is ever out of reach.&#x201D;</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Building a text generation model from scratch]]></title><description><![CDATA[In this blogpost I am going to code a text generation model from scratch, based on the transformer architecture.]]></description><link>https://wingedsheep.com/building-a-language-model/</link><guid isPermaLink="false">636788d54b1ce800636993c0</guid><category><![CDATA[machine learning]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Sun, 20 Nov 2022 21:28:19 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2022/11/progress_image_100_2952fcb4-8e44-4a0e-81ab-1254e70ab5d9.webp" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2022/11/progress_image_100_2952fcb4-8e44-4a0e-81ab-1254e70ab5d9.webp" alt="Building a text generation model from scratch"><p></p><p>The transformer is a neural network architecture that was proposed in the paper &quot;Attention is All You Need&quot; by Ashish Vaswani, et al. in 2017. It is a powerful architecture that lead to many state-of-the-art results in the last few years. It can be used to generate text (<a href="https://arxiv.org/abs/2005.14165?ref=wingedsheep.com">GPT-3</a>), create beautiful images from text (<a href="https://imagen.research.google/?ref=wingedsheep.com">Imagen</a>, <a href="https://openai.com/dall-e-2/?ref=wingedsheep.com">Dall-e 2</a>, <a href="https://stability.ai/blog/stable-diffusion-announcement?ref=wingedsheep.com">Stable diffusion</a>), compose music (<a href="https://magenta.tensorflow.org/music-transformer?ref=wingedsheep.com">music transformer</a>), speech-to-text (<a href="https://openai.com/blog/whisper/?ref=wingedsheep.com">Whisper</a>), understanding protein structure (<a href="https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe?ref=wingedsheep.com">AlphaFold</a>), teaching cars to drive themselves (<a href="https://saneryee-studio.medium.com/deep-understanding-tesla-fsd-part-2-vector-space-2964bfc10b17?ref=wingedsheep.com">Tesla FSD</a>) or even learn to do many different tasks (<a href="https://www.deepmind.com/publications/a-generalist-agent?ref=wingedsheep.com">Gato</a>). There are probably many amazing results I forgot to name, and many more to come. </p><p>Large language models (LLMs) are going to have a large impact in the future. We are probably going to interact with these models a lot in the future to brainstorm, help us with creativity, make sense of large amounts of information and maybe even understand ourselves better. GPT-3 is already helping me with coding and writing (also for this blogpost), and these models are going to get better really fast. That is why I want to understand how they work.</p><p>In this blogpost I will show you how to build a text generation model from scratch using the transformer architecture. I will show the coding process, and will try to make each step as simple as possible. The aim of this post is not to build the best text generation model, but to try to make each step of building one as clear as possible.</p><h3 id="overview">Overview</h3><p><br>Text generation models like GPT-3 are built using the transformer architecture. This architecture was first proposed in the 2017 paper &quot;Attention is All You Need&quot;.</p><p>Unlike typical sequence-to-sequence models used for translation tasks, which have both an encoder and decoder, text generation models only require a decoder. This is because the input and output sequences are essentially the same - the model generates text token-by-token based on previous context.</p><p>The decoder-only architecture looks like this:</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/11/gpt.drawio-copy.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="1342" height="1122" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/gpt.drawio-copy.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/11/gpt.drawio-copy.png 1000w, https://wingedsheep.com/content/images/2022/11/gpt.drawio-copy.png 1342w" sizes="(min-width: 720px) 720px"></figure><p>So for text generation, we only need to focus on implementing the decoder portion. The key components we&apos;ll cover are:</p><ul><li>Tokenization - breaking text into tokens</li><li>Input embeddings - turning tokens into vectors</li><li>Positional encodings - retaining sequence order information</li><li>Masking - preventing model from peeking ahead or looking at padding tokens</li><li>Multi-headed self-attention - relating different input tokens</li><li>Decoder stack - refining understanding over multiple layers</li><li>Language model head - predicting token probabilities</li></ul><p>By incrementally implementing each of these pieces, we&apos;ll end up with a full text generation model. I&apos;ll explain both the concepts and show concrete code for each part.</p><p>The goal is to provide an intuitive understanding of how transformers work under the hood. Let&apos;s get started with tokenization!</p><h3 id="tokenizing-the-text">Tokenizing the text</h3><p></p><p>Natural language processing models like transformers operate on numerical data. However, our raw data is often in the form of human-readable text. To bridge this gap, we employ a process called tokenization.</p><p>Tokenization involves breaking down the text into smaller chunks known as tokens. The granularity of these tokens can range widely: a token might be as small as a single character, as large as a word, or anywhere in between. The choice of token size depends on the specific task and method being used.</p><p>For instance, GPT-3 uses a form of tokenization called Byte Pair Encoding (BPE), which tokenizes text into subwords. These subwords are sequences of characters that frequently appear together. This approach is a middle ground between character-level and word-level tokenization, balancing efficiency and versatility.</p><p><strong>The Role of a Vocabulary</strong></p><p>Tokenization involves converting each token in the text into a unique integer identifier, or index, using a dictionary called a vocabulary. The vocabulary consists of a list of all unique tokens that the model should recognize.</p><p>Consider the sentence &quot;I am a cat.&quot; If our vocabulary is [&quot;&lt;PAD&gt;&quot;, &quot;I&quot;, &quot;am&quot;, &quot;a&quot;, &quot;cat&quot;, &quot;dog&quot;, &quot;mouse&quot;], each word in the sentence maps to an index in the vocabulary. &quot;I&quot; corresponds to 1, &quot;am&quot; to 2, &quot;a&quot; to 3, and &quot;cat&quot; to 4. So, our sentence becomes [1, 2, 3, 4] in numerical form.</p><p><strong>Dealing with Variable-Length Inputs: Padding</strong></p><p>Transformers typically expect inputs of a fixed size. However, real-world text data comes in sequences of variable length. To accommodate this, we use a technique called padding.</p><p>Padding involves supplementing shorter sequences with extra tokens (typically designated by the index 0) to match the length of the longest sequence in the batch. For instance, if we want all inputs to be six tokens long, our example sentence &quot;I am a cat.&quot; becomes [0, 0, 1, 2, 3, 4].</p><p>The size of a vocabulary depends on the complexity of the language and the granularity of the tokenization. We are going to use a simple tokenizer which recognizes just 39 tokens.</p><p>On the other hand, GPT-3&apos;s tokenizer uses a vocabulary of 50,257 tokens. This large vocabulary includes a broad range of English words, common word parts, and even whole phrases, enabling GPT-3 to understand and generate highly diverse and nuanced text.</p><p><strong>Simple tokenizer example</strong></p><p>We create a very simple tokenizer that can encode the characters a-z, the numbers 0-9 a period and a whitespace character. The padding token is mapped to 0.</p><p>Our dictionary is very simple, and contains only 39 tokens.</p><pre><code class="language-python">class Tokenizer:

    def __init__(self):
        self.dictionary = {}
        self.reverse_dictionary = {}

        # Add the padding token
        self.__add_to_dict(&apos;&lt;pad&gt;&apos;)

        # Add characters and numbers to the dictionary
        for i in range(10):
            self.__add_to_dict(str(i))
        for i in range(26):
            self.__add_to_dict(chr(ord(&apos;a&apos;) + i))

        # Add space and punctuation to the dictionary
        self.__add_to_dict(&apos;.&apos;)
        self.__add_to_dict(&apos; &apos;)

    def __add_to_dict(self, character):
        if character not in self.dictionary:
            self.dictionary[character] = len(self.dictionary)
            self.reverse_dictionary[self.dictionary[character]] = character

    def tokenize(self, text):
        return [self.dictionary[c] for c in text]

    def character_to_token(self, character):
        return self.dictionary[character]

    def token_to_character(self, token):
        return self.reverse_dictionary[token]

    def size(self):
        return len(self.dictionary)</code></pre><h3 id="dataset">Dataset </h3><p></p><p>Once the model and the tokenization process have been defined, the next step is preparing a suitable dataset to train the model. As we&apos;re aiming for simplicity to illustrate the process, let&apos;s construct a &quot;hello world&quot; equivalent dataset for text generation.</p><p>Our toy dataset will consist of simple, self-contained sentences. Each sentence communicates a fact about a particular animal, such as &quot;cats rule the world&quot; or &quot;penguins live in the Arctic.&quot;</p><pre><code class="language-python"># Create the training data
training_data = &apos;. &apos;.join([
    &apos;cats rule the world&apos;,
    &apos;dogs are the best&apos;,
    &apos;elephants have long trunks&apos;,
    &apos;monkeys like bananas&apos;,
    &apos;pandas eat bamboo&apos;,
    &apos;tigers are dangerous&apos;,
    &apos;zebras have stripes&apos;,
    &apos;lions are the kings of the savannah&apos;,
    &apos;giraffes have long necks&apos;,
    &apos;hippos are big and scary&apos;,
    &apos;rhinos have horns&apos;,
    &apos;penguins live in the arctic&apos;,
    &apos;polar bears are white&apos;
])</code></pre><p>With the raw data prepared, we can then tokenize it. This process converts each character in our training sentences into its corresponding token index from the vocabulary.</p><pre><code class="language-python"># Tokenize the training data
tokenized_training_data = tokenizer.tokenize(training_data)</code></pre><p>Remember that our model expects input sequences of a fixed length, yet our sentences vary in length. To address this, we&apos;ll use padding, specifically left-padding.</p><p>Left-padding involves prepending padding tokens (&quot;&lt;pad&gt;&quot;) to the beginning of shorter sequences until they match the length of the longest sequence in our dataset. By padding our sequences in this way, we ensure that every token in every sequence, no matter its original length, will be used in the training process.</p><pre><code class="language-python"># Left-pad the tokenized training data
for _ in range(max_sequence_length):
    # Prepend padding tokens
    tokenized_training_data.insert(0, tokenizer.character_to_token(&apos;&lt;pad&gt;&apos;))</code></pre><h3 id="input-embedding">Input embedding</h3><p></p><p>In textual data processing, one of the most critical steps is converting words or tokens into numerical representations that computational models can understand and work with. This transformation is performed by an embedding layer.</p><p>Imagine tokens as atomic units of meaning in a language - they can be words, parts of words, or even entire phrases. When tokenizing, we replace these units with corresponding integers. However, to effectively capture the nuances of language and the relationship between different tokens, we need to take a step further.</p><p>That&apos;s where the embedding layer comes in, acting as a bridge between discrete tokens and continuous vector space. It transforms each token, represented as an integer, into a continuous vector in a high-dimensional space.</p><p><strong>Embeddings and Semantic Relationships</strong></p><p>Let&apos;s consider a simplified example. If our tokens are words, the embedding layer helps capture the similarity between &quot;cats&quot; and &quot;dogs&quot; by positioning their corresponding vectors close together in the vector space. This closeness stems from the fact that &quot;cats&quot; and &quot;dogs&quot; often appear in similar contexts.</p><p>However, the magic doesn&apos;t stop there. As we stack multiple layers in our model, each subsequent layer can capture more and more complex concepts. The first layer might understand similar animals, like cats and dogs. Higher layers might recognize the roles these animals play in sentences, such as being pets. Even higher layers might comprehend more complex semantic structures, like cats and dogs representing different aspects of a shared concept (pets).</p><p><strong>Creating an Embedding Layer with PyTorch</strong></p><p>In PyTorch, the nn.Embedding class helps us create the embedding layer. During training, this layer&apos;s weights (representing our token embeddings) get updated and fine-tuned to better capture the semantic relationships between different tokens.</p><p>Here is a simplified code snippet illustrating the implementation of a token embedding layer:</p><pre><code class="language-python">class TokenEmbedding(torch.nn.Module):
    &quot;&quot;&quot;
    PyTorch module that converts tokens into embeddings.

    Input dimension is: (batch_size, sequence_length)
    Output dimension is: (batch_size, sequence_length, d_model)
    &quot;&quot;&quot;

    def __init__(self, d_model, number_of_tokens):
        super().__init__()
        self.embedding_layer = torch.nn.Embedding(
            num_embeddings=number_of_tokens,
            embedding_dim=d_model
        )

    def forward(self, x):
        return self.embedding_layer(x)</code></pre><p>In the code above:</p><ul><li><code>number_of_tokens</code> indicates the total number of unique tokens our model can encounter in the input. This number typically equals the size of our token dictionary.</li><li><code>d_model</code> specifies the size (dimensionality) of the embedding vectors. Higher dimensions allow us to encode more information about each token, but also increase the computational complexity and the time required to train the model.</li></ul><p>The input to our TokenEmbedding module is a batch of sequences, with each token represented by an integer. The output, in contrast, is a batch of the same sequences, but each integer is now replaced by a rich, high-dimensional vector encapsulating semantic information.</p><h3 id="positional-encoding">Positional encoding</h3><p></p><p>Why is positional encoding necessary?</p><p>Transformers operate based on the idea of self-attention, which computes relevance scores for elements in the input sequence relative to each other. However, transformers don&apos;t inherently account for the sequence order because the self-attention mechanism treats input elements independently.</p><p>In tasks like natural language understanding, the order of elements is crucially important. For instance, the sentences &quot;The cat chases the mouse&quot; and &quot;The mouse chases the cat&quot; carry very different meanings. Without considering the positional information, a transformer might interpret these sentences as equivalent. This is why we need positional encoding &#x2013; to instill a sense of sequence order into transformers.</p><p>How does positional encoding work?</p><p>In the original Transformer model, positional encoding is carried out by creating a vector for each position in the sequence and adding it to the corresponding input vector. This is done so the model can learn to utilize these position vectors to understand the order of elements in the sequence.</p><p>Specifically, the positional encoding for a position &quot;p&quot; and dimension &quot;i&quot; in the input sequence is computed using these sine and cosine functions:</p><p><code>PE(p, 2i) = sin(p / 10000^(2i/d_model))</code></p><p><code>PE(p, 2i+1) = cos(p / 10000^(2i/d_model))</code></p><p>Here, &quot;d_model&quot; is the dimensionality of the input and output vectors in the model. A larger &quot;d_model&quot; would mean that each word is represented by a larger vector, allowing for more complex representations but also requiring more computational resources. The sin and cos functions are applied alternately to each dimension of the positional encoding vector, creating a pattern that the model can learn and recognize.</p><p>The resulting positional encodings vary between -1 and 1, and they have a wavelength that increases with each dimension. This pattern allows the model to distinguish different positions and to generalize to sequence lengths not encountered during training.</p><p>These positional encodings are added to the input embeddings before being processed by the transformer. This allows the transformer to learn to utilize this positional information in a way that best suits the task it&apos;s being trained on. For example, the model might learn to pay more attention to adjacent words in sentence interpretation, capturing the notion that in many languages, nearby words often have a higher syntactic and semantic relevance to each other.</p><p>The code to create a module that creates and adds such a positional embedding could be written as follows: </p><pre><code class="language-python">class PositionalEncoding(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module that creates a positional encoding matrix. This matrix will later be added to the 
    transformer&apos;s input embeddings to provide a sense of position of the sequence elements.
    &quot;&quot;&quot;

    def __init__(self, d_model, max_sequence_length):
        super().__init__()
        self.d_model = d_model
        self.max_sequence_length = max_sequence_length
        self.positional_encoding = self.create_positional_encoding()

    def create_positional_encoding(self):
        &quot;&quot;&quot;
        Creates a positional encoding matrix of size (max_sequence_length, d_model).
        &quot;&quot;&quot;

        # Initialize positional encoding matrix
        positional_encoding = np.zeros((self.max_sequence_length, self.d_model))

        # Calculate positional encoding for each position and each dimension
        for pos in range(self.max_sequence_length):
            for i in range(0, self.d_model, 2):
                # Apply sin to even indices in the array; indices in Python start at 0 so i is even.
                positional_encoding[pos, i] = np.sin(pos / (10000 ** ((2 * i) / self.d_model)))
                
                if i + 1 &lt; self.d_model:
                    # Apply cos to odd indices in the array; we add 1 to i because indices in Python start at 0.
                    positional_encoding[pos, i + 1] = np.cos(pos / (10000 ** ((2 * i) / self.d_model)))

        # Convert numpy array to PyTorch tensor and return it
        return torch.from_numpy(positional_encoding).float()

    def forward(self, x):
        &quot;&quot;&quot;
        Adds the positional encoding to the input embeddings at the corresponding positions.
        &quot;&quot;&quot;
        # Add positional encodings to input embeddings. The &quot;:&quot; indexing ensures we only add positional encodings up
        # to the length of the sequence in the batch. x.size(0) is the batch size, so this is a way to make sure 
        # we&apos;re not adding extra positional encodings.
        return x + self.positional_encoding[:x.size(1), :]</code></pre><h2 id="masking">Masking</h2><p></p><p>Remember the padding tokens we talked about before? These padding tokens don&apos;t carry any information, and it&apos;s important for the model not to pay attention to them when it&apos;s processing input data.</p><p>This is where masking comes in. A mask is typically an array that has the same length as the sentence, with ones at positions corresponding to actual words and zeros at positions corresponding to the padding tokens.</p><p>When computing attention scores, we do not want to include the effect of padding tokens. To avoid this, we can apply the mask to the attention scores matrix, effectively setting the scores at padding positions to a very large negative number (e.g., -1e9). The reason for using such a large negative number is that these scores are passed through a softmax function, which will transform these large negative numbers into zeros. This means that the padding positions will not have any influence on the final output of the attention layer.</p><p>Here is a snippet of the mask application part from the MaskedSelfAttention class:</p><pre><code class="language-python"># Apply the mask to the attention weights, by setting the masked tokens to a very low value.
# This will make the softmax output 0 for these values.
mask = mask.reshape(attention_weights.shape[0], 1, attention_weights.shape[2])
attention_weights = attention_weights.masked_fill(mask == 0, -1e9)</code></pre><p>This line is essentially applying the mask to the attention_weights tensor. The <code>masked_fill(mask == 0, -1e9)</code> operation is saying &quot;for every position in attention_weights where the corresponding position in mask is zero (i.e., a padding token), replace the attention_weights value with -1e9&quot;. This ensures that padding tokens receive no attention whatsoever.</p><p>Ideally, while predicting each new word, the decoder should only have access to the words that came before it in the sequence, not those that come after. Why? Because in real-world application, like translating a sentence, we don&apos;t have future information. The process is carried out word by word from start to end. This is known as the autoregressive property: the prediction at a certain time step depends only on the inputs and outputs at previous time steps.</p><p>To enforce this property while training the model, we use a mechanism called a causal mask (also known as a subsequent mask). This mask ensures that, for any given word, the model cannot attend to (or &quot;peek at&quot;) the words that come after it.</p><p>Let&apos;s use an actual sentence to visualize this: &quot;The cat sat on the mat.&quot;</p><p>If the model is trying to predict the word at the fourth position (&quot;on&quot;), it should only consider &quot;The&quot;, &quot;cat&quot;, and &quot;sat&quot;. It should not have access to &quot;the&quot; or &quot;mat&quot;. The causal mask helps us achieve this by masking out (or hiding) the future words while the model is making its prediction.</p><p>We implement this using <code>torch.tril</code> to create a lower-triangular matrix of ones. This ensures that position <code>i</code> can only attend to positions <code>0</code> through <code>i</code>:</p><pre><code class="language-python"># Apply causal mask to prevent attending to future positions.
# This is essential for autoregressive generation.
seq_length = x.size(1)
causal_mask = torch.tril(torch.ones(seq_length, seq_length, device=x.device)).bool()
attention_weights = attention_weights.masked_fill(~causal_mask, -1e9)</code></pre><h3 id="attention">Attention</h3><p><br>The attention mechanisms play a vital role in the transformer architecture. They&apos;re effectively a way to highlight the important parts of an input sequence, similar to how we humans pay more attention to specific parts of a sentence or image depending on the context.</p><p>Imagine we have the sentence: &quot;The man ate a sandwich he prepared in the morning. It was topped with cheese&quot;. If we wish to understand what &quot;It&quot; refers to, we would naturally pay more attention to &quot;sandwich&quot;, making it get a higher attention score. This is essentially what the attention mechanism does, calculating an attention score for each word considering all other words in the sentence.</p><p>Attention scores are derived using query, key, and value vectors. These vectors are created by multiplying the input embeddings with learned matrices (essentially a linear transformation). These vectors help calculate the attention scores, determining the impact of one token on another.</p><p>The query, key and value vectors are then used to calculate the attention scores like in the diagram below</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/11/attention.drawio--2-.drawio--1-.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="2000" height="1428" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/attention.drawio--2-.drawio--1-.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/11/attention.drawio--2-.drawio--1-.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/11/attention.drawio--2-.drawio--1-.png 1600w, https://wingedsheep.com/content/images/2022/11/attention.drawio--2-.drawio--1-.png 2162w" sizes="(min-width: 720px) 720px"></figure><p>The attention scores for the tokens are calculated as the dot product between the query and key vectors. These scores are then scaled down by dividing by the square root of the query/key/value dimension (a trick from the original Transformer paper for more stable gradients).</p><p>It&apos;s important to note that attention can be masked. For masked positions, the attention score will be set to -infinity, making these positions virtually non-existent in subsequent computations.</p><p>Finally, the attention scores are normalized using the softmax function to make them fall between 0 and 1 and sum up to 1. The normalized attention scores are then multiplied with the value vectors and summed to obtain the output of the attention layer.</p><p>In PyTorch, this is how a basic attention layer would look:</p><pre><code class="language-python">class MaskedSelfAttention(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for a self attention layer.
    This layer is used in the MultiHeadedSelfAttention module.

    Input dimension is: (batch_size, sequence_length, embedding_dimension)
    Output dimension is: (batch_size, sequence_length, head_dimension)
    &quot;&quot;&quot;

    def __init__(self, embedding_dimension, head_dimension):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.head_dimension = head_dimension
        self.query_layer = torch.nn.Linear(embedding_dimension, self.head_dimension)
        self.key_layer = torch.nn.Linear(embedding_dimension, self.head_dimension)
        self.value_layer = torch.nn.Linear(embedding_dimension, self.head_dimension)
        self.softmax = torch.nn.Softmax(dim=-1)

    def forward(self, x, mask):
        &quot;&quot;&quot;
        Compute the self attention.

        x dimension is: (batch_size, sequence_length, embedding_dimension)
        output dimension is: (batch_size, sequence_length, head_dimension)
        mask dimension is: (batch_size, sequence_length)

        mask values are: 0 or 1. 0 means the token is masked, 1 means the token is not masked.
        &quot;&quot;&quot;

        # x dimensions are: (batch_size, sequence_length, embedding_dimension)
        # query, key, value dimensions are: (batch_size, sequence_length, head_dimension)
        query = self.query_layer(x)
        key = self.key_layer(x)
        value = self.value_layer(x)

        # Calculate the attention weights.
        # attention_weights dimensions are: (batch_size, sequence_length, sequence_length)
        attention_weights = torch.matmul(query, key.transpose(-2, -1))

        # Scale the attention weights.
        attention_weights = attention_weights / np.sqrt(self.head_dimension)

        # Apply the mask to the attention weights, by setting the masked tokens to a very low value.
        # This will make the softmax output 0 for these values.
        mask = mask.reshape(attention_weights.shape[0], 1, attention_weights.shape[2])
        attention_weights = attention_weights.masked_fill(mask == 0, -1e9)

        # Softmax makes sure all scores are between 0 and 1 and the sum of scores is 1.
        # attention_scores dimensions are: (batch_size, sequence_length, sequence_length)
        attention_scores = self.softmax(attention_weights)

        # The attention scores are multiplied by the value
        # Values of tokens with high attention score get highlighted because they are multiplied by a larger number,
        # and tokens with low attention score get drowned out because they are multiplied by a smaller number.
        # Output dimensions are: (batch_size, sequence_length, head_dimension)
        return torch.bmm(attention_scores, value)</code></pre><h2 id="multi-head-attention-for-diverse-perspectives">Multi-head Attention for Diverse Perspectives</h2><p></p><p>The attention mechanism, as we&apos;ve discussed, allows a model to focus on different parts of the input sequence when generating each word in the output sequence. But there&apos;s an additional refinement we can make to this system to make it even more powerful. Instead of having one single &quot;attention perspective&quot;, why not have multiple? That&apos;s the idea behind multi-head attention.</p><p>Imagine a class of students all looking at the same picture, but each student noticing and focusing on different details &#x2014; one might notice the colors, another the shapes, another the overall composition. They each bring their own unique &quot;perspective&quot; to understanding the picture as a whole.</p><p>The Transformer model does something similar with multi-head attention. It has not one, but multiple sets (or &quot;heads&quot;) of the attention mechanism, each of which independently focuses on different parts of the input. Each head can learn to pay attention to different positions of the input sequence and extract different types of information. For example, one attention head might learn to focus on syntactic aspects of the language (like grammar), while another might learn semantic information (like meaning).</p><p>Here is how it works:</p><p>Each head computes its own query, key, and value matrices from the input, just like in the single-head attention mechanism. They then compute their attention scores and produce an output. But instead of being processed individually, the output of each head is concatenated together and then transformed with a linear layer to produce the final output.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/11/masked_self_attention.drawio--1-.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="1942" height="1002" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/masked_self_attention.drawio--1-.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/11/masked_self_attention.drawio--1-.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/11/masked_self_attention.drawio--1-.png 1600w, https://wingedsheep.com/content/images/2022/11/masked_self_attention.drawio--1-.png 1942w" sizes="(min-width: 720px) 720px"><figcaption>Multi-head self attention</figcaption></figure><p>This is the code for the <code>MaskedMultiHeadedSelfAttention</code> class:</p><pre><code class="language-python">class MaskedMultiHeadedSelfAttention(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for a multi head attention layer.

    Input dimension is: (batch_size, sequence_length, embedding_dimension)
    Output dimension is: (batch_size, sequence_length, embedding_dimension)
    &quot;&quot;&quot;

    def __init__(self, embedding_dimension, number_of_heads):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.head_dimension = embedding_dimension // number_of_heads
        self.number_of_heads = number_of_heads

        # Create the self attention modules
        self.self_attentions = torch.nn.ModuleList(
            [MaskedSelfAttention(embedding_dimension, self.head_dimension) for _ in range(number_of_heads)])

        # Create a linear layer to combine the outputs of the self attention modules
        self.output_layer = torch.nn.Linear(number_of_heads * self.head_dimension, embedding_dimension)

    def forward(self, x, mask):
        &quot;&quot;&quot;
        Compute the multi head attention.

        x dimensions are: (batch_size, sequence_length, embedding_dimension)
        mask dimensions are: (batch_size, sequence_length)
        mask values are: 0 or 1. 0 means the token is masked, 1 means the token is not masked.
        &quot;&quot;&quot;
        # Compute the self attention for each head
        # self_attention_outputs dimensions are:
        # (number_of_heads, batch_size, sequence_length, head_dimension)
        self_attention_outputs = [self_attention(x, mask) for self_attention in self.self_attentions]

        # Concatenate the self attention outputs
        # self_attention_outputs_concatenated dimensions are:
        # (batch_size, sequence_length, number_of_heads * head_dimension)
        concatenated_self_attention_outputs = torch.cat(self_attention_outputs, dim=2)

        # Apply the output layer to the concatenated self attention outputs
        # output dimensions are: (batch_size, sequence_length, embedding_dimension)
        return self.output_layer(concatenated_self_attention_outputs)</code></pre><h3 id="the-decoder-layer">The decoder layer</h3><p></p><p>The model consists of several decoder layer. Each decoder takes the output of the previous decoder as input. The first decoder takes the positional encoding layer as input. The final layer is a language model head, which is going to output the probabilies of next tokens.</p><p>In the case of an autoregressive model like GPT-2, each decoder layer is composed of a self-attention mechanism and a feed-forward neural network. The self-attention mechanism allows the model to weigh the importance of different tokens in the input when predicting the next token, while the feed-forward network enables the model to learn more traditional, positional relationships between the tokens.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/11/decoder.drawio.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="121" height="491"><figcaption>Multiple decoder layer stacked</figcaption></figure><p>When we stack multiple of these decoder layers on top of each other, it allows the model to refine its understanding of the input data over several rounds of processing. The output of one layer becomes the input of the next, and so the model can use the output of previous layers to inform its understanding of the current layer. Each layer can learn to represent different features or aspects of the input data. The higher-level layers (further in the stack) can capture more complex or abstract features, which are compositions of the simpler features captured by the lower-level layers (earlier in the stack). </p><p>So, in essence, the stacking of multiple decoder layers enables the model to capture more complex patterns and understand deeper contextual relationships among the data, thereby resulting in more accurate predictions.</p><p>So, what does each decoder layer do exactly?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/11/decoder_layer.drawio-2.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="629" height="861" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/decoder_layer.drawio-2.png 600w, https://wingedsheep.com/content/images/2022/11/decoder_layer.drawio-2.png 629w"><figcaption>The decoder layer</figcaption></figure><p><strong>Step 1: Input and Layer Normalization</strong></p><p>When a decoder layer receives its input, the very first thing it does is apply layer normalization to these input vectors. The inputs to the decoder are high-dimensional vectors that each represent a token in the sequence.</p><p>Layer normalization is a crucial process that ensures the numerical stability of the model. It prevents numbers from getting too large during training, mitigating what&apos;s known as the &quot;exploding gradients&quot; problem.</p><p>But layer normalization does more than just guard against large numbers. It helps spread the data more evenly throughout the feature space, which makes the learning process more effective. By adjusting the embeddings such that each dimension has a mean of 0 and a standard deviation of 1, it ensures that no particular feature has undue influence over others due to differences in scale. This equalization of influence across dimensions is key for a balanced and efficient learning process.</p><p><strong>Step 2: Self-Attention</strong></p><p>Once the inputs are normalized, the decoder layer applies the self-attention mechanism. This allows the model to weigh the importance of each token in the sequence relative to the others, providing a context-aware representation of each token.</p><p><strong>Step 3: Residual Connections</strong></p><p>The output from the self-attention process is then added to the original input (before normalization) in what&apos;s known as a residual connection. This connection is a clever way of allowing the gradients to flow directly through the network, mitigating another common deep learning problem: vanishing gradients. The &quot;vanishing gradients&quot; problem refers to gradients getting exponentially smaller as they propagate back through the layers during training, making it harder for the model to learn and adjust its earlier layers.</p><p><strong>Step 4: Another Round of Normalization and Feed-Forward Network</strong></p><p>After applying the residual connection, the output is normalized once again and then passed through a feed-forward neural network. This network is a fully connected layer that applies non-linear transformations (like <a href="https://en.wikipedia.org/wiki/Rectifier_(neural_networks)?ref=wingedsheep.com">ReLU</a>) to the data, allowing the model to learn complex relationships in the data.</p><p><strong>Step 5: Dropout</strong></p><p>Finally, to prevent overfitting to the training data, a dropout procedure is applied. This process randomly drops out (i.e., temporarily removes during training, 10% in my example code) a percentage of the connections in the model. In this way, it encourages the model to learn a more robust representation of the data that doesn&apos;t rely too heavily on any single connection.</p><p>After going through all these steps, the output of one decoder layer becomes the input to the next. This stacking of multiple decoders allows the model to learn to represent the data at various levels of abstraction, which is key to its ability to understand and generate human-like text.</p><p>The entire process of the decoder layer can be seen in code through the <code>DecoderLayer</code> and <code>DecoderStack</code> classes, where <code>DecoderLayer</code> encapsulates the processes within a single layer, and <code>DecoderStack</code> handles the stacking of multiple <code>DecoderLayer</code>s.</p><pre><code class="language-python">class DecoderLayer(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for an encoder layer.

    An encoder layer consists of a multi-headed self attention layer, a feed forward layer and dropout.

    Input dimension is: (batch_size, sequence_length, embedding_dimension)
    Output dimension is: (batch_size, sequence_length, embedding_dimension)
    &quot;&quot;&quot;

    def __init__(
            self,
            embedding_dimension,
            number_of_heads,
            feed_forward_dimension,
            dropout_rate
    ):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.number_of_heads = number_of_heads
        self.feed_forward_dimension = feed_forward_dimension
        self.dropout_rate = dropout_rate

        self.multi_headed_self_attention = MaskedMultiHeadedSelfAttention(embedding_dimension, number_of_heads)
        self.feed_forward = FeedForward(embedding_dimension, feed_forward_dimension)
        self.dropout = torch.nn.Dropout(dropout_rate)
        self.layer_normalization_1 = torch.nn.LayerNorm(embedding_dimension)
        self.layer_normalization_2 = torch.nn.LayerNorm(embedding_dimension)

    def forward(self, x, mask):
        &quot;&quot;&quot;
        Compute the encoder layer.

        x dimensions are: (batch_size, sequence_length, embedding_dimension)
        mask dimensions are: (batch_size, sequence_length)
        mask values are: 0 or 1. 0 means the token is masked, 1 means the token is not masked.
        &quot;&quot;&quot;

        # Layer normalization 1
        normalized_x = self.layer_normalization_1(x)

        # Multi headed self attention
        attention_output = self.multi_headed_self_attention(normalized_x, mask)

        # Residual output
        residual_output = x + attention_output

        # Layer normalization 2
        normalized_residual_output = self.layer_normalization_2(residual_output)

        # Feed forward
        feed_forward_output = self.feed_forward(normalized_residual_output)

        # Dropout, only when training.
        if self.training:
            feed_forward_output = self.dropout(feed_forward_output)

        # Residual output
        return residual_output + feed_forward_output</code></pre><p>The DecoderStack is a number of decoder layers in sequence.</p><pre><code class="language-python">class DecoderStack(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for a stack of decoders.
    &quot;&quot;&quot;

    def __init__(
            self,
            embedding_dimension,
            number_of_layers,
            number_of_heads,
            feed_forward_dimension,
            dropout_rate,
            max_sequence_length
    ):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.number_of_layers = number_of_layers
        self.number_of_heads = number_of_heads
        self.feed_forward_dimension = feed_forward_dimension
        self.dropout_rate = dropout_rate
        self.max_sequence_length = max_sequence_length

        # Create the encoder layers
        self.encoder_layers = torch.nn.ModuleList(
            [DecoderLayer(embedding_dimension, number_of_heads, feed_forward_dimension, dropout_rate) for _ in
             range(number_of_layers)])

    def forward(self, x, mask):
        decoder_outputs = x
        for decoder_layer in self.encoder_layers:
            decoder_outputs = decoder_layer(decoder_outputs, mask)

        return decoder_outputs</code></pre><p>The feed forward layer </p><pre><code class="language-python">class FeedForward(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for a feed forward layer.

    A feed forward layer is a fully connected layer with a ReLU activation function in between.
    &quot;&quot;&quot;

    def __init__(self, embedding_dimension, feed_forward_dimension):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.feed_forward_dimension = feed_forward_dimension
        self.linear_1 = torch.nn.Linear(embedding_dimension, feed_forward_dimension)
        self.linear_2 = torch.nn.Linear(feed_forward_dimension, embedding_dimension)

    def forward(self, x):
        &quot;&quot;&quot;
        Compute the feed forward layer.
        &quot;&quot;&quot;
        return self.linear_2(torch.relu(self.linear_1(x)))</code></pre><h3 id="the-model"><br>The model</h3><p></p><p>the <code>LanguageModel</code> class brings together all the layers we&apos;ve discussed so far: token embeddings, positional encoding, normalization, and the decoder stack. Let&apos;s go through each component:</p><ul><li><strong>Token Embedding</strong>: The model first creates token embeddings. Each token (word, subword, or character) in the input sequence is represented by a high-dimensional vector, which is initialized randomly and learned during training. The embedding dimension is a hyperparameter.</li><li><strong>Positional Encoding</strong>: The model then applies positional encoding to the token embeddings. This helps the model to understand the order of the tokens in the sequence, a crucial piece of information in many natural language tasks. In GPT, positional encoding is achieved by adding a vector to each token embedding, which encodes the token&apos;s position in the sequence.</li><li><strong>Layer Normalization</strong>: Next, the model applies layer normalization to the result of the positional encoding. This normalization process adjusts the vectors so that each dimension has a mean of 0 and a standard deviation of 1, equalizing the influence of each dimension and helping to stabilize the learning process.</li><li><strong>Decoder Stack</strong>: The normalized output is then passed into a stack of decoders. Each decoder block in the stack consists of a self-attention mechanism and a feed-forward neural network, with layer normalization and residual connections used throughout.</li></ul><p>After the data passes through the decoder stack, we reach the final part of the model: the language model head.</p><pre><code class="language-python">class LanguageModel(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for a language model.
    &quot;&quot;&quot;

    def __init__(
            self,
            number_of_tokens,  # The number of tokens in the vocabulary
            max_sequence_length=512,  # The maximum sequence length to use for attention
            embedding_dimension=512,  # The dimension of the token embeddings
            number_of_layers=6,  # The number of decoder layers to use
            number_of_heads=4,  # The number of attention heads to use
            feed_forward_dimension=None,  # The dimension of the feed forward layer
            dropout_rate=0.1  # The dropout rate to use
    ):
        super().__init__()
        self.number_of_tokens = number_of_tokens
        self.max_sequence_length = max_sequence_length
        self.embedding_dimension = embedding_dimension
        self.number_of_layers = number_of_layers
        self.number_of_heads = number_of_heads

        if feed_forward_dimension is None:
            # GPT-2 paper uses 4 * embedding_dimension for the feed forward dimension
            self.feed_forward_dimension = embedding_dimension * 4
        else:
            self.feed_forward_dimension = feed_forward_dimension

        self.dropout_rate = dropout_rate

        # Create the token embedding layer
        self.token_embedding = TokenEmbedding(embedding_dimension, number_of_tokens)

        # Create the positional encoding layer
        self.positional_encoding = PositionalEncoding(embedding_dimension, max_sequence_length)

        # Create the normalization layer
        self.layer_normalization = torch.nn.LayerNorm(embedding_dimension)

        # Create the decoder stack
        self.decoder = DecoderStack(
            embedding_dimension=embedding_dimension,
            number_of_layers=number_of_layers,
            number_of_heads=number_of_heads,
            feed_forward_dimension=self.feed_forward_dimension,
            dropout_rate=dropout_rate,
            max_sequence_length=max_sequence_length
        )

        # Create the language model head
        self.lm_head = LMHead(embedding_dimension, number_of_tokens)

    def forward(self, x, mask):
        # Compute the token embeddings
        # token_embeddings dimensions are: (batch_size, sequence_length, embedding_dimension)
        token_embeddings = self.token_embedding(x)

        # Compute the positional encoding
        # positional_encoding dimensions are: (batch_size, sequence_length, embedding_dimension)
        positional_encoding = self.positional_encoding(token_embeddings)

        # Post embedding layer normalization
        positional_encoding_normalized = self.layer_normalization(positional_encoding)

        decoder_outputs = self.decoder(positional_encoding_normalized, mask)
        lm_head_outputs = self.lm_head(decoder_outputs)

        return lm_head_outputs</code></pre><p><strong>Language Model Head</strong></p><p>The <code>LanguageModel</code> class concludes with the <code>LMHead</code> layer. This layer is essentially a linear transformation that maps the high-dimensional output of the decoder stack back down to the dimension of the token vocabulary.</p><p>To put it in simpler terms, imagine you have a vocabulary of 10,000 unique words and your decoder&apos;s output dimension is 512. Each word in your vocabulary is going to have a unique 512-dimensional vector representation after passing through the decoder. But we want to assign a probability to each word in the vocabulary given the preceding context. This is where <code>LMHead</code> comes in.</p><p><code>LMHead</code> maps the 512-dimensional vector back to the 10,000-dimensional space, essentially assigning a score to each of the 10,000 words. These scores are then passed through a softmax function to convert them into probabilities. Therefore, <code>LMHead</code> is crucial in transforming the high-dimensional output of the decoder stack to the likelihood of each word being the next word in the sequence.</p><p>The <code>LMHead</code> is implemented as a subclass of PyTorch&apos;s <code>torch.nn.Module</code>. It uses a linear layer (a basic type of neural network layer that applies a linear transformation to the input) to map the decoder&apos;s output dimension to the number of tokens in the vocabulary.<br><br>Consider a scenario where the model has processed the phrase &quot;The quick brown fox&quot;. The decoder stack outputs a 512-dimensional vector for the final word &quot;fox&quot;.</p><p>Now, let&apos;s imagine our vocabulary consists of just five words: &quot;jumps&quot;, &quot;sleeps&quot;, &quot;eats&quot;, &quot;runs&quot;, and &quot;fox&quot;. We want to determine the likelihood of each of these words being the next word in the sentence.</p><p>That&apos;s where the <code>LMHead</code> comes into play. This linear layer maps the 512-dimensional vector to a 5-dimensional vector, since we have 5 words in our vocabulary. Each entry in this output vector corresponds to a word in the vocabulary, and can be interpreted as a raw score for how likely that word is to follow the phrase &quot;The quick brown fox&quot;.<br><br>Assume the probabilities after applying softmax are: [&quot;jumps&quot;: 0.6, &quot;sleeps&quot;: 0.05, &quot;eats&quot;: 0.2, &quot;runs&quot;: 0.13, &quot;fox&quot;: 0.02]. So the model predicts &quot;The quick brown fox jumps&quot; as the most likely continuation of the input sequence.</p><pre><code class="language-python">class LMHead(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module for the language model head.
    The language model head is a linear layer that maps the embedding dimension to the vocabulary size.
    &quot;&quot;&quot;

    def __init__(self, embedding_dimension, number_of_tokens):
        super().__init__()
        self.embedding_dimension = embedding_dimension
        self.number_of_tokens = number_of_tokens
        self.linear = torch.nn.Linear(embedding_dimension, number_of_tokens)

    def forward(self, x):
        &quot;&quot;&quot;
        Compute the language model head.

        x dimensions are: (batch_size, sequence_length, embedding_dimension)
        output dimensions are: (batch_size, sequence_length, number_of_tokens)
        &quot;&quot;&quot;
        # Compute the linear layer
        # linear_output dimensions are: (batch_size, sequence_length, number_of_tokens)
        linear_output = self.linear(x)

        return linear_output</code></pre><p><strong>Autoregressive Wrapper</strong></p><p>To allow our language model to generate text one token at a time, we wrap it in an autoregressive module. In an autoregressive model, the output from previous steps is fed as input to subsequent steps. This is where the <code>AutoregressiveWrapper</code> comes in.</p><p>The autoregressive wrapper takes a sequence of tokens as input, where the sequence length is one token more than the maximum sequence length allowed. This extra token is necessary because in autoregressive models, the model is trained to predict the next token in the sequence given the previous tokens.</p><p>For instance, consider the sentence: &quot;The cat sat on the mat&quot;. If the input sequence is &quot;The cat sat on the&quot;, the target output sequence (the sequence that the model is trained to predict) is &quot;cat sat on the mat&quot;. This is why the input sequence is shifted one step to the left relative to the output sequence.</p><p>The <code>AutoregressiveWrapper</code> class also includes a method for calculating the probabilities of the next token in the sequence. It generates these probabilities by applying a softmax function to the logits (the raw, unnormalized scores output by the model for each token in the vocabulary) associated with the last token in the sequence. A &quot;temperature&quot; parameter is used to adjust the sharpness of the probability distribution. Lower temperatures make the output more deterministic (i.e., more likely to choose the most probable token), while higher temperatures make the output more random.</p><pre><code class="language-python">class AutoregressiveWrapper(torch.nn.Module):
    &quot;&quot;&quot;
    Pytorch module that wraps a GPT model and makes it autoregressive.
    &quot;&quot;&quot;

    def __init__(self, gpt_model):
        super().__init__()
        self.model = gpt_model
        self.max_sequence_length = self.model.max_sequence_length

    def forward(self, x, mask):
        &quot;&quot;&quot;
        Autoregressive forward pass
        &quot;&quot;&quot;
        inp, target = x[:, :-1], x[:, 1:]
        mask = mask[:, :-1]

        output = self.model(inp, mask)
        return output, target

    def next_token_probabilities(self, x, mask, temperature=1.0):
        &quot;&quot;&quot;
        Calculate the token probabilities for the next token in the sequence.
        &quot;&quot;&quot;
        logits = self.model(x, mask)[:, -1]

        # Apply the temperature
        if temperature != 1.0:
            logits = logits / temperature

        # Apply the softmax
        probabilities = torch.softmax(logits, dim=-1)

        return probabilities</code></pre><h3 id="trainer">Trainer </h3><p><br>Now we have a model that can learn how language works we need to actually train it to do so.</p><p>First we create the tokenizer, so we can convert our dataset to tokens.<br>Then we create the autoregressive language model. Because the dataset is very small I am going to only set a max_sequence_length of 20, but a more normal value would be 512. </p><p>I will then split the training text into sequences of [max_sequence_length + 1]. To make sure the starting tokens are also considered the data will be padded on the left. </p><p>Then we are going to train the model for 100 epochs, with a batch size of 8. An epoch means a complete pass over the training data. Batch size means that in every forward pass through the model we consider 8 sequences from the training data simultaneously. The higher the batch size the better the model can learn patterns in the data, but a higher batch size also leads to more memory usage.</p><pre><code class="language-python">def create_training_sequences(max_sequence_length, tokenized_training_data):
    # Create sequences of length max_sequence_length + 1
    # The last token of each sequence is the target token
    sequences = []
    for i in range(0, len(tokenized_training_data) - max_sequence_length - 1):
        sequences.append(tokenized_training_data[i: i + max_sequence_length + 1])
    return sequences


def tokenize_and_pad_training_data(max_sequence_length, tokenizer, training_data):
    # Tokenize the training data
    tokenized_training_data = tokenizer.tokenize(training_data)
    for _ in range(max_sequence_length):
        # Prepend padding tokens
        tokenized_training_data.insert(0, tokenizer.character_to_token(&apos;&lt;pad&gt;&apos;))
    return tokenized_training_data


tokenizer = Tokenizer()

embedding_dimension = 256
max_sequence_length = 20
number_of_tokens = tokenizer.size()

# Create the model
model = AutoregressiveWrapper(LanguageModel(
    embedding_dimension=embedding_dimension,
    number_of_tokens=number_of_tokens,
    number_of_heads=4,
    number_of_layers=3,
    dropout_rate=0.1,
    max_sequence_length=max_sequence_length
))

# Create the training data
training_data = &apos;. &apos;.join([
    &apos;cats rule the world&apos;,
    &apos;dogs are the best&apos;,
    &apos;elephants have long trunks&apos;,
    &apos;monkeys like bananas&apos;,
    &apos;pandas eat bamboo&apos;,
    &apos;tigers are dangerous&apos;,
    &apos;zebras have stripes&apos;,
    &apos;lions are the kings of the savannah&apos;,
    &apos;giraffes have long necks&apos;,
    &apos;hippos are big and scary&apos;,
    &apos;rhinos have horns&apos;,
    &apos;penguins live in the arctic&apos;,
    &apos;polar bears are white&apos;
])

tokenized_and_padded_training_data = tokenize_and_pad_training_data(max_sequence_length, tokenizer, training_data)
sequences = create_training_sequences(max_sequence_length, tokenized_and_padded_training_data)

# Train the model
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
trainer = Trainer(model, tokenizer, optimizer)
trainer.train(sequences, epochs=100, batch_size=8)</code></pre><p>The trainer is a helper class that loops over the epochs and shuffles the data at the start of each epoch. The reason to do this is to prevent the batches from being the same every time, causing the model to overfit to these specific batches.</p><p>While creating batches we also determine the mask. All padding tokens are masked, meaning they will not be considered in the attention step. </p><p>Then we do a forward pass through the model with a batch. This means we let the model make predictions using the given data. The predictions are then compared to a target value, which is the sequence shifted by 1 step so the next token becomes visible. The model outputs probabilities for what token should be the next. The loss function knows what the answer should be. The further from its target the prediction was the higher the loss value will be. </p><p>When the loss value is calculated the model can be updated. This is done by calculating gradients; the direction the weights should be adjusted to improve the prediction of the model. The model is then slightly adjusted in the direction of the gradients, and a new batch can be processed. </p><p>If everything works as planned, the loss should go down over time. I return the loss per epoch, so it can be plotted.</p><pre><code class="language-python">class Trainer:

    def __init__(self, model, tokenizer: Tokenizer, optimizer=None):
        super().__init__()
        self.model = model
        if optimizer is None:
            self.optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
        else:
            self.optimizer = optimizer
        self.tokenizer = tokenizer
        self.loss_function = torch.nn.CrossEntropyLoss()

    def train(self, data: List[str], epochs, batch_size):
        loss_per_epoch = []
        for epoch in range(epochs):
            losses = []

            # Shuffle the sequences
            random.shuffle(data)

            # Create batches of sequences and their respective mask.
            batches = []
            for i in range(0, len(data), batch_size):
                sequence_tensor = torch.tensor(data[i: i + batch_size], dtype=torch.long)

                # Create the mask tensor for the batch, where 1 means the token is not a padding token
                mask_tensor = torch.ones_like(sequence_tensor)
                mask_tensor[sequence_tensor == self.tokenizer.character_to_token(&apos;&lt;pad&gt;&apos;)] = 0

                batches.append((sequence_tensor, mask_tensor))

            # Train the model on each batch
            for batch in batches:
                self.model.train()

                # Create the input and mask tensors
                input_tensor = torch.zeros((batch_size, self.model.max_sequence_length + 1), dtype=torch.long)
                mask_tensor = torch.zeros((batch_size, self.model.max_sequence_length + 1), dtype=torch.long)

                for i, input_entry in enumerate(batch[0]):
                    input_tensor[i] = input_entry

                for i, mask_entry in enumerate(batch[1]):
                    mask_tensor[i] = mask_entry

                # Compute the model output
                model_output, target = self.model.forward(x=input_tensor, mask=mask_tensor)

                # Compute the losses
                # The loss is computed on the model output and the target
                loss = self.loss_function(model_output.transpose(1, 2), target)

                # Backpropagate the loss.
                loss.backward()

                # Clip the gradients. This is used to prevent exploding gradients.
                torch.nn.utils.clip_grad_norm_(self.model.parameters(), 0.5)

                # Update the model parameters. This is done by taking a step in the direction of the gradient.
                self.optimizer.step()

                # Reset the gradients. This is done so that the gradients from the previous batch
                # are not used in the next step.
                self.optimizer.zero_grad()

                # Append the loss to the list of losses, so that the average loss can be computed for this epoch.
                losses.append(loss.item())

            # Print the loss
            epoch_loss = np.average(losses)
            loss_per_epoch.append(epoch_loss)
            print(&apos;Epoch:&apos;, epoch, &apos;Loss:&apos;, epoch_loss)

        return loss_per_epoch</code></pre><p>Evenutally plotting the loss should give us a nice graph with decreasing loss. It is plotted in log scale, so you can see the smaller variations towards the end of training.</p><pre><code class="language-python"># Plot the loss per epoch in log scale
plt.plot(loss_per_epoch)
plt.yscale(&apos;log&apos;)
plt.ylabel(&apos;Loss&apos;)
plt.xlabel(&apos;Epoch&apos;)
plt.show()</code></pre><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/11/image-9.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="1238" height="952" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/image-9.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/11/image-9.png 1000w, https://wingedsheep.com/content/images/2022/11/image-9.png 1238w" sizes="(min-width: 720px) 720px"></figure><h3 id="generator">Generator<br></h3><p>Now the model is trained and I want to see if it actually learned to write. Let&apos;s try to generate a text based on the prompt &quot;elephants&quot;. I want it to continue writing for 50 tokens. &#xA0;</p><p>Since the only mention of elephants in the training data is &quot;elephants have long trunks&quot;, I expect the model to write this.</p><pre><code class="language-python">max_tokens_to_generate = 50
generator = Generator(model, tokenizer)
generated_text = generator.generate(
    max_tokens_to_generate=max_tokens_to_generate,
    prompt=&quot;elephants&quot;,
    padding_token=tokenizer.character_to_token(&apos;&lt;pad&gt;&apos;)
)
print(generated_text.replace(&apos;&lt;pad&gt;&apos;, &apos;&apos;))</code></pre><p>but first we need to write the code for the Generator. A helper class for generating text. </p><p>First we switch the model from &apos;training&apos; mode to &apos;eval&apos; mode. In eval mode the model will not apply dropout. We also wrap the generation in <code>torch.no_grad()</code> to disable gradient computation, which saves memory during inference.</p><p>The prompt we give is converted to tokens, and then padded so it has the correct sequence length.</p><p>Then we are going to auto-regressively generate new tokens and add them to the input sequence. After a token is added we run the new input sequence with the extra token through the model again, and we append a new token. We continue this process until the maximum number of characters we wanted to generate is reached, or until we have generated the eos_token, or end of sequence token. This is a token that can be defined by the user as an indication that we need to stop generating.</p><pre><code class="language-python">def pad_left(sequence, final_length, padding_token):
    return [padding_token] * (final_length - len(sequence)) + sequence


class Generator:

    def __init__(
            self,
            model,
            tokenizer):
        self.model = model
        self.tokenizer = tokenizer

    def generate(
            self,
            max_tokens_to_generate: int,
            prompt: str = None,
            temperature: float = 1.0,
            eos_token: int = None,
            padding_token: int = 0):

        self.model.eval()

        if prompt is None:
            start_tokens = [self.tokenizer.character_to_token(padding_token)]
        else:
            start_tokens = self.tokenizer.tokenize(prompt)

        input_tensor = torch.tensor(
            pad_left(
                sequence=start_tokens,
                final_length=self.model.max_sequence_length + 1,
                padding_token=padding_token
            ),
            dtype=torch.long
        )

        num_dims = len(input_tensor.shape)

        if num_dims == 1:
            input_tensor = input_tensor[None, :]

        out = input_tensor
        for _ in range(max_tokens_to_generate):

            x = out[:, -self.model.max_sequence_length:]

            mask = torch.ones_like(x)
            mask[x == padding_token] = 0

            # Compute the next token probabilities
            next_token_probabilities = self.model.next_token_probabilities(
                x=x,
                temperature=temperature,
                mask=mask
            )

            # Sample the next token from the probability distribution
            next_token = torch.multinomial(next_token_probabilities, num_samples=1)

            # Append the next token to the output
            out = torch.cat([out, next_token], dim=1)

            # If the end of sequence token is reached, stop generating tokens
            if eos_token is not None and next_token == eos_token:
                break

        generated_tokens = out[0].tolist()
        return &apos;&apos;.join([self.tokenizer.token_to_character(token) for token in generated_tokens])</code></pre><p>The training is finished and the generator has run. aaaaaanndd... the model actually outputs the text we trained it on! </p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/11/image-10.png" class="kg-image" alt="Building a text generation model from scratch" loading="lazy" width="1022" height="932" srcset="https://wingedsheep.com/content/images/size/w600/2022/11/image-10.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/11/image-10.png 1000w, https://wingedsheep.com/content/images/2022/11/image-10.png 1022w" sizes="(min-width: 720px) 720px"></figure><p>Of course, when training on such a small dataset the model will completely overfit it and learn to reproduce the whole dataset. Not what you are usually looking for in a language model, but in this &quot;hello world&quot; test it means success!</p><h3 id="saving-and-loading-the-model">Saving and loading the model</h3><p><br>Once you trained the model, it is useful if you can save it, so you don&apos;t have to train a new model every time.</p><p>To do this we add the following code to the LanguageModel class.</p><pre><code class="language-python">def save_checkpoint(self, path):
    print(f&apos;Saving checkpoint {path}&apos;)
    torch.save({
        &apos;number_of_tokens&apos;: self.number_of_tokens,
        &apos;max_sequence_length&apos;: self.max_sequence_length,
        &apos;embedding_dimension&apos;: self.embedding_dimension,
        &apos;number_of_layers&apos;: self.number_of_layers,
        &apos;number_of_heads&apos;: self.number_of_heads,
        &apos;feed_forward_dimension&apos;: self.feed_forward_dimension,
        &apos;dropout_rate&apos;: self.dropout_rate,
        &apos;model_state_dict&apos;: self.state_dict()
    }, path)

@staticmethod
def load_checkpoint(path) -&gt; &apos;LanguageModel&apos;:
    checkpoint = torch.load(path)
    model = LanguageModel(
        number_of_tokens=checkpoint[&apos;number_of_tokens&apos;],
        max_sequence_length=checkpoint[&apos;max_sequence_length&apos;],
        embedding_dimension=checkpoint[&apos;embedding_dimension&apos;],
        number_of_layers=checkpoint[&apos;number_of_layers&apos;],
        number_of_heads=checkpoint[&apos;number_of_heads&apos;],
        feed_forward_dimension=checkpoint[&apos;feed_forward_dimension&apos;],
        dropout_rate=checkpoint[&apos;dropout_rate&apos;]
    )
    model.load_state_dict(checkpoint[&apos;model_state_dict&apos;])
    return model</code></pre><p>Since we use the AutoregressiveWrapper as convenience class, we can give this wrapper the save and load methods too.</p><pre><code class="language-python">def save_checkpoint(self, path):
    self.model.save_checkpoint(path)

@staticmethod
def load_checkpoint(path) -&gt; &apos;AutoregressiveWrapper&apos;:
    model = LanguageModel.load_checkpoint(path)
    return AutoregressiveWrapper(model)</code></pre><p>This makes it possible to easily save and load a trained model using.</p><pre><code class="language-python">model.save_checkpoint(&apos;./trained_model&apos;)
model = model.load_checkpoint(&apos;./trained_model&apos;)</code></pre><h3 id="running-on-gpu">Running on GPU</h3><p><br>If you have a GPU at your disposal and CUDA is configured, you can use a GPU to speed up training.</p><p>First we need to define a function to determine if we can use a GPU:</p><pre><code class="language-python">def get_device():
    if torch.cuda.is_available():
        return torch.device(&apos;cuda&apos;)
    else:
        return torch.device(&apos;cpu&apos;)</code></pre><p>Then we need to move the model and all input tensors to our device. We can do this by using the torch function <code>to</code>.</p><p>When creating the model, move it to the device:</p><pre><code class="language-python">model = AutoregressiveWrapper(LanguageModel(
    embedding_dimension=embedding_dimension,
    number_of_tokens=number_of_tokens,
    number_of_heads=4,
    number_of_layers=3,
    dropout_rate=0.1,
    max_sequence_length=max_sequence_length
)).to(get_device())</code></pre><p>In the <code>Trainer.train</code> method, move the input tensors and target to the device:</p><pre><code class="language-python">model_output, target = self.model.forward(
    x=input_tensor.to(get_device()),
    mask=mask_tensor.to(get_device())
)

loss = self.loss_function(model_output.transpose(1, 2), target.to(get_device()))</code></pre><p>In the <code>Generator.generate</code> method, move the input tensor to the device:</p><pre><code class="language-python">input_tensor = torch.tensor(
    pad_left(
        sequence=start_tokens,
        final_length=self.model.max_sequence_length + 1,
        padding_token=padding_token
    ),
    dtype=torch.long
).to(get_device())</code></pre><p>Note that we also use <code>register_buffer</code> for the positional encoding matrix in the <code>PositionalEncoding</code> class. This ensures that the precomputed positional encodings automatically move to the correct device along with the model, avoiding device mismatch errors.</p><p>The speedup achieved by using a GPU can be really significant.</p><h3 id="conclusion">Conclusion</h3><p><br>While writing this blogpost I learned a lot about how the transformer works, and how we can use it to generate text. I hope you enjoyed reading it, and learned something new too!</p><p>Feel free to leave a comment if you have remarks, questions or just want to let me know what you think :)</p><p>The code for this blogpost is available at <a href="https://github.com/wingedsheep/transformer?ref=wingedsheep.com">https://github.com/wingedsheep/transformer</a></p><h3 id="sources">Sources</h3><p><br>Some resources that were incredibly helpful in helping me understand attention, the transformer architecture and GPT models.</p><ul><li>Attention is all you need by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin <a href="https://arxiv.org/abs/1706.03762?ref=wingedsheep.com">https://arxiv.org/abs/1706.03762</a></li><li>Transformer implementation by Phil Wang (Lucidrains) <a href="https://github.com/lucidrains/x-transformers?ref=wingedsheep.com">https://github.com/lucidrains/x-transformers</a></li><li>The illustrated transformer by Jay Alammar <a href="https://jalammar.github.io/illustrated-transformer/?ref=wingedsheep.com">https://jalammar.github.io/illustrated-transformer/</a></li><li>Illustrated GPT-2 by Jay Alammar <a href="https://jalammar.github.io/illustrated-gpt2/?ref=wingedsheep.com">https://jalammar.github.io/illustrated-gpt2/</a></li><li>MinGPT by Andrej Karpathy <a href="https://github.com/karpathy/minGPT?ref=wingedsheep.com">https://github.com/karpathy/minGPT</a></li><li>Seq2seq and attention by Lena Voita <a href="https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html?ref=wingedsheep.com">https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html</a></li><li>The GPT-3 Architecture, on a Napkin by Daniel Dugas <a href="https://dugas.ch/artificial_curiosity/GPT_architecture.html?ref=wingedsheep.com">https://dugas.ch/artificial_curiosity/GPT_architecture.html</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Dreambooth]]></title><description><![CDATA[Using Dreambooth to create a customized stable diffusion model for my cat.]]></description><link>https://wingedsheep.com/using-dreambooth-with-stable-diffusion/</link><guid isPermaLink="false">6342f4a24b1ce80063699221</guid><category><![CDATA[AI Art]]></category><category><![CDATA[Stable diffusion]]></category><category><![CDATA[Dreambooth]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Sun, 09 Oct 2022 22:26:45 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2022/10/pip_upscaled.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2022/10/pip_upscaled.jpeg" alt="Dreambooth"><p></p><h2 id="introduction">Introduction</h2><p><br>Since the release of stable diffusion there has been an avalanche of new techniques and tools to create AI generated art. One of the most interesting of these tools is <a href="https://dreambooth.github.io/?ref=wingedsheep.com">dreambooth</a>. This is a technique created by Google Research to personalize text to image models. </p><p>A text to image model like stable diffusion allows you to create images from a description. For example &quot;A beautiful oil painting of a cat sailing the ocean&quot; will probably give you something like the image below with the default stable diffusion model.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-3.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A beautiful oil painting of a cat sailing the ocean</figcaption></figure><p>These models provide the relations between how the world looks and how it is described in text in a very compact format. If you know exactly the right text you can get the model to output almost any image you want. But the catch is that it often takes a large effort and a lot of experimenting to find the right text to use as input.</p><p>This is where Dreambooth comes in. Dreambooth allows you to teach the model your own c0ncepts. In The example below they trained the model the concept of a certain cute dog with large ears. This dog can then be placed in different contexts. </p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-2.png" class="kg-image" alt="Dreambooth" loading="lazy" width="1650" height="462" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-2.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-2.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-2.png 1600w, https://wingedsheep.com/content/images/2022/10/image-2.png 1650w" sizes="(min-width: 720px) 720px"></figure><p>Dreambooth unlocks many possibilities. You could train a model the concept of you by feeding it selfies and place yourself in your favourite movies, you could turn your pets into Pixar characters or teach it to recognize a certain art style that you like. </p><h2 id="training-a-custom-dreambooth-model">Training a custom Dreambooth model</h2><p><br>This part will be a guide for training your own Dreambooth model using the colab notebook found in <a href="https://github.com/TheLastBen/fast-stable-diffusion?ref=wingedsheep.com">https://github.com/TheLastBen/fast-stable-diffusion</a></p><p>I am going to use my cat Pip as an example.</p><h3 id="data">Data</h3><p><br>First we need some data. In the Github repository they recommend collecting 200 or more pictures as training data, but good results can be achieved with a lot less. </p><p>As preparation I collected 39 pictures of my cat. All pictures need to have the dimensions of 512 x 512, because that is the format stable diffusion is trained on. I use <a href="https://pixlr.com/?ref=wingedsheep.com">https://pixlr.com/</a> to resize and crop the images. </p><p>All the resized images go into a folder in my Google Drive.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-5.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="1114" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-5.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-5.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-5.png 1600w, https://wingedsheep.com/content/images/size/w2400/2022/10/image-5.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>The 39 images of my cat Pip that I used for training Dreambooth</figcaption></figure><p>After all the images are prepared and uploaded we can start the colab notebook. Make sure that the runtime type is set to GPU.</p><h3 id="training-the-model">Training the model</h3><p></p><p><strong>Mount google drive</strong></p><p>The first step is to mount your Google Drive to Colab. The notebook saves the trained model to your drive. You can also use a folder from your drive for reference images used to train the model.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-4.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="450" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-4.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-4.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-4.png 1600w, https://wingedsheep.com/content/images/2022/10/image-4.png 2144w" sizes="(min-width: 720px) 720px"></figure><p><strong>Setup environment &amp; download the model </strong></p><p>After mounting Google Drive we can setup the environment and enter our Huggingface token. Huggingface hosts the stable diffusion model here <a href="https://huggingface.co/CompVis/stable-diffusion-v1-4?ref=wingedsheep.com">https://huggingface.co/CompVis/stable-diffusion-v1-4</a>. You can request access to the model if you agree to some terms and conditions. To do this you need to create an account.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-7.png" class="kg-image" alt="Dreambooth" loading="lazy" width="1790" height="1510" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-7.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-7.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-7.png 1600w, https://wingedsheep.com/content/images/2022/10/image-7.png 1790w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-6.png" class="kg-image" alt="Dreambooth" loading="lazy" width="1544" height="776" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-6.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-6.png 1000w, https://wingedsheep.com/content/images/2022/10/image-6.png 1544w" sizes="(min-width: 720px) 720px"></figure><p><strong>Dreambooth settings</strong></p><p>Next we have to configure Dreambooth for the model we are going to train. There are some fields we have to fill in. </p><p><em>SUBJECT_NAME</em> is the class of the object we are training on. This is a &#xA0;coarse description of the category our training subject belongs to. It could be something like &quot;person&quot;, &quot;car&quot;, &quot;house&quot; etc. In my case I can enter &quot;cat&quot; here, but if you want to train the model on your own face for example you might enter &quot;face&quot;. Dreambooth uses this to entangle your instance with the subject. The result is that less training time is needed, because the base model already knows a lot about your subject if it is general enough. Stable diffusion has seen all the poses cats can take.</p><p><em>INSTANCE_NAME</em> is how we are going to refer to the subject. It is good to have a unique description here, that does not have a lot of associations with it. If we pick a word that already has a lot of associations the finetuning process has to override all those associations. I chose &quot;pipper2022&quot;, but maybe a completely random string like &quot;2Np1Pu6EB3&quot; would work even better.</p><p><em>INSTANCE_DIR_OPTIONAL</em> here I am going to refer to my Google Drive folder containing all the images of my cat Pip. It is not necessary to refer to a folder. If you leave this field empty you can upload the files directly in colab.</p><p><em>Number_of_subject_images</em> here you can enter the number of subject images. These are images of your general class, so in my case images of cats. If you don&apos;t want to supply your own images they will be generated using stable diffusion, by using SUBJECT_NAME as a prompt. Some prompts generate low quality images, so if you want better quality you can choose to upload your own class images. </p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-23.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="968" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-23.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-23.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-23.png 1600w, https://wingedsheep.com/content/images/2022/10/image-23.png 2310w" sizes="(min-width: 720px) 720px"></figure><p><strong>Subject images</strong></p><p>For the next step we can indicate a folder with subject images. These are images containing the category of our training subject. In my case these should be images of random cats. For this blogpost I chose not to supply my own cat images, since stable diffusion did quite a good job generating them for me.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-10.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="418" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-10.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-10.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-10.png 1600w, https://wingedsheep.com/content/images/size/w2400/2022/10/image-10.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Below are some examples of the cats generated by the notebook using the prompt &quot;cat&quot;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-15.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="1077" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-15.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-15.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-15.png 1600w, https://wingedsheep.com/content/images/size/w2400/2022/10/image-15.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Generated class images for the prompt &quot;cat&quot;</figcaption></figure><p><strong>Training the model</strong></p><p>Then it is time to train the model. The author of the Colab notebook recommends 2000 steps. How many steps you need really depends a lot on the complexity of the subject it seems. I found that for my cat 1000 steps and 40 images is sufficient. Some people get great results with few training samples and steps, but if you want to capture a person in different angles and distances you would probably need more. </p><p>Roope Rainisto did a great series of images of Grace Kelly, where he used 10.000 training steps according to one of the follow up tweets. But the drawback might be overfitting that leads to every person looking like your subject.</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Grace Kelly in Game Of Thrones<br>Grace Kelly in Wonder Woman<br>Grace Kelly in Captain Marvel<br>Grace Kelly in Star Trek<a href="https://twitter.com/hashtag/dreambooth?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=wingedsheep.com">#dreambooth</a> <a href="https://twitter.com/hashtag/stablediffusion?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=wingedsheep.com">#stablediffusion</a> <a href="https://t.co/si5YBfUTnB?ref=wingedsheep.com">pic.twitter.com/si5YBfUTnB</a></p>&#x2014; Roope Rainisto (@rainisto) <a href="https://twitter.com/rainisto/status/1578114725191319556?ref_src=twsrc%5Etfw&amp;ref=wingedsheep.com">October 6, 2022</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure><p>If you didn&apos;t supply subject images these will be generated before training the model. Generating the images and training the model will take time, so you can get a cup of coffee while you wait for the results.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-12.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="967" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-12.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-12.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-12.png 1600w, https://wingedsheep.com/content/images/size/w2400/2022/10/image-12.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>The generated class images are saved to the data folder in your &quot;content/data&quot; folder, so you can check if the generated images represent your class well.</p><p>Because this is a test model I set the number of training steps to 1000 and let it run. Generating the 200 class images takes a bit more than 20 minutes and training the model for 1000 steps takes around 25 minutes on Colab Pro.</p><blockquote><em><strong>Update 2022-10-30</strong>:</em> TheLastBen dreambooth implementation is updated. You only need to upload around 30 images, and no class images are needed anymore. This greatly reduces the amount of preparation required. Recommended steps is 100x the number of training images uploaded.</blockquote><h3 id="generating-images">Generating images</h3><p><br>Now we trained the model we should be able to use it to transport my cat Pip to various settings. Running the last segment will start a local server for stable diffusion web-ui. For me the local server didn&apos;t work, so I used the Gradio server.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-29.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="1100" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-29.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-29.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-29.png 1600w, https://wingedsheep.com/content/images/2022/10/image-29.png 2210w" sizes="(min-width: 720px) 720px"></figure><p>We can now open the web-ui and use the SUBJECT_NAME (cat) and the INSTANCE_NAME (pipper2022) to generate images. In the example below I tried to make an oil painting of Pip, using the name of a made up artist called &quot;Arthur Valin&quot;.</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2022/10/image-25.png" class="kg-image" alt="Dreambooth" loading="lazy" width="2000" height="1314" srcset="https://wingedsheep.com/content/images/size/w600/2022/10/image-25.png 600w, https://wingedsheep.com/content/images/size/w1000/2022/10/image-25.png 1000w, https://wingedsheep.com/content/images/size/w1600/2022/10/image-25.png 1600w, https://wingedsheep.com/content/images/size/w2400/2022/10/image-25.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Here are some of the best Pips to come out of the process.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-31.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A beautiful oil painting of a pipper2022 cat sailing the ocean</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-32.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A beautiful oil painting of a pipper2022 cat in nature</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-33.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A movie still of a pipper2022 cat in the pixar movie Ratatouille.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-34.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A movie still of a pipper2022 cat in the latest Pixar movie. High quality.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/00202-224936927-Cypus-cat-pipper_2022-relaxing-in-the-grass.-Oil-on-canvas-by-Arthur-Valin--2021-.-Detailed.-Beautiful-light.-Trending-on-artsta.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>Relaxing in the grass, by Arthur Valin (imaginary artist)</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-38.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A pipper2022 cat in a snowy city. Illustration by Moebius (1975). High quality. Beautiful light. Trending on artstation.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-35.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A movie still of a pipper2022 cat in a Disney movie (1998). Hand drawn animation. High quality.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-19.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>Portrait of a pipper2022 cat exploring an old forest. Oil on canvas by Arthur Valin (2021). High quality.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-30.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>Portrait of a pipper2022 cat relaxing in the sun. Oil on canvas by Henri&#xEB;tte Ronner-Knip. Detailed. High quality. Beautiful light.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-36.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>A beautiful gouache painting of a pipper2022 cat relaxing in nature. High quality.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-21.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>Portrait of cat pipper2022. Oil on canvas by Vincent van Gogh. High quality. Beautiful light. Trending on artstation.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/10/image-22.png" class="kg-image" alt="Dreambooth" loading="lazy" width="512" height="512"><figcaption>Portrait of cat pipper2022 taking a nap. Oil on canvas by Avery Malcolm (2021). High quality. Dark and light contrast. Trending on artstation.</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Imaginary creatures]]></title><description><![CDATA[Created by GPT-3, Dall-e 2 and me]]></description><link>https://wingedsheep.com/imaginary-creatures/</link><guid isPermaLink="false">62ceb48d4213e1007cece90f</guid><category><![CDATA[AI Art]]></category><category><![CDATA[GPT-3]]></category><category><![CDATA[Dall-e]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Mon, 18 Jul 2022 06:47:45 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2022/07/Cover-3-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2022/07/Cover-3-1.jpg" alt="Imaginary creatures"><p></p><p>A collection of fantastic beasts and magical creatures in their natural environments. The descriptions of the creatures are generated using GPT-3 by giving it a list of imaginary creatures that I made up. The results are then given to Dall-e 2, to see how creative it is in turning imaginary creature names into pictures.<br><br>My part in this process was creating an initial list of imaginary creatures to use as examples f0r GPT-3, cherry picking the best pictures, and tweaking the creature descriptions where necessary.</p><p>Enjoy!</p><h2 id="klouzet">Klouzet</h2><p><br>The Klouzet is a creature that lives in forests and near rivers. It is a carnivore that hunts for fish, and uses its long tongue to groom its fur. It is the size of a large dog, and has bright green eyes. It has long pointy ears, and a thick fur that protects it from the cold. The fur is very rough, and has green stripes from front to back for better camouflage in the forest. In the early morning you can often find them near rivers, hunting for fish. It is a timid creature, and will flee if it senses danger. The Klouzet is an important creature in the forest ecosystem, as it helps to keep the fish population in check. Without the Klouzet, the fish would over populate and eventually deplete the resources in the river. During the winter, the Klouzet will hibernate in its burrow, and emerge in the spring when the fish begin to spawn.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Klouzet.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Klouzet.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Klouzet.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Klouzet.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Klouzet.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Klouzet&quot; sitting on a rock in the middle of a river. It is grooming its fur with its long tongue. It has bright green eyes, and is the size of a large dog.</figcaption></figure><h2 id="flotop">Flotop</h2><p><br>The Flotop is a creature that lives in hot and dry desert areas. It feeds on termites. It is the size of a small bird, and has a pink body and a long greenish tail. It has a pointy snout, like a bird&apos;s beak. The Flotop looks scary, but it is mostly harmless to humans. It is a very efficient flyer, because of its ultra lightweight body. It can fly for long periods of time without tiring. Its long tail can be used to get termites out of their mounds. Interestingly, the Flotop does not have any eyes. It uses its sense of smell to locate termite hills.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Flotop.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Flotop.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Flotop.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Flotop.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Flotop.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A flotop floating around a hot and dry desert area between the cacti. It is searching for termite hills to collect food. Flotops can survive in the heat, because they use very little energy.</figcaption></figure><h2 id="bortodont">Bortodont</h2><p><br>The Bortodont is a creature that lives in swamps. It is a slow moving creature that feeds on nuts, worms, and other insects. It is the size of an Ankylosaurus, and has a grayish body with large pointy brownish extensions coming out of its side. The extensions are flexible and can be used to help the Bortodont move through the mud. The Bortodont&apos;s back is very tough, and it has armour to protect it from predators. When it is threatened, it will raise its extensions to make itself look bigger and more intimidating.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Bortodont-2-super.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Bortodont-2-super.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Bortodont-2-super.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Bortodont-2-super.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Bortodont-2-super.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Bortodont&quot; slowly moving through a foggy swamp. There are tree trunks with mushrooms on it. Even though it is very heavy it does not sink in the mud. Bortodonts are not picky eaters.</figcaption></figure><h2 id="flisk">Flisk </h2><p><br>The Flisk is a creature that lives in underwater kelp forests. It looks like a seal with large mouse like ears. These ears serve as sonar, to help the Flisk find food. It is the size of a small seal, and has white fur with large mouse-like ears. It is a good swimmer and can stay under water for a long time. &#xA0;Flisks are very curious, and will even approach humans if it feels safe. A Flisk&apos;s diet consists mostly of kelp, but it will also eat small fish and invertebrates. Larger Flisks can even eat octopuses and squid.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Flisk-2---super.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Flisk-2---super.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Flisk-2---super.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Flisk-2---super.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Flisk-2---super.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;flisk&quot; swimming through a colourful underwater kelp forest. It is looking for food. Flisks are very good swimmers and can stay under water for a long time.</figcaption></figure><h2 id="grimalkin">Grimalkin</h2><p><br>The Grimalkin is a predatory cat that lives in the coldest parts of the world. It has black fur and green eyes. It is about a meter long, and has long claws that help it to stalk and kill its prey. The Grimalkin is a very stealthy hunter, and will often lie in wait for hours before attacking. Its favorite prey is the hare, but it will also eat other small mammals and birds. In the winter, the Grimalkin will often hunt in the snow, using its black fur to camouflage itself as a rock. Some people believe that the Grimalkin is a magical creature, because of its ability to disappear and reappear at will.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Grimalkin---super.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Grimalkin---super.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Grimalkin---super.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Grimalkin---super.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Grimalkin---super.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Grimalkin&quot; stalking through the snow, looking for a hare to hunt. It is about a meter long with black fur and green eyes. It has long claws, and is very stealthy.</figcaption></figure><h2 id="gronack">Gronack</h2><p><br>The Gronack is a gentle giant that lives in forests. It is very tall and has a long neck. It eats the leaves from the trees. To avoid being seen, they often stand very still amongst the trees. When they move, they are very graceful. Gronacks are very social creatures, and live in herds. Interestingly, Gronacks are born with stripes, which fade as they grow older.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Gronack.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Gronack.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Gronack.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Gronack.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a towering &quot;gronack&quot; standing in a forest. It is very tall and has a long neck. It is eating the leaves from the trees. Gronacks are gentle giants. The light is shining through the trees.</figcaption></figure><h2 id="draug">Draug<br></h2><p>The Draug is a bird that lives near the sea. It is a large raven like creature with black wings. It has red eyes, and can grow up to one and a half meters tall, with a wingspan of 3,5 meters. The Draug is a scavenger, and will eat anything it can find. It is also known to attack and kill small animals. The Draug is a feared creature, because of its size and its red eyes. Some people believe that the Draug is a demonic creature, because of its appearance.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Draug---super.jpeg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="2000" height="2000" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Draug---super.jpeg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Draug---super.jpeg 1000w, https://wingedsheep.com/content/images/size/w1600/2022/07/Draug---super.jpeg 1600w, https://wingedsheep.com/content/images/2022/07/Draug---super.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Draug&quot; standing on a cliff, overlooking the sea. It is a large creature, with grey fur and black wings. It has red eyes, and can grow very large.</figcaption></figure><h2 id="pryderi">Pryderi</h2><p><br>The Pryderi is a small mammal that lives in fields and grasslands. It is small and fast, and has bright red fur. It looks a bit like a small coyote, and has orange-brown fur with black spots, and large ears. It has very intense orange eyes. It feed most mostly on insects, mice and eggs. It is known for chasing butterflies. Pryderis grow up to 50 cm long, and are known to stay together with their siblings for their whole lives.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Pryderi.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Pryderi.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Pryderi.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Pryderi.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;pryderi&quot; running through a field of tall grass. It is small and fast, and it has bright red fur. It is chasing a butterfly.</figcaption></figure><h2 id="quillbeast">Quillbeast</h2><p><br>The quillbeast is a large creature that swims in oceans. It has a long body and tentacles. It is transparent, and eats plankton. It can swim very fast, and is often seen near tropical islands. They are harmless to humans, and are actually quite friendly. They often play by swimming in circles around each other.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Quillbeast-2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Quillbeast-2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Quillbeast-2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Quillbeast-2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a &quot;quillbeast&quot; swimming in an ocean. It is a large creature with a long body and tentacles. It is eating plankton. The water is crystal clear. In the distance is a tropical island.</figcaption></figure><h2 id="brollachan">Brollachan</h2><p><br>The Brollachan is a predatory creature that lurks in the shadows of dark forests. It has green eyes and long, sharp claws. It is muscular and stocky, with brown and grey stripes. The Brollachan is a cunning hunter. Its favorite prey is deer, but it will also eat other small mammals and birds. It is a feared creature, because of its size and its sharp claws. Sometimes the Brollachan will even attack humans.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Brollachan.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Brollachan.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Brollachan.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Brollachan.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;brollachan&quot; lurking in the shadows of a dark forest. It has green eyes and long sharp claws. It is waiting to ambush its prey.</figcaption></figure><h2 id="limnade">Limnade<br></h2><p>The limnade is a creature that lives in freshwater ponds and lakes. It has a long neck and an elegant body. The limnade is pink like a flamingo, but has a thin long beak, making it look very elegant. It feeds on algae and small fish. Limnades keep the water clear by eating algae.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Limnade-2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Limnade-2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Limnade-2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Limnade-2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;limnade&quot; floating in a pool of water. It has a long neck and an elegant body. It is very graceful and elegant.</figcaption></figure><h2 id="sundor">Sundor</h2><p><br>The Sundor is a nocturnal creature that hunts at night. It has bright red fur, and a long tail. It is the size of a fox, and has black stripes. Sundors are very shy creatures, and will only come out at night. During the daytime, they will sleep in their dens or bask in the sun. Sundors are skilled hunters, and will often hunt small rodents They are also known to eat fruits on occasion. To avoid being followed, they will often use their long tail to cover their tracks. Sun reflecting on their fur sometimes makes it look like they are on fire.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Sundor.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Sundor.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Sundor.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Sundor.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;sundor&quot; basking in the sun on a rock. It has bright red fur, and a long tail.Sundors are only active at night, when they go out to hunt.</figcaption></figure><h2 id="orox">Orox</h2><p><br>The Orox is a small mammal that lives in fields and grasslands. It is shy and will run away if it sees you. It is the size of a small goat, and has a pointy beak, small straight horns, and large ears. It is colored like dry grass for camouflage, and has black stripes. The Orox is a herbivore, and feeds on leaves and grass. It is a very fast runner, and can reach speeds of up to 60 km/h. When it is threatened, it will often use its speed to escape.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Orox-2-1.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Orox-2-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Orox-2-1.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Orox-2-1.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>An &quot;orox&quot; standing in a field of tall grass. It is very well camouflaged. Oroxes are very shy creatures, and will run away if they see you.</figcaption></figure><h2 id="snorble">Snorble</h2><p><br>The Snorble is a small mammal that lives in meadows and forests. It is very fluffy, and has a long snout. It is covered in short fur that can appear to have multiple colours. The Snorble is a timid creature, and will often flee if it senses danger. It is a good jumper, and can leap up to 2 meters high. The Snorble is a herbivore, and feeds on leaves, flowers and fruits. It is also known to eat insects on occasion. Snorbles are very social creatures, and live in large families. They are known for their friendly personalities and their love of napping in sunbeams.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Snorble.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Snorble.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Snorble.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Snorble.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;snorble&quot; taking a nap in a sunbeam in a meadow. Snorbles are very fluffy and have a long snout. They are covered in short fur that can appear to have multiple colours.</figcaption></figure><h2 id="cranat">Cranat</h2><p><br>The Cranat is a bird that lives near rivers and wetlands. It has red and orange feathers. It is the size of a crane, and has long wings that help it to fly. The Cranat is a skilled hunter, and will catch insects in its long beak. It is also known to eat small fish and amphibians. Some people believe that the Cranat is a sacred creature, because of its beautiful feathers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Cranat.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Cranat.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Cranat.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Cranat.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;cranat&quot; flying through the sky, catching insects in its long beak. In the background is a long winding river rolling through grassy hills. Cranats have red and orange feathers, and a crest on their head.</figcaption></figure><h2 id="trog">Trog</h2><p><br>The Trog is a large, muscular creature that lives in dark caves. It has a very good sense of smell and can find its way in the dark. Trogs are very strong and can lift heavy rocks. They are also very fast and agile. Trogs are omnivores, and will eat anything they can find. Their favorite food is cave fish, but they will also eat insects, rodents, and even other Trogs. They are known to be very territorial, and will fight to the death to defend their cave.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Trog-1.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Trog-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Trog-1.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Trog-1.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;trog&quot; walking through a dark cave. It has a very good sense of smell and can find its way in the dark. Trogs are very strong and can lift heavy rocks.</figcaption></figure><h2 id="mosslits">Mosslits</h2><p><br>Mosslits are small snail like creatures that live in forests. They light up in the dark so they can help each other to find food. Their long tails have a light sensing organ at the end, which helps them to find their way around. Mosslits are herbivores, and their favorite food is leaves. They will also eat other plant matter, such as fruits and flowers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Mosslits-1.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Mosslits-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Mosslits-1.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Mosslits-1.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>Bioluminescent &quot;mosslits&quot; clinging to the branches of a tree in a dark forest. They are eating the tree&apos;s leaves. Mosslits are small and have a long tail.</figcaption></figure><h2 id="jebble">Jebble</h2><p><br>The Jebble is a creature that lives on mountain tops. It is the same color as the sky, so it is very hard to see when it is not moving. It is the size of a large rabbit, and has blue-gray fur. The Jebble is a herbivore, and feeds on grass and other plants. Jebbles will often roll in the snow to cool down.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Jebble.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Jebble.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Jebble.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Jebble.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;jebble&quot; sitting on a mountain top, surrounded by clouds. It is impossible to see jebbles when they are not moving, because they are the same colour as the sky.</figcaption></figure><h2 id="glim">Glim<br></h2><p>The Glim is a small creature that lives in cities. It is attracted to light, and can often be seen running around at night. It has brightly coloured fur, and is the size of a rat. Glims are known for rummaging through trash cans in search of food. They are also known to eat insects. Glims are not harmful to humans, but they can be a nuisance.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Glim3.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Glim3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Glim3.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Glim3.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;glim&quot; running around a city at night. It is looking for food in the trash cans. Glims are small and have brightly coloured fur. They are attracted to light.</figcaption></figure><h2 id="direhorn">Direhorn</h2><p><br>Direhorns are very large and dangerous creatures that live in the mountains. They have two long horns and sharp teeth. They are the size of a large bull, and can weigh up to 1,000 kg. Direhorns are very aggressive, and will often charge at anything that they perceive as a threat. They often attack and kill smaller animals but will also eat plants. Direhorns are a danger to humans, and should be avoided if possible.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Direhorns.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Direhorns.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Direhorns.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Direhorns.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>&quot;Direhorns&quot;. Very large and dangerous creatures. They have two long horns and sharp teeth. They live in the mountains and eat anything they can find.</figcaption></figure><h2 id="toximander">Toximander</h2><p><br>The Toximander is a lizard that lives in the jungle. It is brightly colored with green and yellow stripes. It is a good climber, and often eats fruit high up in the trees. The name of the toximander comes from the Latin word &quot;toxicus&quot;, meaning poisoned. This is because the toximander is poisonous to touch. If you see one, it is best to leave it alone.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Toximander.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Toximander.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Toximander.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Toximander.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;toximander&quot; sitting in a tree in a jungle, eating fruit. It has bright green and yellow stripes. Toximanders are very good climbers.</figcaption></figure><h2 id="qulith">Qu&apos;lith</h2><p><br>The qu&apos;lith is a predatory creature that lives in the desert. It has brown and grey fur, and a forked tongue. It is the size of a small cat, and has two thin, pointy ears. The qu&apos;lith is a fast creature, and has sharp claws. It will often lie in wait for prey, and then pounce on it. Its favorite prey is lizards, but it will also eat small mammals and birds. It can survive without water for long periods of time, because it gets moisture from the prey it eats.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Qulith.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Qulith.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Qulith.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Qulith.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;qu&apos;lith&quot; perched on a rock in a desert. It is waiting for prey to come close so it can pounce on it. Qu&apos;liths are very fast and have sharp claws.</figcaption></figure><h2 id="glonk">Glonk</h2><p><br>The Glonk is a creature that lives in jungles. It is very large, and its skin is tough and scaly. It has a long tail and a short snout. It is a herbivore, and feeds on fruit. Glonks are very shy creatures, and will often stay in the trees to avoid being seen. If they are threatened, they will use their sharp claws to defend themselves. Ever since they were discovered, Glonks have been hunted for their skin, which is used to make leather. Only small populations of Glonks can still be found, hidden far in the jungle.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Glonk.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Glonk.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Glonk.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Glonk.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;glonk&quot; sitting in a tree in a jungle, eating fruit. Glonks are very large, and their skin is tough and scaly. They have a long tail and a short snout.</figcaption></figure><h2 id="yellow-lanternfish">Yellow lanternfish <br></h2><p>The yellow lantern fish is a small fish that lives in the deep ocean. Unlike its scary cousin that lures fish with its light, this variant is peaceful and uses its light to communicate with other lantern fish. It can also produce different light patterns to camouflage itself from predators. It is a yellow fish with a light on its chin, and has large eyes. It is related to the angler fish. The lantern fish is a very social creature, and often congregates in large groups.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Lantern-fish.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Lantern-fish.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Lantern-fish.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Lantern-fish.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;lantern fish&quot; swimming in the deep ocean. It is surrounded by other fish, but is not afraid because it can produce its own light. Lantern fish are very good at camouflage.</figcaption></figure><h2 id="treestrider">Treestrider</h2><p><br>The Treestrider is a creature that lives on small islands in the middle of the ocean. It is a herbivore that eats the leaves of trees. It can grow up to five meters tall, and has long, thin legs. It can use its long legs to walk across the water to other islands through shallow water. Even though it is a gentle creature, the Treestrider is sometimes feared because of its size.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Treestrider4.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Treestrider4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Treestrider4.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Treestrider4.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>An island &quot;treestrider&quot; walking through the jungle on its long, thin legs. It is eating the leaves of the trees as it goes.</figcaption></figure><h2 id="balloonbug">Balloonbug</h2><p><br>The Balloonbug is a small insect that can inflate itself like a hot air balloon. It is red-orange in color. The Balloonbug is not very fast, but it can stay in the air for long periods of time. It feeds on small mosquitos. When it is full, it will deflate itself and fall to the ground. It will then crawl back to its nest. Pregnant females will sometimes inflate themselves and float away to find a new home.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Balloonbug4.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Balloonbug4.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Balloonbug4.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Balloonbug4.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a &quot;balloonbug&quot; floating through a meadow. It is a red-orange colored insect that floats by inflating it&apos;s backside like a hot air balloon. It has black spots. There are tall grasses around it.</figcaption></figure><h2 id="tundran">Tundran</h2><p><br>The Tundran is a huge mammal that roams the coldest parts of the world. The Tundran is a massive creature, reaching up to 4 meters in height and weighing over 2 tonnes. The Tundran&apos;s fur is thick and white, insulating it from the cold weather. It has two large, curved horns, which are used to dig through the snow in search of food. Tundrans are very gentle creatures. The Tundran is a sacred creature in many cultures. In Inuit mythology, the Tundran is the spirit of a lost child, who roams the world looking for its mother. The Tundran is also considered to be a bringer of good luck in many cultures.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Tundran.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Tundran.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Tundran.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Tundran.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>Huge &quot;tundran&quot; roaming the coldest parts of the world. They have thick fur and long horns. They are very friendly and love to play.</figcaption></figure><h2 id="luzak">Luzak</h2><p><br>The Luzak is a wolf-like creature that lives in forests and mountains. It is a good climber, and can climb almost any surface. It is the size of a wolf, and has dark gray fur with some blue in it. Like wolves, Luzaks are known to howl at the moon. Unlike wolves, however, Luzaks are solitary creatures, and will only come together to mate. They are very good hunters, and will often hunt small mammals and birds. They are not commonly seen, and are considered to be very rare.The Luzak is a member of the canidae family, which includes dogs, wolves, and foxes. It is related to the maned wolf. They are the only known species of canid to have blue fur.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/DALL-E-2022-07-18-11.54.26---Beautiful-and-detailed-digital-art-of-an-animal-called-a-_luzak_-standing-on-a-hill-in-the-rain--looking-out-over-the-valley-below.-Luzaks-are-very-go-1.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/DALL-E-2022-07-18-11.54.26---Beautiful-and-detailed-digital-art-of-an-animal-called-a-_luzak_-standing-on-a-hill-in-the-rain--looking-out-over-the-valley-below.-Luzaks-are-very-go-1.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/DALL-E-2022-07-18-11.54.26---Beautiful-and-detailed-digital-art-of-an-animal-called-a-_luzak_-standing-on-a-hill-in-the-rain--looking-out-over-the-valley-below.-Luzaks-are-very-go-1.jpg 1000w, https://wingedsheep.com/content/images/2022/07/DALL-E-2022-07-18-11.54.26---Beautiful-and-detailed-digital-art-of-an-animal-called-a-_luzak_-standing-on-a-hill-in-the-rain--looking-out-over-the-valley-below.-Luzaks-are-very-go-1.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;luzak&quot; standing on a hill in the rain, looking out over the valley below. Luzaks are very good climbers and can climb almost any surface.</figcaption></figure><h2 id="mboro">M&apos;boro</h2><p><br>The m&apos;boro is a large monkey that lives in the rainforest. It has orange and yellow fur, and a long tail. They are good climbers, and will often eat fruits and insects. M&apos;boros are not dangerous to humans, but they can be aggressive if they feel threatened. M&apos;boros are native to the rainforests and require a lot of space to move around. They have a diet that includes both fruits and insects. Oftentimes, groups of m&apos;boros will work together to find food. The m&apos;boro&apos;s loud calls can often be heard throughout the forest.M&apos;boros communicate with each other using a variety of sounds, including screams, grunts, and barks. They also use their tails to communicate, by waving them back and forth.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Mboro.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Mboro.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Mboro.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Mboro.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;mboro&quot; is sitting next to a tree in the rainforest. It is eating a banana. Mboros are very large, and have orange and yellow fur. They have a long tail and a short trunk.</figcaption></figure><h2 id="gleep">Gleep</h2><p><br>The Gleep (Gliphus fastus) is a small mammal in the family Gliphus, that lives in grasslands. The adult Gleep can grow to the size of a large rat. They have a thick coat of fur that is gray in color, with black stripes running along their back. Their belly is a blue color, and they have a long, fuzzy tail. Gleeps have large ears which they use to listen for predators and prey. They are very curious and like to explore their surroundings. Gleeps are also very good at running and jumping. They are often kept as pets because of their playful and friendly nature.The Gleep is a herbivore, and feeds on grasses and other plants. They are active during the day, and sleep in burrows at night. Gleeps live in small family groups, and are very social animals. They are also known to be very good swimmers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Gleep.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Gleep.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Gleep.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Gleep.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a &quot;gleep&quot; running through a field of tall grass. Gleeps are small and fast animals. They are very curious and like to explore their surroundings.</figcaption></figure><h2 id="imag">Imag<br></h2><p>The &quot;Imag&quot; is a large cat that lives in grasslands. It has a short fur that is yellowish-brown in color and patterned with black stripes and a white chest. It is a skilled hunter, able to stand perfectly still and blend in with its surroundings &#x2013; making it difficult for prey to spot it. The Imag&#x2019;s diet consists mainly of small animals such as rodents and birds. Females give birth to litters of up to four kittens, which they raise on their own. Interestingly, the Imag is one of the few large cats that does not roar &#x2013; instead, it makes a vocalization known as a &#x201C;chuff&#x201D;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Imag3.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Imag3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Imag3.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Imag3.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>An &quot;Imag&quot; standing in a field of tall grass. It is very still, and blends in with the grass. It is waiting for prey to come close enough to catch. The sun is setting, and the sky is orange.</figcaption></figure><h2 id="lumander">Lumander</h2><p><br>The lumander is a species of salamander found in humid forests. It is notable for its luminescent properties, which give it a pale blue-green appearance. The lumander is also notable for its antlers, which are used to attract mates. The lumander is a nocturnal creature, and is most active during the night. It is an ambush predator, and will often lie in wait for its prey. When an unsuspecting victim comes close, the lumander will lunge out and grab it. The lumander is a relatively small salamander, measuring only about 10 centimeters in length. It is believed to have a lifespan of around 10 years.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Lumander-2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Lumander-2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Lumander-2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Lumander-2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Lumander&quot; is crawling through a dark forest. It is eating the insects that it finds. The luminous salamander has two long antennae and glows in the dark. There are trees with moss on them, and brown leaves on the ground, and some fireflies.</figcaption></figure><h2 id="foost">Foost</h2><p><br>The foost (also known as the arctic komodo) is a large white lizard-like creature that inhabits the arctic regions. It is closely related to the komodo dragon, and is thought to be its white cousin. The foost is a solitary creature, and is rarely seen by humans. It is a scavenger, and feeds on carrion and seals. The foost is a massive creature, growing up to 3 metres (10 feet) in length. It has a large head with a big mouth, and sharp teeth. It has a long body, and short legs. The foost is covered in white fur, which helps it blend in with its snowy surroundings. It is the only reptile known to live in the arctic.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Foost.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Foost.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Foost.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Foost.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Foost&quot; walking through a blizzard. It lives in ice cold environments, such as the tundra or glaciers.</figcaption></figure><h2 id="screeper">Screeper</h2><p><br>A screeper is a type of spider that produces very thick, rope-like webbing. They are typically found in dark places, such as caves or under rocks. Caves and other dark places provide the perfect habitat for these spiders, as they are protected from the sun and other predators. The webbing of the screeper is unusally thick, because it is used to catch large prey. The thick webbing is also used to create cocoons in which the spider can lay its eggs. When the eggs hatch, the young spiders will climb to the top of the cave or rock, where they will begin to build their own webs.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Screeper-2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Screeper-2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Screeper-2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Screeper-2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a &quot;Screeper&quot; hiding in a dark wet cave. There are stalactites and stalagmites in the cave and some webbing.</figcaption></figure><h2 id="tromb">Tromb<br></h2><p>The &quot;Tromb&quot; is a creature that lives near large bodies of water. It has an extension on its head that can be rolled out, like the tongue of a frog, to catch fish. Because of this it does not need to enter the water to hunt, and can often be found perched atop rocks near the shoreline. It is a shy creature and will often hide in the shadows when humans are near. The Tromb is also known to sing a beautiful, haunting song that can be heard for miles around.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Tromb2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Tromb2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Tromb2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Tromb2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;tromb&quot; sitting on a cliff by the ocean. It is waiting for prey to swim by so it can dive in and catch it. Trombs are very good swimmers and have razor sharp teeth. The water is a deep blue, and there are some rocks in the background.</figcaption></figure><h2 id="fosha">Fosha</h2><p><br>The Fosha is a small, blue-furred creature found in forests. It is a peaceful creature, and is often seen looking up at the stars. It has long ears, and is fox-like in appearance. It eats mainly berries and insects. They live in dens made from sticks and leaves, and line them with soft grasses.Fosha mate for life, and often have large families. Despite their gentle nature, Fosha are fierce protectors of their family. They will fight fiercely if they or their loved ones are threatened.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Fosha2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Fosha2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Fosha2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Fosha2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;Fosha&quot; looking at the stars in the forest. It is a very peaceful creature. It has bright blue fur, and long ears. The leaves of the trees are rustling in the wind.</figcaption></figure><h2 id="hundle">Hundle</h2><p><br>Hundles live in the mountains. They are hunters with a thick fur that protects them from the cold. When hundles have cubs they often have to leave them alone for long stretches of time to hunt. Since hundle cubs are helpless this is a dangerous time for them.Hundles are very good at tracking and finding prey. They are also very good at climbing using their claws. If a hundle is threatened they will usually try to run away but if they are backed into a corner they will fight back with their claws and teeth. After a hundle eats they will often curl up into a ball to sleep for a long time.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Hundle2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Hundle2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Hundle2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Hundle2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>a &quot;Hundle&quot; walking on a snow-covered mountain. They have thick fur that keeps them warm in the cold. Hundles are very social creatures and live in large groups.</figcaption></figure><h2 id="osk">Osk</h2><p><br>The &quot;Osk&quot; is a very tall standing bird that can grow up to 3 meters in height. Because it only has small wings it cannot fly. It has a golden color with a blue &quot;collar&quot; around its neck. They live in dry grasslands. An osk can run up to 70 kilometers per hour. Fruits and small animals are their primary food source, but they will also eat insects, lizards, and rodents. They have a large extension on their head that is used to defend themselves and impress potential mates. This extension amplifies their calls, which can be heard up to 5 kilometers away.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Osk.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Osk.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Osk.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Osk.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>An &quot;osk&quot; standing on a hill in the sunset, looking out over the plains. Osk use their long necks to see far into the distance. They are very alert and will warn the others if they see danger coming.</figcaption></figure><h2 id="waterwyrm">Waterwyrm</h2><p><br>The waterwyrm is a giant snake-like creature that is said to live in the oceans. It is said to be as large as a whale, and to have a body that is covered in scales. The waterwyrm is said to be a fearsome predator, and to be able to kill and eat any creature that it comes across. The largest waterwyrm ever recorded was said to be over 30 meters long, and was said to have been killed by a group of fishermen in the early 1900s.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Waterwyrm2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Waterwyrm2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Waterwyrm2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Waterwyrm2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A &quot;waterwyrm&quot; swimming in the ocean. It is a large creature with a long body and a snake-like head.</figcaption></figure><h2 id="yclyndar">Yclyndar</h2><p><br>The Yclyndar is a large predatory bird with purple feathers. It is found in high mountain ranges. It has a long, curved beak and sharp talons. It is an agile flier and can reach speeds of up to 60 miles per hour. The Yclyndar feeds on other birds and small mammals. It has excellent eyesight and can see small prey from up to a mile away. It nests in caves or on ledges. Its plumage is highly prized by collectors.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Yclyndar3.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Yclyndar3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Yclyndar3.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Yclyndar3.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>An &quot;Yclyndar&quot; flying through the sky, chasing a flock of birds. It has blue and purple feathers, and is very fast. Yclyndars are predatory birds that live in mountain ranges. In the background are snow-capped mountains.</figcaption></figure><h2 id="alwari">Alwari</h2><p><br>The Alwari is a very social creature, and is often seen in groups. It is a herbivore, and its diet consists mainly of plants and roots. It lives in dense forests where it can hide well. The Alwari is known for its intelligence, and is able to communicate with other members of its species using a complex system of grunts and body language. The Alwari is also known to be a very good swimmer, and is often seen swimming in rivers and lakes. The Alwari&apos;s horns are used for digging up food, but also for self defence and to intimidate rival Alwari.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Alwari2.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Alwari2.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Alwari2.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Alwari2.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A creature called &quot;Alwari&quot; in its natural environment.</figcaption></figure><h2 id="hydrofant">Hydrofant</h2><p><br>The Hydrofant is a large fish found in large freshwater lakes. It is called Hydrofant, because it can grow as large as an elephant. It is a very slow-moving fish and is not very agile, but it can use its large mouth to vacuum up smaller fish and crustaceans. It lays eggs which hatch into larvae. The larvae grow into adults in about two years. The larvae of the Hydrofant are very small and live in the water column. They feed on plankton and other small organisms. The Hydrofant can live for up to 20 years in the wild.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Hydrofant3.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Hydrofant3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Hydrofant3.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Hydrofant3.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A creature called &quot;Hydrofant&quot; in its natural environment.</figcaption></figure><h2 id="horned-furtoad">Horned furtoad</h2><p><br>The horned furtoad is a toad that lives in the rainforest. It is covered with a moss-like fur that is red-brown in color, and it has many extensions that look a bit like coral. The red extensions on its head are used by the males to attract a mate. The toad is nocturnal and spends most of its time hiding in trees or under rocks. It eats insects, spiders, and other small animals. When it is threatened, it can inflate its body to make itself look bigger and more intimidating. It can grow to about 15 cm in length.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Horned-furtoad3.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Horned-furtoad3.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Horned-furtoad3.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Horned-furtoad3.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A creature called &quot;Horned furtoad&quot; in its natural environment.</figcaption></figure><h2 id="chimawk">Chimawk</h2><p><br>The Chimawk ( blackbirdus magnificus) is a large bird found in cold forests in the northern hemisphere. It is easily distinguished by its black feathers and red head, as well as its large beak. The Chimawk is a non-flying bird, due to its small wings. It is a timid creature that usually lives in small groups of no more than 10. The Chimawk&apos;s diet consists mainly of small rodents, which it hunts, as well as berries.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2022/07/Chimawk5.jpg" class="kg-image" alt="Imaginary creatures" loading="lazy" width="1024" height="1024" srcset="https://wingedsheep.com/content/images/size/w600/2022/07/Chimawk5.jpg 600w, https://wingedsheep.com/content/images/size/w1000/2022/07/Chimawk5.jpg 1000w, https://wingedsheep.com/content/images/2022/07/Chimawk5.jpg 1024w" sizes="(min-width: 720px) 720px"><figcaption>A creature called &quot;Chimawk&quot; in its natural environment.</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[GPT-3 as a muse: generating lyrics]]></title><description><![CDATA[Using a finetuned version of GPT-3 to write lyrics in the preferred style.]]></description><link>https://wingedsheep.com/songwriting-with-gpt-3/</link><guid isPermaLink="false">625318874213e1007cece4e1</guid><category><![CDATA[Music Generation]]></category><category><![CDATA[GPT-3]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Fri, 22 Apr 2022 19:56:27 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2022/04/20220416_153018.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2022/04/20220416_153018.jpeg" alt="GPT-3 as a muse: generating lyrics"><p></p><h2 id="introduction">Introduction</h2><p><br>Ever since I started playing guitar some 10 years ago I dreamt of writing a song of my own someday that I can be proud of. Sometimes a nice melody or chord progression pops into my head, but somehow the lyrics that I write always feel a bit uninspired.</p><p>Then I joined a team for the <a href="https://wingedsheep.com/music-generation-creating-a-song-for-the-ai-song-contest-2021/">AI Song Contest in 2021</a>, and we wrote a complete song with the help of AI. We had a process of turning sci-fi stories into lyrics using GPT-3 prompting. This resulted in pretty bizarre, but very interesting lyrics. However I felt this method lacked a feeling of control. I wanted to be able to influence the style of the music, the mood and the topic the song was written about. So I continued the lyrics generation project.</p><p>In this blogpost I will explain different techniques I used to generate lyrics with the help of GPT-3.</p><ul><li>Generating lyrics using prompts</li><li>Generating lyrics using a finetuned GPT-3 model </li><li>Creating variations for existing lyrics</li><li>Conclusion.</li></ul><h2 id="generating-lyrics-using-prompts">Generating lyrics using prompts</h2><p><br>GPT-3 is created to finish a text given a certain input. These text inputs are also called prompts. The easiest way to use this model is to write a prompt that triggers the model into writing the text you want. For example, if you want the model to write a good joke, you could prompt it with the following text: &quot;A very funny joke:&quot;. Prompting works better when you give some examples of what you want first, so GPT-3 can use the pattern in your examples to figure out what you want to achieve.</p><p>I first prompted the model without giving it any examples, to write a song about following your dreams. Bold text is the prompt, and normal text is the output that GPT-3 generated.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">Write a song about the following subject: &quot;The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.&quot;
<br><br>
Lyrics:</span>
<br><br>
Don&apos;t be afraid of your dreams,<br>
Even if you&apos;re afraid of what they may represent.<br>
They can be seen as a place of potential growth and change.<br>
And I assure you, your dreams are still alive.<br>
You have the power to make them come true.<br>
<br>
So don&apos;t give up on your dreams,<br>
Even if they seem out of reach.<br>
Believe in yourself and you will see,<br>
That anything is possible.<br>
<br>
Just keep on dreaming,<br>
And never let go of your hope.<br>
For one day, your dreams will come true.<br>
    And you&apos;ll be everything you ever wanted to be.</div><!--kg-card-end: html--><p><br>The result is pretty much what I asked for, but it is very basic. There are no metaphors, and the subject is almost copied literally into the lyrics. But the cool thing is that GPT-3 understood that a song should consist of different verses.</p><p>To generate more lyrical results I tried adding some examples to the prompt, in the hope that this would make the lyrics a bit more poetic. This allows GPT-3 to mimic the structure of the examples in the generated text. The prompt with examples is structured as follows</p><pre><code class="language-text">description: example description 1
lyrics: example lyrics 1 
&lt;---&gt; 
description: example description 2
lyrics: example lyrics 2
&lt;---&gt; 
description: example description 3
lyrics: example lyrics 3
&lt;---&gt; 
description: description for the new song to be generated
lyrics:</code></pre><p>In between the examples I added a divider, to make it easier for the model to understand the structure I am looking for.</p><p>To make it easier to prepare the examples we can also use GPT-3 to generate descriptions of lyrics, by prompting it with the lyrics and asking it to describe them. An example:</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
On bended knee is no way to be free<br>
Lifting up an empty cup, I ask silently<br>
That all my destinations will accept the one that&apos;s me<br>
So I can breathe<br>
<br>
Circles they grow and they swallow people whole<br>
Half their lives they say goodnight to wives they&apos;ll never know<br>
Got a mind full of questions and a teacher in my soul<br>
And so it goes<br>
<br>
Don&apos;t come closer or I&apos;ll have to go<br>
Owning me like gravity are places that pull<br>
If ever there was someone to keep me at home<br>
It would be you<br>
<br>
Everyone I come across in cages they bought<br>
They think of me and my wandering but I&apos;m never what they thought<br>
Got my indignation but I&apos;m pure in all my thoughts<br>
I&apos;m alive<br>
<br>
Wind in my hair I feel part of everywhere<br>
Underneath my being is a road that disappeared<br>
Late at night I hear the trees they&apos;re singing with the dead<br>
Overhead<br>
<br>
Leave it to me as I find a way to be<br>
Consider me a satellite forever orbiting<br>
I knew all the rules but the rules did not know me<br>
Guaranteed<br>
<br>
What do the above lyrics mean to you? Explain some of the metaphors.<br><br>
</span>
The lyrics of this song are about a person who feels out of place in the world. They feel like they don&apos;t fit in with the society that they live in and that they don&apos;t really have a place to call home. The lyrics also express the idea of being free. The person singing the song wants to be free to explore the world and find their place in it. The lyrics also contain metaphors about life and the world. For example, the lyrics say that &quot;everyone I come across in cages they bought.&quot; This is a metaphor for the way that people are restricted by the rules and limitations of society.</div><!--kg-card-end: html--><p><br>The GPT-3 API has a temperature slider that controls how much randomness to allow. Temperature 0 means no randomness is allowed, and only the most probable characters are selected. A temperature of 1.0 is the highest and means a lot of randomness is allowed. This creates more interesting twists in the text, but also makes the texts more chaotic. The default value for temperature is 0.7. I found that increasing this value to 0.8 meant that the generated lyrics were a bit more interesting and poetic.</p><p>The following lyrics are created using the same prompt, but with three examples and a temperature value of 0.8 instead of 0.7. The examples are the songs </p><ul><li>Walk away by Franz Ferdinand</li><li>Guaranteed by Eddie Vedder</li><li>Universally Speaking by the Red Hot Chilli Peppers</li></ul><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
    (3 examples)<br>
&lt;---&gt;<br>
description:The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
    lyrics:</span><br><br>
Dreams are like stars<br>
You may never touch them<br>
But if you follow them<br>
They will lead you to your destiny<br>
<br>
And when it gets dark<br>
And you can&apos;t see your way<br>
Just hold on to the starlight<br>
And don&apos;t be afraid<br>
<br>
Your dreams are still alive<br>
And you have the power to make them come true<br>
Just believe in yourself<br>
And don&apos;t be afraid to follow your heart<br>
<br>
When the world is at its darkest<br>
And you feel like you can&apos;t go on<br>
Just hold on to the starlight<br>
And don&apos;t be afraid<br>
<br>
Your dreams are still alive<br>
And you have the power to make them come true<br>
Just believe in yourself<br>
And don&apos;t be afraid to follow your heart<br>
<br>
Dreams are like stars<br>
You may never touch them<br>
But if you follow them<br>
They will lead you to your destiny<br></div><!--kg-card-end: html--><p><br>For the next lyrics I added two more example songs and adjusted the temperature to 0.9, to make the lyrics even more imaginative. </p><p>The example songs added are:</p><ul><li>Sunsets for somebody else by Jack Johnson</li><li>The hardest part by Coldplay</li></ul><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
    (5 examples)<br>
&lt;---&gt;<br>
description:The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
    lyrics:</span><br><br>
Don&apos;t be afraid of your dreams<br>
Even if they&apos;re made of stone<br>
There&apos;s beauty in what they mean<br>
Even if they&apos;re not your own<br>
<br>
Your dreams are still alive<br>
Even if you don&apos;t believe<br>
You have the power to make them come true<br>
So don&apos;t be afraid to dream<br>
<br>
Don&apos;t be afraid of the dark<br>
Even if it seems so cold<br>
There&apos;s light in what it holds<br>
And you can find your way back home<br>
<br>
Your dreams are still alive<br>
Even if you don&apos;t believe<br>
You have the power to make them come true<br>
So don&apos;t be afraid to dream<br>
<br>
Don&apos;t be afraid to be different<br>
Even if it&apos;s not the norm<br>
It&apos;s okay to be unique<br>
And be proud of who you are<br>
<br>
Your dreams are still alive<br>
Even if you don&apos;t believe<br>
You have the power to make them come true<br>
So don&apos;t be afraid to dream<br>
<br>
Your dreams are still alive<br>
And you have the power to make them come true<br>
So don&apos;t be afraid to dream<br>
</div><!--kg-card-end: html--><p><br>It seems that GPT-3 understood the concept of verses now, and it even starts to rhyme a little. See the first verse where &quot;dream&quot; rhymes with &quot;mean&quot;, and &quot;stone&quot; rhymes with &quot;own&quot;.</p><p>There maximum length of prompt and output in the latest GPT-3 model is 4000 characters, and this prompt with output uses up a little over 2000 characters. So I will add two more examples to see if there is more improvement. </p><p>The songs added are:</p><ul><li>Stop this train by John Mayer</li><li>Dream catch me by Newton Faulkner</li></ul><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
    (7 examples)<br>
&lt;---&gt;<br>
description:The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
    lyrics:</span><br><br>
Dreams are like stars<br>
You may never touch them<br>
But if you follow them<br>
They will lead you to your destiny<br>
<br>
And when it gets dark<br>
And you can&apos;t see your way<br>
Just hold on to the light inside you<br>
And don&apos;t be afraid<br>
<br>
Don&apos;t be afraid<br>
To dream a little bigger, darling<br>
To shine a little brighter<br>
Don&apos;t be afraid<br>
To let your heart get broken<br>
You&apos;ll find happiness<br>
If you keep on dreaming<br>
<br>
Dreams are made for chasing<br>
So don&apos;t let them pass you by<br>
And when you&apos;re feeling lost<br>
Just hold on to the love you have inside<br>
And never give up<br>
<br>
Never give up<br>
On your dreams, no matter how impossible they seem<br>
Keep on believing<br>
And they will come true<br>
<br>
And when it gets dark<br>
And you can&apos;t see your way<br>
Just hold on to the light inside you<br>
And don&apos;t be afraid<br>
<br>
Don&apos;t be afraid<br>
To dream a little bigger, darling<br>
To shine a little brighter<br>
Don&apos;t be afraid<br>
To let your heart get broken<br>
You&apos;ll find happiness<br>
If you keep on dreaming<br>
<br>
Dreams are made for chasing<br>
So don&apos;t let them pass you by<br>
And when you&apos;re feeling lost<br>
Just hold on to the love you have inside<br>
And never give up<br>
<br>
Never give up<br>
On your dreams, no matter how impossible they seem<br>
Keep on believing<br>
And they will come true<br>
</div><!--kg-card-end: html--><p><br>Interestingly if you prompt GPT-3 to answer questions and add &quot;Let&apos;s think step by step&quot; the accuracy of the answers increases by a lot. </p><!--kg-card-begin: html--><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here&apos;s the leaderboard of prompts to add to GPT-3.<br>Can you guys come up with anything better? <a href="https://t.co/bGnBroMdR5?ref=wingedsheep.com">https://t.co/bGnBroMdR5</a> <a href="https://t.co/a3JCdUjlYu?ref=wingedsheep.com">pic.twitter.com/a3JCdUjlYu</a></p>&#x2014; Aran Komatsuzaki (@arankomatsuzaki) <a href="https://twitter.com/arankomatsuzaki/status/1529285884817707008?ref_src=twsrc%5Etfw&amp;ref=wingedsheep.com">May 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><!--kg-card-end: html--><p>We can do something similar by adding tags like [Verse], [Verse variation], [Chorus] and [Bridge] to the examples. This makes the model &quot;think&quot; of the structure of the song, because it has to add a tag before each part. An added benefit is that the tags give you more control over the structure of the generated song. If you want to add another verse you can simply add a [Verse variation] tag, and see what the generator fills in.</p><p>An example of a song generated with added tags.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
    (5 examples with added tags)<br>
&lt;---&gt;<br>
description:The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
    lyrics:</span><br><br>
[First verse]<br>
Don&apos;t be afraid of your dreams<br>
Even if they seem too wild<br>
There&apos;s something inside of them<br>
That&apos;s worth fighting for<br>
<br>
[Verse variation]<br>
And don&apos;t be afraid of the dark<br>
Even if it seems too vast<br>
There&apos;s something inside of it<br>
That&apos;s worth reaching for<br>
<br>
[Chorus]<br>
So hold on to your dreams<br>
And don&apos;t let go<br>
Believe in yourself<br>
And you&apos;ll make them come true<br>
<br>
[Verse variation]<br>
And don&apos;t be afraid of tomorrow<br>
Even if it seems too far<br>
There&apos;s something inside of it<br>
That&apos;s worth working for<br>
<br>
[Chorus]<br>
Just hold on to your dreams<br>
And don&apos;t let go<br>
Believe in yourself<br>
And you&apos;ll make them come true<br>
<br>
[Verse variation]<br>
And don&apos;t be afraid to be different<br>
Even if it makes you stand out<br>
There&apos;s something inside of you<br>
That&apos;s worth being proud<br>
<br>
[Chorus]<br>
Just hold on to your dreams<br>
And don&apos;t let go<br>
Believe in yourself<br>
And you&apos;ll make them come true<br>
</div><!--kg-card-end: html--><h2 id="generating-lyrics-using-a-finetuned-gpt-3-model">Generating lyrics using a finetuned GPT-3 model </h2><p><br>Another way to introduce more of the desired lyrical structure and poetic quality into the generated texts is to fine-tune a model using the <a href="https://beta.openai.com/docs/guides/fine-tuning?ref=wingedsheep.com">OpenAI API</a>.</p><p>An important decision is the structure of the data you want to fine-tune the model on. I wanted to have control over the output of the generated songs by providing a description, name and bio of an artist, a mood and a song title. Using this method you have a lot of control over the generated lyrics. In addition to control over the subject of the song, you can decide to generate songs in the style of a given artist, and decide if it should be a happy or a sad song. </p><p>In the documentation they recommend that you should provide at least 500 examples for a good quality fine-tuned model. It is a lot of work to write song descriptions and bio&apos;s for at least 500 songs, so I created a python script to generate some of the data for me. As input I would provide just the artist name, the song title and the lyrics. The python script would call the OpenAI api to append the json with an artist bio, mood and a description of the provided lyrics. This is done using just the GPT-3 davinci model and a simple prompt.</p><p>The prompt for generating the lyrical description is as follows:</p><pre><code class="language-text">{lyrics} 

How would you describe the meaning of the above lyrics? Describe some of the metaphors. </code></pre><p>The prompt for generating the artist bio&apos;s:</p><pre><code class="language-text">Write a short bio for {artist}. What is the spirit of their music, their genre, and how would you describe their personality?</code></pre><p>The prompt for describing the mood of the lyrics:</p><pre><code class="language-text">{lyrics}

What is the mood of the above lyrics?

The mood is</code></pre><p>An example of the output generated by this script. The &quot;bio&quot;, &quot;description&quot; and &quot;mood&quot; fields are filled using GPT-3.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">
    artist: Eddie Vedder,<br>
    title: Guaranteed,<br>
  lyrics: On bended knee is no way to be free<br>
Lifting up an empty cup, I ask silently<br>
That all my destinations will accept the one that&apos;s me<br>
So I can breathe<br>
<br>
Circles they grow and they swallow people whole<br>
Half their lives they say goodnight to wives they&apos;ll never know<br>
Got a mind full of questions and a teacher in my soul<br>
And so it goes<br>
<br>
Don&apos;t come closer or I&apos;ll have to go<br>
Owning me like gravity are places that pull<br>
If ever there was someone to keep me at home<br>
It would be you<br>
<br>
Everyone I come across in cages they bought<br>
They think of me and my wandering but I&apos;m never what they thought<br>
Got my indignation but I&apos;m pure in all my thoughts<br>
I&apos;m alive<br>
<br>
Wind in my hair I feel part of everywhere<br>
Underneath my being is a road that disappeared<br>
Late at night I hear the trees they&apos;re singing with the dead<br>
Overhead<br>
<br>
Leave it to me as I find a way to be<br>
Consider me a satellite forever orbiting<br>
I knew all the rules but the rules did not know me<br>
Guaranteed<br></span><br>
    Bio: Born December 23, 1964, in Evanston, Illinois, Eddie Vedder is a singer, songwriter, and musician who is best known as the lead vocalist and one of three guitarists for the alternative rock band Pearl Jam. He is also a member of the band Temple of the Dog, and has released three solo albums.<br>
    <br>
Vedder&apos;s music is often characterized as introspective and emotional, and his lyrics often deal with topics such as love, loss, and social and political injustice. He is known for his powerful vocal range and his passionate delivery. He is also known for his intense stage presence and for his intense dedication to his fans.<br><br>
Description: The lyrics of this song are about a person who feels out of place in the world. They feel like they don&apos;t fit in with the society that they live in and that they don&apos;t really have a place to call home. The lyrics also express the idea of being free. The person singing the song wants to be free to explore the world and find their place in it. The lyrics also contain metaphors about life and the world. For example, the lyrics say that &quot;everyone I come across in cages they bought.&quot; This is a metaphor for the way that people are restricted by the rules and limitations of society.<br><br>
Mood: The mood of the lyrics is hopeful and defiant. The speaker is asking for freedom, and they are determined to find their own way despite the obstacles in their life.
</div><!--kg-card-end: html--><p><br>Using descriptions like this for 500 songs I fine-tuned a GPT-3 Davinci model. The Davinci model is the largest and most capable of the <a href="https://beta.openai.com/docs/engines/gpt-3?ref=wingedsheep.com">GPT-3 models</a> available. The larger the model, the more emergent capabilities appear. For example, the smallest model can do things like parsing text, simple classification, address correction, coming up with keywords. Capabilities like summarizing text, finding out cause and effect, and creativity only appear in the larger models. Fine-tuning a model like that for 2 epochs took just a few minutes and cost around $20. </p><p>This is a subset of my fine-tuning file, containing 4 out of the 500 songs I used for the model. It should be in json lines format, which is one json per line. Note that \n\n###\n\n is used to indicate this is where the completion starts, and &lt;!&gt; is used to indicate the end of the lyrics. It can be used as a stop condition when generating lyrics.</p><pre><code class="language-jsonl">{&quot;prompt&quot;: &quot;artist: Black Keys\nbio: The Black Keys are an American rock band formed in Akron, Ohio, in 2001. The group consists of Dan Auerbach (guitar, vocals) and Patrick Carney (drums). The band&apos;s raw blues-rock sound draws heavily from Auerbach&apos;s guitar playing and Carney&apos;s minimalist drumming. Although they have been compared to other garage rock revivalists such as the White Stripes and the Strokes, the Black Keys have a more soulful and vintage sound.\ndescription: The lyrics are about someone offering to be a constant source of support and guidance for another person.\nmood: The mood is hopeful and reassuring\n\n###\n\n&quot;, &quot;completion&quot;: &quot; [Everlasting light]\n\nLet me be your everlasting light\nThe sun when there is none\nI&apos;m a shepherd for you\nAnd I&apos;ll guide you through\nLet me be your everlasting light\n\nLet me be your everlasting light\n(Shoo-shoo-shoo-wa)\nI&apos;ll hold and never scold\n(Shoo-shoo-shoo-wa)\nIn me you can confide\nWhen no one&apos;s by your side\nLet me be your everlasting light\n(Shoo-shoo-shoo-wa)\n\nOh baby, can&apos;t you see\nIt&apos;s shinin&apos; just for you\nLoneliness is over\nDark days are through\nThey&apos;re through\n(Shoo-shoo-shoo-shoo-shoo-shoo-shoo-wa)\n\nLet me be your everlasting light\n(Shoo-shoo-shoo-wa)\nA train goin&apos; &apos;way from pain\n(Shoo-shoo-shoo-wa)\nLove is the coal\nThat makes this train roll\nLet me be your everlasting light\nYeah\n\nLet me be your everlasting light\nLet me be your everlasting light\nLet me be your everlasting light\nOhh...&lt;!&gt;&quot;}
{&quot;prompt&quot;: &quot;artist: Arctic Monkeys\nbio: Arctic Monkeys is an English rock band formed in Sheffield in 2002. The group consists of Alex Turner, Matt Helders, and Nick O&apos;Malley. The band&apos;s debut album, Whatever People Say I Am, That&apos;s What I&apos;m Not, was released in 2006 and became the fastest-selling debut album by a band in UK chart history. The band&apos;s second album, Favourite Worst Nightmare, was released in 2007. The band&apos;s third album, Humbug, was released in 2009. The band&apos;s fourth album, Suck It and See, was released in 2011. The band&apos;s fifth album, AM, was released in 2013. The band&apos;s sixth album, Tranquility Base Hotel &amp; Casino, was released in 2018.\ndescription: The lyrics of the song seem to be criticizing the pretentiousness of some people in the indie music scene. The singer is talking about how some people try to act like they are from San Francisco or New York City, when they are actually from much smaller towns. They also seem to be making fun of how some people in the scene try to act like they know everything about music, when they really don&apos;t.\nmood: The mood is one of disdain and mockery\n\n###\n\n&quot;, &quot;completion&quot;: &quot; [Fake tales of san francisco]\n\nFake Tales of San Francisco\nEcho through the room\nMore point to a wedding disco\nWithout a bride or groom\n\nThere&apos;s a super cool band yeah\nWith their trilbies and their glasses of white wine\nAnd all the weekend rock stars in the toilets\nPracticing their lines\n\nI don&apos;t want to hear you\n(Kick me out, kick me out)\nI don&apos;t want to hear you no\n(Kick me out, kick me out)\nI don&apos;t want to hear you\n(Kick me out, kick me out)\nI don&apos;t want to hear you\nI don&apos;t want to hear your\n\nFake Tales of San Francisco\nEcho through the air\nAnd there&apos;s a few bored faces at the back\nAll wishing they weren&apos;t there\n\nAnd as the microphone squeaks\nA young girl&apos;s telephone beeps\nYeah she&apos;s dashing for the exit\nOh, she&apos;s running to the streets outside\n\&quot;Oh you&apos;ve saved me,\&quot; she screams down the line\n\&quot;The band were fucking wank\nAnd I&apos;m not having a nice time\&quot;\n\nI don&apos;t want to hear you\n(Kick me out, kick me out)\nI don&apos;t want to hear you no\n(Kick me out, kick me out)\nYeah but his bird said it&apos;s amazing, though\nSo all that&apos;s left\nIs the proof that love&apos;s not only blind but deaf\n\nHe talks of San Francisco, he&apos;s from Hunter&apos;s Bar\nI don&apos;t quite know the distance\nBut I&apos;m sure that&apos;s far\nYeah, I&apos;m sure it&apos;s pretty far\n\nYeah, I&apos;d love to tell you all my problem\nYou&apos;re not from New York City, you&apos;re from Rotherham\nSo get off the bandwagon, and put down the handbook\nYeah, yeah, yeah, yeah, yeah\n\nGet off the bandwagon and put down the handbook\nGet off the bandwagon and put down the handbook\nGet off the bandwagon and put down the handbook\nGet off the bandwagon and put down the handbook, yeah&lt;!&gt;&quot;}
{&quot;prompt&quot;: &quot;artist: Coldplay\nbio: Coldplay is a British rock band formed in 1996 by lead vocalist and pianist Chris Martin and lead guitarist Jonny Buckland at University College London. After they formed under the name Pectoralz, Guy Berryman joined the group as a bassist and they changed their name to Starfish. Will Champion joined as a drummer and backing vocalist, completing the lineup. Coldplay achieved worldwide fame with the release of their single \&quot;Yellow,\&quot; followed by their debut album, Parachutes (2000), which was nominated for the Mercury Prize.\ndescription: The lyrics seem to be about wanting a simple, down-to-earth love, without any pretence or artifice. The speaker is tired of reading about mythical heroes with superhuman gifts, and instead wants something (and someone) more real and relatable.\nmood: The mood is romantic and longing\n\n###\n\n&quot;, &quot;completion&quot;: &quot; [Something like this]\n\nI&apos;ve been reading books of old\nThe legends and the myths\nAchilles and his gold\nHercules and his gifts\nSpiderman&apos;s control\nAnd Batman with his fists\nAnd clearly I don&apos;t see myself upon that list\n\nBut she said, \&quot;Where&apos;d you wanna go?\nHow much you wanna risk?\nI&apos;m not looking for somebody\nWith some superhuman gifts\nSome superhero\nSome fairytale bliss\nJust something I can turn to\nSomebody I can kiss\nI want something just like this\&quot;\n\nDoo-doo-doo, doo-doo-doo\nDoo-doo-doo, doo-doo\nDoo-doo-doo, doo-doo-doo\nOh, I want something just like this\nDoo-doo-doo, doo-doo-doo\nDoo-doo-doo, doo-doo\nDoo-doo-doo, doo-doo-doo\n\nOh, I want something just like this\nI want something just like this\n\nI&apos;ve been reading books of old\nThe legends and the myths\nThe testaments they told\nThe moon and its eclipse\nAnd Superman unrolls\nA suit before he lifts\nBut I&apos;m not the kind of person that it fits\n\nShe said, \&quot;Where&apos;d you wanna go?\nHow much you wanna risk?\nI&apos;m not looking for somebody\nWith some superhuman gifts\nSome superhero\nSome fairytale bliss\nJust something I can turn to\nSomebody I can miss\nI want something just like this\nI want something just like this\&quot;\n\nOh, I want something just like this\nDoo-doo-doo, doo-doo-doo\nDoo-doo-doo, doo-doo\nDoo-doo-doo, doo-doo-doo\nOh, I want something just like this\nDoo-doo-doo, doo-doo-doo\nDoo-doo-doo, doo-doo\nDoo-doo-doo, doo-doo-doo\n\nWhere&apos;d you wanna go?\nHow much you wanna risk?\nI&apos;m not looking for somebody\nWith some superhuman gifts\nSome superhero\nSome fairytale bliss\nJust something I can turn to\nSomebody I can kiss\nI want something just like this\n\nOh, I want something just like this\nOh, I want something just like this\nOh, I want something just like this&lt;!&gt;&quot;}
{&quot;prompt&quot;: &quot;artist: Counting crows\nbio: Counting Crows is an American rock band from Berkeley, California, formed in 1991. The band consists of Adam Duritz (lead vocals, piano), David Bryson (guitar), Charlie Gillingham (keyboards, piano, accordion), Dan Vickrey (guitar), David Immergl&#xFC;ck (guitar, banjo, mandolin), Matt Malley (bass) and Jim Bogios (drums). Counting Crows gained popularity following the release of their debut album, August and Everything After, in 1993. Their hit single, \&quot;Mr. Jones\&quot;, peaked at number five on the Billboard Hot 100. The band&apos;s influences include Van Morrison, R.E.M., Bob Dylan, and The Band.\n\nThe spirit of Counting Crows&apos; music is one of melancholy and introspection, with Duritz&apos;s lyrics often focusing on relationships and heartbreak. The band&apos;s musical style has been described as a mix of alternative rock, pop, folk, and country. Counting Crows&apos; personality has been described as laid-back and easy-going. The band is known for their live performances, which often feature extended jams and impromptu cover songs.\ndescription: The lyrics appear to be about a man who is planning to take a trip to Spain with a girl. He is leaving his old life behind him, and is looking forward to starting fresh in a new place. The lyrics could also be interpreted as being about a relationship that is coming to an end. The man is ready to move on, and is hoping to find someone new to start a new chapter with.\nmood: The mood is carefree and happy\n\n###\n\n&quot;, &quot;completion&quot;: &quot; [Holiday in spain]\n\nGot no place to go\nBut there&apos;s a girl waiting for me down in Mexico\nShe&apos;s got a bottle of tequila\nA bottle of gin\nAnd if I bring a little music I can fit right in\nWe&apos;ve got airplane rides\nWe&apos;ve got California drowning out the window side\nWe&apos;ve got big black cars\nAnd we&apos;ve got stories how we slept with all the movie stars\nI may take a holiday in Spain\nLeave my wings behind me\nDrink my worries down the drain\nAnd fly away to somewhere new\nHop on my choo-choo\nI&apos;ll be your engine driver in a bunny suit\nIf you dress me up in pink and white\nWe may be just a little fuzzy &apos;bout it later tonight\nShe&apos;s my angel\nShe&apos;s a little better than the one that used to be with me\n&apos;Cause she liked to scream at me\nMan, it&apos;s a miracle that she&apos;s not living up in a tree\nI may take a holiday in Spain\nLeave my wings behind me\nDrive this little girl insane\nAnd fly away to someone new\nEverybody&apos;s gone\nThey left the television screaming that the radio&apos;s on\nSomeone stole my shoes\nBut there&apos;s a couple of bananas and a bottle of booze\n\nOh well, Happy New Year&apos;s, baby\nWe could probably fix it if we clean it up all day\nOr we could simply pack our bags\nAnd catch a plane to Barcelona &apos;cause this city&apos;s a drag\nI may take a holiday in Spain\nLeave my wings behind me\nFlush my worries down the drain\nAnd fly away to somewhere new\nTake a holiday in Spain\nLeave my wings behind me\nDrive this little girl insane\nFly away to someone new\nFly away to someone new\nFly away to someone new&lt;!&gt;&quot;}
</code></pre><p>Let&apos;s see if the fine-tuned model is better at generating lyrics. Let&apos;s try generating lyrics in the style of a few different artists.</p><p>Because the model kept generating existing song title&apos;s for the artists, I created an extra prompt to generate these. The title generating prompt is very simple:</p><pre><code class="language-text">Come up with an original title for a song about following your dreams by {artist}.</code></pre><p>Below are some songs generated by prompting the fine-tuned model with different artists. I cherry picked the songs by generating up to 5 songs per prompt, and choosing my favourite.</p><hr><p>&quot;<strong>Chasing After Dreams</strong>&quot;, in the style of <strong>Jack Johnson</strong>.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
<span style="font-weight: 600">artist: Jack Johnson<br>
bio: Jack Johnson is a professional surfer turned musician. He is best known for his mellow acoustic music, which has been dubbed &quot;surf-rock.&quot; Johnson is a laid-back guy who likes to keep things simple. He is known for his eco-friendly lifestyle and his support of various charities.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
[Chasing After Dreams]<br>
    <br></span>
    
    Find your place amongst the stone<br>
And let it be your home<br>
Come and rest your weary bones<br>
The sky is waiting for your call<br>
<br>
Tiger lilies in the breeze<br>
Dance among the stars at night<br>
That&apos;s when all the children dream<br>
That they are something they are not<br>
<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
<br>
And I&apos;ll be there to catch you<br>
As the music starts to play<br>
It is time to fire up those dreams<br>
The world is waiting for your call<br>
<br>
In a city of stone and steel<br>
Love can be your home<br>
Let it flow to where you&apos;re sleeping<br>
And you don&apos;t have to go alone<br>
<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
<br>
And I&apos;ll be there to catch you<br>
As the music starts to play<br>
<br>
Dreams are dancing through the night<br>
We&apos;ve got time to dream our lives away<br>
<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
<br>
And I&apos;ll be there to catch you<br>
As the music starts to play<br></div><!--kg-card-end: html--><p>I liked these lyrics a lot, so I added some chords and recorded a simple version of the song.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/fhPq9Jd61XA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><hr><p>&quot;<strong>The ghost of you</strong>&quot;, in the style of the <strong>Red Hot Chili Peppers</strong>.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
    artist: Red Hot Chili Peppers<br>
bio: Formed in 1983, the Red Hot Chili Peppers are a funk rock band from Los Angeles, California. The band has achieved commercial success with their albums &quot;Mother&apos;s Milk&quot; (1989), &quot;Blood Sugar Sex Magik&quot; (1991), &quot;One Hot Minute&quot; (1995), &quot;Californication&quot; (1999), &quot;By the Way&quot; (2002), &quot;Stadium Arcadium&quot; (2006), and &quot;I&apos;m with You&quot; (2011). The band&apos;s music is marked by its funk-inspired style, as well as by Anthony Kiedis&apos; melodic vocals, John Frusciante&apos;s guitar solos, and Flea&apos;s basslines. The band is known for their energetic live performances and for drawing inspiration from a variety of musical styles.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
 [The Ghost of You]<br><br>
    </span>
    A hall of mirrors<br>
Chiseled from the will of stone<br>
You know the ghost of you<br>
Is always asking you to dance<br>
Begging you to come and play<br>
And the ghost of you<br>
Is the ghost of a dream<br>
Begging you to make it real<br>
<br>
Dreams are not afraid<br>
Of what they tell you<br>
Dreams are not afraid of what they say<br>
And the ghost of you<br>
Is the ghost of a dream<br>
That&apos;s as real as it can be<br>
<br>
You know the ghost of you&apos;s<br>
Surrounded by hungry wolves<br>
And even in the day<br>
When the wolves bust out the light<br>
You know the ghost of you<br>
Still wants to dance<br>
Still wants to play<br>
And the ghost of you<br>
Is the ghost of a dream<br>
Begging you to make it real<br>
<br>
Dreams are not afraid<br>
Of what they tell you<br>
Dreams are not afraid of what they say<br>
And the ghost of you<br>
Is the ghost of a dream<br>
That&apos;s as real as it can be<br>
<br>
I cut through the barbed wire<br>
That kept me from my heart<br>
And I showed you how brave I could be<br>
And it made me want to laugh<br>
The devil is a dictator<br>
And he knows that I&apos;m not pure<br>
And I do what his music tells me to do<br>
And I do it &apos;til it hurts<br>
I do it &apos;til it hurts<br>
<br>
Dreams are not afraid<br>
Of what they tell you<br>
Dreams are not afraid of what they say<br>
And the ghost of you<br>
Is the ghost of a dream<br>
That&apos;s as real as it can be<br>
That&apos;s as real as it can be<br>
That&apos;s as real as it can be<br>
</div><!--kg-card-end: html--><hr><p>&quot;<strong>Find your way</strong>&quot;, in the style of <strong>John Mayer</strong></p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: John Mayer<br>
bio: John Mayer is a singer-songwriter whose music is a blend of pop, rock, and blues. He has a laid-back, easygoing personality, and his music reflects this. His songs are often about love and relationships, and he is known for his guitar skills.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
        [Find your way]</span><br><br>
    They tell you not to touch the fire<br>
And you know that if you get too close<br><br>
There&apos;s just a chance you might get burned<br>
But you have to step in the water<br>
At least get your feet wet<br>
&apos;Cause you can&apos;t cross to the other side<br>
Unless you get your feet wet<br>
<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
<br>
They tell you that your mountains<br>
Are too high to climb<br>
And you shouldn&apos;t even try<br>
But you gotta find your way<br>
On your own anyway<br>
&apos;Cause there&apos;s no way to cross that river<br>
If you never try<br>
<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
<br>
They tell you not to jump the fences<br>
And you know that if you go too far<br>
You might get stretched upon the rails<br>
But you have to go where the train tracks lead<br>
&apos;Cause you can&apos;t cross to the other side<br>
Unless you get on the train<br>
<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
<br>
You can&apos;t live your life over<br>
And there&apos;s no way to re-write history<br>
But you can make your future now<br>
And you can dream your dreams come true<br>
<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br>
Dream on, dream on, dream on<br>
If it&apos;s too hard to sleep, then dream on<br></div><!--kg-card-end: html--><hr><p>&quot;<strong>Dreams of the remaining</strong>&quot;, in the style of <strong>Queens of the stoneage</strong></p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: Queens of the stoneage<br>
bio: Formed in 1996, Queens of the Stone Age is a rock band from Palm Desert, California, United States, formed by vocalist/guitarist Josh Homme. The band&apos;s line-up includes Homme, bassist Michael Shuman, guitarist Troy Van Leeuwen, and drummer Jon Theodore.
The band&apos;s sound has been described as stoner rock, hard rock, and heavy metal. Queens of the Stone Age is known for their heavy, riff-based sound, and their use of dynamic shifts in song structure and mood. The band&apos;s lyrics are often dark and cynical, dealing with topics such as drug addiction, violence, and betrayal.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
 [Dreams of the remaining]<br>
<br>
    </span>
    
In the jungle<br>
Where dreams breed<br>
There&apos;s a place where the soul takes a plunge<br>
Into the unknown<br>
Through the forest<br>
Where a heart can roam<br>
But the mind always knows<br>
<br>
To the desert<br>
Where the moon is high<br>
When the quiet comes<br>
And the wind blows<br>
To the sea<br>
Where the waters roll<br>
To the sky up above<br>
And the sea below<br>
<br>
And so the dreams<br>
That you have now<br>
May come true somehow<br>
In the dream<br>
Where you&apos;re yet to go<br>
And I know that it&apos;s so<br>
<br>
In the quiet<br>
Where the sun burns<br>
I&apos;m watching you, you&apos;re watching me<br>
In the dawning<br>
When the stars turn<br>
And it&apos;s darker still<br>
<br>
We&apos;re running, we&apos;re laughing<br>
We&apos;re crying, we&apos;re singing<br>
We&apos;re dancing, we&apos;re fighting<br>
We&apos;re living all the same<br>
<br>
And so the dreams<br>
That you have now<br>
May come true somehow<br>
In the dream<br>
Where you&apos;re yet to go<br>
And I know that it&apos;s so<br>
<br>
And the dreams of the remaining<br>
Are still alive<br>
And they&apos;ve got the power<br>
To make them come true<br>
Oh and they&apos;re alive<br>
They&apos;ve got the power<br>
To make them come true<br>
Oh and they&apos;re alive<br>
They&apos;ve got the power<br>
To make them come true<br>
<br>
The dreams of the remaining<br>
Are still alive<br>
And they&apos;ve got the power<br>
To make them come true<br>
Oh and they&apos;re alive<br>
They&apos;ve got the power<br>
To make them come true<br>
Oh and they&apos;re alive<br>
They&apos;ve got the power<br>
To make them come true<br>
</div><!--kg-card-end: html--><hr><p>&quot;<strong>Clouds on the horizon</strong>&quot;, in the style of <strong>Franz Ferdinand</strong></p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: Franz Ferdinand<br>
bio: Franz Ferdinand are a Scottish rock band formed in 2002. The band&apos;s original lineup was composed of Alex Kapranos, Nick McCarthy, Bob Hardy, and Paul Thomson.
The band&apos;s music is often described as a mix of post-punk and indie rock, with influences ranging from new wave to disco. The band&apos;s persona is one of cool detachment, and their lyrics often deal with themes of love and loss.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
 [Clouds on the Horizon]<br>
    </span><br>
    
You&apos;d better be dreaming of trees<br>
They are standing and growing<br>
If you believe in all you see<br>
While you&apos;re still half asleep<br>
<br>
Clouds on the horizon<br>
Dreams on the wind<br>
Clouds on the horizon<br>
Dreams on the wind<br>
<br>
Fear of what you see<br>
If you&apos;re afraid of what they mean<br>
You can change them again<br><br>
You won&apos;t even notice when<br>
<br>
Clouds on the horizon<br>
Dreams on the wind<br>
Clouds on the horizon<br>
Dreams on the wind<br>
<br>
You&apos;re not going nowhere<br>
<br>
Glitter, glamour and gold<br>
They are all around you<br>
If you lie that you own it<br>
You will only ever own nothing<br>
<br>
Clouds on the horizon<br>
Dreams on the wind<br>
Clouds on the horizon<br>
Dreams on the wind<br>
<br>
You&apos;re not going nowhere<br>
You are still on the same road<br>
You are not going nowhere<br>
You are still on the same road<br>
You&apos;re not going nowhere<br>
</div><!--kg-card-end: html--><hr><p>&quot;<strong>Chasing the sun</strong>&quot;, in the style of <strong>Muse</strong>.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: Muse<br>
bio: Muse is an English rock band from Teignmouth, Devon, formed in 1994. The band consists of Matt Bellamy (lead vocals, guitar, piano), Chris Wolstenholme (bass guitar, backing vocals, keyboards) and Dominic Howard (drums). Muse&apos;s music is characterized by Matt Bellamy&apos;s operatic vocal style, as well as the band&apos;s use of experimental instrumentation and elaborate stage shows. Their personality could be described as ambitious, confident, and innovative.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
[Chasing the sun]<br>
    </span><br>
    If I could dream at all, I&apos;d dream of you<br>
And in my sleep I&apos;d hear you whisper near<br>
And the words you&apos;d speak to me, oh they&apos;d all be true<br>
Everytime I dream I dream of you<br>
<br>
I won&apos;t be afraid to close my eyes tonight<br>
For you sing to me in darkness, oh and light<br>
With you I know I will be safe tonight<br>
It&apos;s only darkness I can see<br>
<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
<br>
The stars are turning red<br>
The shadows start to fall<br>
Oh, I could dream of you and wake believing<br>
That in all the world you&apos;d care enough to come<br>
Dreaming, dreaming, all the while<br>
<br>
I won&apos;t be afraid to close my eyes tonight<br>
For you sing to me in darkness, oh and light<br>
With you I know I will be safe tonight<br>
It&apos;s only darkness I can see<br>
<br>
The night is falling<br>
Faster than you know<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
It&apos;s chasing the sun<br>
<br>
I won&apos;t be afraid to close my eyes tonight<br>
For you sing to me in darkness, oh and light<br>
With you I know I will be safe tonight<br>
It&apos;s only darkness I can see<br>
<br>
I won&apos;t be afraid to close my eyes tonight<br>
For you sing to me in darkness, oh and light<br>
With you I know I will be safe tonight<br>
It&apos;s only darkness I can see<br>
</div><!--kg-card-end: html--><hr><p>&quot;<strong>A whirlwind of dreams</strong>&quot;, in the style of <strong>Coldplay</strong></p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">artist: Coldplay<br>
bio: Coldplay is an English rock band formed in London in 1997. The band consists of Chris Martin (lead vocals, piano, guitar), Jonny Buckland (lead guitar), Guy Berryman (bass guitar), and Will Champion (drums, backing vocals, percussion).
Coldplay&apos;s music has been described as alternative rock, post-Britpop, and pop rock. The band&apos;s debut album, Parachutes, released in 2000, was met with critical acclaim. The band won a Brit Award for Best British Group in 2002. Coldplay has released seven studio albums in total; their latest album, A Head Full of Dreams, was released in December 2015.
The band&apos;s music is often characterized by its ethereal atmospheres and emotive lyrics, which have been compared to those of Radiohead. The band&apos;s frontman, Chris Martin, has been called &quot;the last great romantic&quot; in British music.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
 [A Whirlwind of Dreams]<br>
    </span><br>
    From me to you<br>
Everywhere on the breeze<br>
Wherever you may be<br>
You&apos;ll know exactly what to do<br>
<br>
When my eyes are closed<br>
And all my dreams are dead and gone<br>
Then maybe you will find<br>
Out where I&apos;ve been<br>
<br>
So, I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
<br>
From you to me<br>
Oh, what a beautiful place<br>
Wherever you may go<br>
You will never be alone<br>
<br>
Cause wherever you go<br>
And wherever you may be<br>
You&apos;ve got a dream or two<br>
That&apos;s always alive<br>
<br>
So, I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
<br>
I&apos;ve been there all along...<br>
<br>
Sometimes we&apos;re afraid<br>
When we know what we want<br>
Sometimes we&apos;re afraid of our dreams<br>
<br>
From me to you<br>
Everywhere on the breeze<br>
Wherever you may be<br>
You&apos;ll know exactly what to do<br>
<br>
From you to me<br>
Oh, what a beautiful place<br>
Wherever you may go<br>
You will never be alone<br>
<br>
So, don&apos;t be afraid, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
I&apos;ve been, I&apos;ve been here all along<br>
</div><!--kg-card-end: html--><hr><p>To see if the model can also generate songs in a completely different style. Here is &quot;<strong>Don&apos;t you give up on me</strong>&quot;, in the style of <strong>Taylor Swift</strong>.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: Taylor Swift<br>
bio: Taylor Swift is an American singer-songwriter. She is known for writing break-up songs and for her narrative songwriting. Her music has been described as country pop and her persona as relatable.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
        [Don&apos;t You Give Up On Me]<br></span>
<br>
    
   I&apos;m living in a world<br>
Where everything&apos;s changing<br>
My friends disappear<br>
In distant places losing touch<br>
<br>
We&apos;ve got problems<br>
That we just can&apos;t solve<br>
We&apos;ve got money and power<br>
But when things go wrong<br>
We just keep on trying<br>
<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
I won&apos;t give up on you<br>
<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
I won&apos;t give up on you<br>
<br>
I&apos;m talking to myself<br>
I&apos;m trying to make sense<br>
Of everything that&apos;s going on<br>
But sometimes it&apos;s just too much<br>
<br>
I&apos;ve been changing so much<br>
I&apos;ve been living with ghosts<br>
I just want to start over<br>
I just want to be new but<br>
<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
I won&apos;t give up on you<br>
<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
I won&apos;t give up on you<br>
<br>
What if I&apos;m crazy?<br>
There&apos;s no one here to help me<br>
They are building a wall<br>
I just want to get to the other side<br>
<br>
What if I&apos;m crazy?<br>
There&apos;s no one here to help me<br>
They are building a wall<br>
I just want to get to the other side<br>
<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
Don&apos;t you give up on me<br>
I won&apos;t give up on you<br>
</div><!--kg-card-end: html--><h2 id="generating-variations-on-existing-lyrics">Generating variations on existing lyrics</h2><p></p><p>Sometimes you have generated a good verse, but GPT-3 decides that repeating the same verse over and over is a good idea. We can use prompts to solve this issue and introduce variation in the lyrics.</p><p>To do this we have to give some examples of a verse, and an alternative wording in the same structure. For example:</p><pre><code class="language-text">lyrics: 

On the corner of Main Street
Just trying to keep it in line
You say you wanna move on and
You say I&apos;m falling behind
Can you read my mind?
Can you read my mind?

variation on the above lyrics:

I never really gave up on
Breaking out of this two-star town
I got the green light, I got a little fight
I&apos;m gonna turn this thing around
Can you read my mind?
Can you read my mind?</code></pre><p>For this experiment I added seven such examples to the prompt in the format</p><pre><code class="language-text">lyrics:

{example lyrics 1}

variation on the above lyrics:

{example variation 1} 

---

lyrics:

{example lyrics 2 - 7}

variation on the above lyrics:

{example variation 2 - 7}

--- 

lyrics:

{lyrics you want to generate a variation on}

variation on the above lyrics:</code></pre><p>If I take the first verse from the generated Franz Ferdinand song and put it in there it outputs the following variation.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        lyrics:<br>
<br>
You&apos;d better be dreaming of trees<br>
They are standing and growing<br>
If you believe in all you see<br>
While you&apos;re still half asleep<br>
<br>
variation on the above lyrics:<br>
        <br></span>
    You&apos;d better be dreaming of me<br>
I am standing and waiting<br>
If you believe in what you feel<br>
While you&apos;re still half asleep<br>
</div><!--kg-card-end: html--><p>Inserting this new variation gives a whole new spin to the song</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">
        artist: Franz Ferdinand<br>
bio: Franz Ferdinand are a Scottish rock band formed in 2002. The band&apos;s original lineup was composed of Alex Kapranos, Nick McCarthy, Bob Hardy, and Paul Thomson.
The band&apos;s music is often described as a mix of post-punk and indie rock, with influences ranging from new wave to disco. The band&apos;s persona is one of cool detachment, and their lyrics often deal with themes of love and loss.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
        [Clouds on the Horizon]</span><br><br>
    You&apos;d better be dreaming of trees<br>
They are standing and growing<br>
If you believe in all you see<br>
While you&apos;re still half asleep<br>
<br>
You&apos;d better be dreaming of me<br>
I am standing and waiting<br>
If you believe in what you feel<br>
While you&apos;re still half asleep<br>
<br>
Do you see the cloud on the horizon?<br>
Do you see the people waking?<br>
<br>
Fear of what you see<br>
If you&apos;re afraid of what they mean<br>
You can change them again<br>
You won&apos;t even notice when<br>
<br>
Glitter, glamour and gold<br>
They are all around you<br>
If you lie that you own it<br>
You will only ever own nothing<br>
<br>
Do you see the cloud on the horizon?<br>
Do you see the people waking?<br>
<br>
Fear of what you see<br>
If you&apos;re afraid of what they mean<br>
You can change them again<br>
You won&apos;t even notice when<br>
They&apos;re gone<br>
</div><!--kg-card-end: html--><p><br>Without retraining the fine-tuned lyrics model we can steer a song in new directions by adding tags to the already created output. For the next example I thought the lyrics generated for the previously generated song &quot;Chasing after dreams&quot; could use a twist to keep the song interesting until the end. A bridge would be a good way to achieve this twist. To get the model to write a bridge I added tags for verse, chorus and pre-chorus and ended the prompt with a bridge tag. Amazingly it did add a bridge, even though the model was not trained to work with these tags! I think this is a great example of the flexibility of these models.</p><!--kg-card-begin: html--><div style="background-color: #ededed; color: black; padding: 20px;">
    <span style="font-weight: 600">artist: Jack Johnson<br>
bio: Jack Johnson is a professional surfer turned musician. He is best known for his mellow acoustic music, which has been dubbed &quot;surf-rock.&quot; Johnson is a laid-back guy who likes to keep things simple. He is known for his eco-friendly lifestyle and his support of various charities.<br>
description: The lyrics of this song are about dreaming and hope. The author encourages the listener not to be afraid of their dreams, even if they are afraid of what they may represent. They can be seen as a place of potential growth and change. The author also reassures the listener that their dreams are still alive and that they have the power to make them come true.<br>
mood: The mood is contemplative but hopeful<br>
<br>
###<br>
<br>
[Chasing After Dreams]<br>
<br>
# verse 1<br>
Find your place amongst the stone<br>
And let it be your home<br>
Come and rest your weary bones<br>
The sky is waiting for your call<br>
<br>
# verse 2<br>
Tiger lilies in the breeze<br>
Dance among the stars at night<br>
That&apos;s when all the children dream<br>
That they are something they are not<br>
<br>
# pre-chorus<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
<br>
# chorus<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
<br>
# verse 3<br>
And I&apos;ll be there to catch you<br>
As the music starts to play<br>
It is time to fire up those dreams<br>
The world is waiting for your call<br>
<br>
# verse 4<br>
In a city of stone and steel<br>
Love can be your home<br>
Let it flow to where you&apos;re sleeping<br>
And you don&apos;t have to go alone<br>
<br>
# pre-chorus<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
&quot;Oh, oh, oh&quot;<br>
Don&apos;t be afraid<br>
<br>
# chorus<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
We&apos;re chasing after dreams<br>
But our dreams are chasing us<br>
<br>
# verse 5<br>
And I&apos;ll be there to catch you<br>
As the music starts to play<br>
Dreams are dancing through the night<br>
We&apos;ve got time to dream our lives away<br>
<br>
# bridge</span><br>
Just take me to where it&apos;s all coming back<br>
To where we started, I&apos;m still here<br>
Maybe in here<br>
It all makes sense<br>
Now I don&apos;t know where I&apos;ve been<br>
When we were chasing after dreams
</div><!--kg-card-end: html--><h2 id="conclusion">Conclusion</h2><p><br>Although it still takes some of tweaking to get the results you want, this fine-tuned version of GPT-3 is very useful for providing inspiration for lyrics. It often comes up with ideas that I would never have thought of on my own, and it&apos;s a great way to get the creative juices flowing. The process of generating new lyrics and trying different styles is a lot of fun, and I found myself trying many different variations. Prompt programming is very flexible so it is easy to try out new ideas.</p><p>However one should be careful not to plagiarize other lyrics or writings. for example the prompt with 5 examples used some lyrics that are taken from <a href="https://www.goodreads.com/quotes/893779-dreams-are-like-stars-you-may-never-touch-them-but?ref=wingedsheep.com">an inspirational quote from Liam Payne</a>.</p><pre><code>Dreams are like stars
You may never touch them
But if you follow them
They will lead you to your destiny</code></pre><p>I was also surprised at how useful GPT-3 is out of the box for preparing data. You can ask it to extract useful features from text, and use these features as data to finetune a new model.</p><p>I can definitely see tools like this being used by writers or musicians. Maybe not to generate entire songs with one click of a button, but more as a writing companion.</p>]]></content:encoded></item><item><title><![CDATA[Music Generation - AI Song Contest 2021]]></title><description><![CDATA[How we created a song for the AI Song Contest 2021 with the help of transformers and other music generation techniques.]]></description><link>https://wingedsheep.com/music-generation-creating-a-song-for-the-ai-song-contest-2021/</link><guid isPermaLink="false">60cc81415fea020059bd7567</guid><category><![CDATA[Music Generation]]></category><category><![CDATA[Transformers]]></category><category><![CDATA[GPT-3]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Sun, 27 Jun 2021 12:56:55 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2021/06/lovelace-and-the-machines.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2021/06/lovelace-and-the-machines.jpeg" alt="Music Generation - AI Song Contest 2021"><p></p><h2 id="introduction">Introduction</h2><p></p><p>At the start of April a friend called me to ask me if I wanted to participate in a competition called the &quot;<a href="https://www.aisongcontest.com/?ref=wingedsheep.com">AI Song Contest</a>&quot;. The goal of the contest is to bring musicians and data scientists together to create music using Artificial Intelligence. Last year, in 2020, the first edition of this contest was organised. We would have about a month to create everything needed to generate a song, so the musicians would have enough time to record and produce. I had some experience in machine learning, but none in generated music, so the deadline was intimidating. But after thinking about it for a minute I decided to go for it. I wanted to learn more about transformer models that seemed to have all these magical capabilities, and to learn about them while making music at the same time seemed perfect. I like to play guitar and always felt the urge to write my own songs. Also at that time I had just been granted access to the OpenAI Api, so I could put GTP-3 to the test with this challenge. I decided to take a week off from work, rent a chalet and focus completely on this challenge.</p><p>You can find our page on the AI Song Contest website:</p><p><a href="https://www.aisongcontest.com/participants/lovelacethemachines-2021?ref=wingedsheep.com">https://www.aisongcontest.com/participants/lovelacethemachines-2021</a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/LOVELACE___THE_MACHINES-TEAM_PICTURE_OF_THE_HUMANS.jpg" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>The team: Lovelace and the machines</figcaption></figure><blockquote>Our team consisting of colleagues, friends and family who all hail from The Netherlands. The team started out with two colleagues and the whole thing just snowballed into a full-fledged team. Our data scientists are: Hennie, played Xylophone and piano for over 10 years and likes to learn from these type of contests; Rick, humanities major and notoriously a-musical; Salomon, jazz and piano player in a big band; Vincent, guitar player and always wondering how things work. And our musicians: Jo&#xEB;lle, singer-songwriter that ditched the whole music part to become just a writer; Thomas, composer and specialized in writing for film and games; Wendel, wellness manager by day, DJ by night (which still has something to do with wellness really). We set out on a dual quest: to find out if AI can become a new band member and to test some nice algorithms we don&#x2019;t get to use during working hours.</blockquote><h2 id="the-challenge">The challenge</h2><p></p><p>The next week we had our first team meeting. We called ourselves &quot;Lovelace &amp; The machines&quot;, in reference to Ada Lovelace who was already thinking about machines that could compose music in the 19th century. She was far ahead of her time in thinking about computers, or Analytical Engines as she called them. In her notes she wrote:</p><!--kg-card-begin: markdown--><blockquote>
<p>[The Analytical Engine] might act upon other things besides number, were objects found whose mutual fundamental relations could be expressed by those of the abstract science of operations, and which should be also susceptible of adaptations to the action of the operating notation and mechanism of the engine...Supposing, for instance, that the fundamental relations of pitched sounds in the science of harmony and of musical composition were susceptible of such expression and adaptations, the engine might compose elaborate and scientific pieces of music of any degree of complexity or extent.</p>
</blockquote>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/Ada_Lovelace_portrait-2.jpg" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://nl.wikipedia.org/wiki/Ada_Lovelace</figcaption></figure><p>We started discussing the challenge ahead of us and the problems we needed to tackle to get there. The AI Song Contest did not have many requirements, except for the requirement to be creative and put AI to good use in the process of creating our song. We decided to do as much with AI as possible, and only give human input where it is necessary. </p><p>The following challenges needed to be tackled:</p><ul><li>Writing the chord sequences and melody</li><li>Writing the lyrics</li><li>Creating drum and bass lines</li><li>Putting it all together into a song</li></ul><p>Before we could decide on a strategy we first had to figure out what the existing state of the art methods were. </p><h2 id="existing-research">Existing research</h2><p></p><p>There has been a lot of progress in music generation in the past few years. I will mention some of the inspiration we had when creating our song. </p><h3 id="magenta-music-transformer">Magenta: Music Transformer</h3><p><br>Since I was interested in learning more about transformers I set out to find out if transformer networks could be used to generate music. Since these networks excel in finding underlying structure of language, it seems like they might also be a good fit for figuring out the structure of music. </p><p>And indeed, I stumbled upon research by Google Magenta, the <a href="https://magenta.tensorflow.org/music-transformer?ref=wingedsheep.com">music transformer</a>. The music transformer uses midi like events as input and manages to create beautiful and expressive piano pieces.</p><p>Transformer networks use a mechanism called attention to find patterns in data. When generating a new note, instead of looking at the whole piece of music as equal it learns to identify the parts that influence what this note should be. How this attention mechanism functions when generating a song is beautifully visualised in Magenta&apos;s blogpost.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/music-transformer.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://magenta.tensorflow.org/music-transformer</figcaption></figure><h3 id="magenta-musicvae">Magenta: MusicVAE</h3><p><br>Another technique that might be interesting for generating music is the auto-encoder. An auto-encoder gets raw data as input, pushes it through a neural network with a small layer in the middle, and tries to reconstruct the raw data in the output layer again. By pushing the data through this small layer in the middle you force the network to figure out how to compress the data. The space of possible compressed representations is called the latent space.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/image.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://towardsdatascience.com/deep-inside-autoencoders-7e41f319999f</figcaption></figure><p>In the <a href="https://magenta.tensorflow.org/music-vae?ref=wingedsheep.com">Magenta MusicVAE</a> a variational auto-encoder is used. Instead of representing the data as a vector it is represented as a mixture of distributions. This adds the property that you can make smooth interpolations between two points in the latent space. This is very cool, because if you would interpolate between two musical samples all the samples in between would also sound good.</p><h3 id="openai-jukebox">OpenAI Jukebox</h3><p><br>We found that OpenAI had been doing some super exciting work in this direction. They created a neural network called <a href="https://openai.com/blog/jukebox/https://openai.com/blog/jukebox/?ref=wingedsheep.com">Jukebox</a> that generates music as raw audio, and can even add vocals to the generated music based on lyrics that are added as input data. They use a <a href="https://towardsdatascience.com/understanding-variational-autoencoders-vaes-f70510919f73?ref=wingedsheep.com">VAE (Variational autoencoder)</a> to compress raw audio and lyrics together to a compact format that captures the characteristics of this combination. Then a transformer network is trained to generate new audio in this compressed space. The generated data is then converted back into raw audio. This direction is super promising and exciting, but we lack the compute to reproduce these results ourselves. The Jukebox model was trained on 256 V100 GPUs for 3 days, whereas our compute budget was 1 GPU.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/image-3.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://openai.com/blog/jukebox/</figcaption></figure><p>You can explore all the generated samples here: <a href="https://jukebox.openai.com/?ref=wingedsheep.com">https://jukebox.openai.com/</a></p><h3 id="openai-musenet">OpenAI MuseNet</h3><p><br>Another direction OpenAI has ventured into was generating symbolic music using <a href="https://openai.com/blog/musenet/?ref=wingedsheep.com">MuseNet</a>. MuseNet works in a similar fashion as novel language models. It uses a sparse transformer network to generate pieces with a maximum of four minutes and supports 10 different instruments. Midi files encoded as a sequence of words are used as input. The input looks like this:</p><blockquote>bach piano_strings start tempo90 piano:v72:G1 piano:v72:G2 piano:v72:B4 piano:v72:D4 violin:v80:G4 piano:v72:G4 piano:v72:B5 piano:v72:D5 wait:12 piano:v0:B5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:4 piano:v0:G1 piano:v0:G2 piano:v0:B4 piano:v0:D4 violin:v0:G4 piano:v0:G4 wait:1 piano:v72:G5 wait:12 piano:v0:G5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:5 piano:v72:B5 wait:12</blockquote><p>The model is trained to predict the next character in the sequence, like a language model, and by doing so repeatedly it generates music. </p><p>A really cool thing is that you can try out MuseNet on the OpenAI website to generate your own samples!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/image-4.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://openai.com/blog/musenet/</figcaption></figure><h3 id="pop-music-transformer">Pop music transformer</h3><p><br>When looking for open implementations of the music transformer we found the <a href="https://github.com/YatingMusic/remi?ref=wingedsheep.com">Pop Music Transformer</a>. As in the music transformer model they use a midi-like representation for their input data too, but they created a new format; REMI. REMI stands for REvamped MIDI-derived events and adds more structure to the data by dividing music into measures and beats, and it allows for chords to be added to the training data. </p><p>Instead of using a standard transformer they use the <a href="https://arxiv.org/abs/1901.02860?ref=wingedsheep.com">transformer XL</a>. A normal transformer is restricted in the maximum number of characters it can evaluate at once, because the attention mechanism used is very expensive. It scales exponentially, so looking at 1024 characters instead of 512 is not a doubling of necessary compute but takes four times as much, looking at 2048 characters takes 16 times as much and so on. This means that a midi that is used as input is cut into parts, and the model can only learn the relations inside a single part. This means that the model can&apos;t learn how a complete song is structured. Transformer XL uses a trick in which it remembers a compressed representation of previous parts so it does not lose its context when generating music. This makes it possible to generate longer musical pieces that are still coherent. &#xA0;</p><h3 id="aiva">Aiva</h3><p><br>One of the music generation tools we looked at is <a href="https://www.aiva.ai/?ref=wingedsheep.com">Aiva</a>. Aiva is a very polished tool for creating music based on your own input. You can upload a midi file and create new music based on this input in different styles and using different instruments. They don&apos;t fully disclose how they achieve their results, but they sound very impressive. In this <a href="https://medium.com/@aivatech/how-we-used-our-music-engine-to-create-the-first-ai-generated-album-of-chinese-music-9d6fa984b4e8?ref=wingedsheep.com">blogpost</a> they say they use a combination of genetic algorithms and deep neural networks.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/aiva.jpg" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://www.aiva.ai/</figcaption></figure><p>Although Aiva is a really impressive tool, we decided not to use it because it takes away the effort and understanding of the algorithms on our part.</p><h3 id="openai-language-models-gpt-2-and-gpt-3">OpenAI language models: GPT-2 and GPT-3</h3><p><br>For generating lyrics we looked into the GPT-2 and GPT-3 models, since these achieve state of the art results in language generation.</p><p>The GPT models are transformers trained to predict the next character given a sequence of characters. GPT-2 had 1.5 billion parameters in it&apos;s neural network, and was trained on a dataset consisting of the text from 8 million web pages. For GPT-3, the next iteration of the model, they scaled this up to 175 billion parameters. The more parameters the better the model would be able to capture patterns in language, and thus the better it would be at predicting the next character in a text. But when scaling the model up the researchers at OpenAI discovered something interesting. Not only did the models learn to predict characters, they also learned how to answer questions or perform actions on text given a few examples. (see <a href="https://arxiv.org/abs/2005.14165?ref=wingedsheep.com">https://arxiv.org/abs/2005.14165</a>) </p><h2 id="process-overview">Process overview</h2><p></p><p>After diving into the existing methods we are ready to get our hands dirty. <br><br>Before explaining the process in depth I first want to share an overview image. Since our team worked on so many different things, talking about all of them would not do them justice. Instead I will dive deeper into the highlighted parts, that I was involved in. These include generating music, lyrics and variations on generated music.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/Chart-1.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: Rick Hoving - Lovelace and the machines</figcaption></figure><h2 id="chords-melody">Chords &amp; melody<br></h2><p>For generating melodies we chose to work with the pop music transformer. The code for this project was available on Github, and the authors wrote a paper describing their method. </p><p>The pop music transformer builds on the idea of generating music with transformers, but they add more structure to the input data to be able to generate songs with more rhythmic structure. Furthermore they use Transformer XL to generate music that sounds consistent for longer periods of time. </p><h3 id="remi-format">REMI Format</h3><p><br>To accomplish this the authors introduce the REMI format, which stands for REvamped MIDI-derived events. This format is a way to represent music in the MIDI format as text. A MIDI file represents a piece of music using a number of tracks. The tracks can each be assigned an instrument and the notes that are played by that instrument. There are 128 instruments and every instrument can play 128 different pitches. For every note that is played it denotes which pitch is played, the precise start and end time of the note and how loud it is. Since there is not really a concept of beats and bars in this format, a model learning how to make music based on this raw data would have to discover that music is usually structured in this rhythmic pattern. The REMI format is a way of helping the model by adding this structure to the data. Instead of using exact start and end times the music is divided in bars, where every bar is divided in 16 parts to describe the starting points of the notes. For every note a duration is added. This duration has some more precision and can be described in 32th parts of a bar.</p><p>For example if you want to convert this beat from &quot;Comptine D&apos;un Autre &#xC9;t&#xE9;&quot; by Yann Tiersen to REMI it would go as follows:</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2021/06/image-11.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"></figure><p>It will be converted to something that looks like this:</p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2021/06/yann-tiersen-2.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"></figure><p>This is then converted to text:</p><pre><code>Bar
Position 1/16
Play midi note 64
Hold for 4x 1/32 measure
Velocity 64
Play midi note 52
Hold for 4x 1/32 measure
Velocity 64
Position 3/16
Play midi note 67 
Hold for 2x 1/32 measure
Velocity 64
Play midi note 59
Hold for 4x 1/32 measure
Velocity 64
Position 4/16
Play midi note 66
Hold for 2x 1/32 measure
Velocity 64
...</code></pre><p>Another addition to the standard MIDI representation is the chord extraction that the REMI model uses. It looks at the notes played and tries to find the chords that go with the notes. They then add the chords as words to the input text, making it easier for the model to learn chord sequences.</p><h3 id="transformer-model">Transformer model</h3><p><br>The text is fed into an <strong>autoregressive language model</strong> that tries to find patterns it can reproduce. An autoregressive model is a model that tries to predict the future by looking at past values. Say I input a sentence that starts with &quot;I really like listening to &quot; and then ask an autoregressive language model to complete it it looks at the probabilities for the next character or word based on the data it is trained on. If the model was trained on my utterances it would probably continue to output &quot;the Red Hot Chili Peppers&quot;. </p><p>A few years ago <strong>recurrent neural networks</strong> would often be used to find relationships between words. In recurrent neural networks a sentence is built word by word, and after every word a compact representation (vector) of the sentence so far is created and passed on to the next step. The next step then uses the compact representation of the current sentence + the new word to create a new compact representation that is can pass on to the next step. The advantage of this approach is that sentences of any length can be processed. The disadvantage is that it makes it really hard to preserve relationships between words that are far apart, because every word in between has to be added to this compact representation. The compact representation can only store a limited amount of information, so if two words are too far apart the context is lost. </p><p>In 2017 the paper &quot;Attention is all you need&quot; a new type of neural network called the <strong>Transformer</strong> was introduced. The Transformer improved this by a mechanism called attention. Instead of passing the compact representation of the sentence along every time it is now possible to look directly at other words in the sentence. There are usually several attention layers that each find bigger patterns. If you take this example from the <a href="https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html?ref=wingedsheep.com">Google AI blog</a> you can see that the word &quot;it&quot; can relate to &quot;animal&quot; or &quot;street&quot; depending on the context.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2021/06/image-13.png" class="kg-image" alt="Music Generation - AI Song Contest 2021" loading="lazy"><figcaption>Source: https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html</figcaption></figure><p> The first attention layer could model the words &quot;it&quot; could relate to. This would probably be a noun like &quot;animal&quot; or &quot;street&quot;, so it should pay extra attention to those words. The next layer could use this combined representation of &quot;it could be related to a street or an animal&quot; to find out which of these words is meant by &quot;it&quot;. It should pay extra attention to &quot;wide&quot; or &quot;tired&quot; to find out more.</p><p>If you want to better understand how transformer networks work I can recommend this video.</p><figure class="kg-card kg-embed-card"><iframe width="356" height="200" src="https://www.youtube.com/embed/4Bdc55j80l8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>The cool thing is that we can treat songs converted into REMI as text and use these transformer language models to find patterns.</p><h3 id="transformer-xl">Transformer XL</h3><p><br>The transformer model is able to find these relationships between words amazingly well, but it still has its drawbacks. The attention step is expensive, since for every word we have to find out how much this word should pay attention to each other word. So if there are 512 words, we need to calculate attention for 512 * 512 connections between words. The number of calculations needed to be done is x^2 where x is the number of words we want to look at. If we can train a network with an attention window of 512 on one video card, we would need 4 GPUs to do 1024 words, and 16 GPUs to do 2048 words. </p><p>Of course you can split the sentences in parts that you can process, but this could deprive the model of essential context. Say you wanted to predict the next word in this sentence</p><p> &quot;Alice and Bob went on holiday to a tropical island. Of course they prepared well and packed their ...&quot; </p><p>But because of computational restrictions the model can only look at this part of the sentence when making a prediction: </p><ul><li>Of course they prepared well and packed their ...</li></ul><p>The model would not be able to determine if it has to fill in &quot;Snow boots&quot; or &quot;Swimwear and Hawaii shirts&quot;.</p><p>Transformer XL brings back the idea of the recurrent neural network to solve this problem. It makes a compact representation of the piece of text that came before and passes this to the next step when calculating probabilities. The input would then be something like:</p><ul><li>Sentence: Of course they prepared well and packed their ...</li><li>Compact representation of text before: Holiday / Tropical (represented as a vector) </li></ul><p>Then it would be way easier to say how the sentence would continue.</p><p>The same would apply to music. The compact representation of what came before could hold some information on the genre of the music, or the instruments used, the tempo and so on.</p><h3 id="finding-data-and-training-the-model">Finding data and training the model</h3><p><br>Now we had a way of representing music and creating a model that could generate new music based on midi data. But these types of models are very data hungry, so where could we find enough data? </p><p>We quickly found the Lakh midi dataset. A huge collection of 176,581 midi files of all kinds of songs. This would definitely be enough data to feed the model. </p><p>But of course the musicians in our team wanted to make music that reflected their personal taste, and training a model on a load of random songs would probably result in something similar to whatever style is most popular. We set out to search for MIDI files for songs from &quot;Crystal castles&quot;, &quot;Disclosure&quot;, &quot;Daft Punk&quot;, &quot;The Weeknd&quot; and &quot;Lana del Rey&quot; on sites like <a href="https://freemidi.org/?ref=wingedsheep.com">https://freemidi.org/</a> so we could use these to finetune the model.</p><h3 id="multiple-instruments">Multiple instruments</h3><p><br>The pop music transformer was designed to generate music based on piano compositions. But for creating our song we wanted to include multiple instruments and drums. And of course all the MIDI files from the Lakh midi dataset contained multiple tracks. We had to adjust the model to allow for multiple instruments. </p><p>To do this we extended the REMI representation. In the original REMI representation a note would be represented as:</p><pre><code>Position_1/16      # Position in the bar
Note Velocity_24   # Loudness of the note
Note On_64         # Pitch of the note
Note Duration_8    # Duration of the note in 1/32 measures</code></pre><p>In our representation this would become</p><pre><code>Position_1/16      # Position in the bar
Instrument_33      # Instrument playing the note
Note Velocity_24   # Loudness of the note
Note On_64         # Pitch of the note
Note Duration_8    # Duration of the note in 1/32 measures</code></pre><h3 id="training-the-model">Training the model</h3><p><br>We then proceeded to train the first model on <a href="https://colab.research.google.com/?ref=wingedsheep.com">Google Colab</a>. The cool thing about Colab is that they provide GPUs to researchers, so we could train our models a lot faster this way. We collected a set of around 30 or 40 MIDI files that the musicians liked and fed them to our model as training data. To our surprise some samples rolled out that sounded better than we expected, and there was a lot of variety. We felt like we were on the right track!</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1277727214&amp;show_artwork=true&amp;maxwidth=1280"></iframe></figure><p>There was one problem though. Because this first dataset was so small it happened very often that the model would imitate exact samples from the music we used as input. Since we didn&apos;t want to plagiarise any music we decide to train a model on the <a href="https://colinraffel.com/projects/lmd/?ref=wingedsheep.com">Lakh midi dataset</a>. Our reasoning was that a larger dataset would make it impossible for the model to &quot;remember&quot; the exact songs, and generalise better. The Lakh midi dataset consists of 176,581 unique midi files, but we used the clean version of the dataset where some filtering is applied. This dataset contains only songs with a timing of 4/4, and removes some of the duplicates or unknown songs in the set. This still leaves us with. 21,425 midis for our model to train on.</p><p>For training this bigger model we set up a virtual machine on Google Cloud with a GPU and <a href="https://jupyter.org/?ref=wingedsheep.com">Jupyter notebook</a> installed. When registering with Google Cloud you get $300 of budget to spend on trying out the platform. We used the entire budget to train the model. When the model was trained we set it to work generating samples. There was a lot of variety in the samples! You can listen to some of them here.</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1277737318&amp;show_artwork=true&amp;maxwidth=1280"></iframe></figure><p>It seemed that the model learned how to combine the different instruments in interesting ways, but now the samples would not stay coherent for long periods of time. There would be nice parts of 10 to 30 seconds, but then everything would descend into complete chaos again.</p><h3 id="preprocessing-the-data">Preprocessing the data</h3><p><br>Maybe all 128 MIDI instruments was a bit much for the model to learn. And most of the instruments are not completely dissimilar. For example it would not make a big difference in notes played if you had an &quot;Acoustic Grand Piano&quot; or an &quot;Electric Grand Piano&quot;. Also vocals in midi are played by flutes, saxophones or trombones and a variety of other instruments. There are so many instruments that have the same characteristics and play the same musical patterns, but the model has to learn the patterns for each of these instruments from scratch. </p><p>We decided that we would make the job of the model simpler by doing a preprocessing step on the data. We would split the music into melody, bass and accompaniment. Salomon was working on an algorithm to sort the instruments in a MIDI track based on frequency of the notes, number of notes per minute, how many notes would sound at the same time, and some other metrics. This would make it possible to automatically preprocess the Lakh dataset. </p><p>At that time I found the <a href="https://github.com/music-x-lab/POP909-Dataset?ref=wingedsheep.com">pop909 dataset</a>. This dataset consists of piano arrangements for 909 Chinese pop songs. This was perfect for what we wanted to achieve, because all the songs were split into three tracks. One for the main melody (usually vocals), one for the sub-melody and one for the accompaniment (chords). </p><p>Another thing that I added at the time was transposition of the songs. It is kind of a waste of data that all the songs are in different keys. If all the songs are transposed to the same key it is easier to find connections between songs. I implemented two ways of transposing the songs. One method was to find the key of a song using <a href="https://web.mit.edu/music21/?ref=wingedsheep.com">Music21</a>, a music analysis library for python, and then transposing the song until it was in the key of C (or A minor which uses the same notes). The other method was just transposing the songs to all the keys, so you would have 12 times as much training data, since there are 12 different keys.</p><p>This resulted in songs that sounded consistent for longer periods of time. Also the vocal lines were more easily distinguishable, which was convenient for the musicians who had to craft a song from the samples.</p><p>Here are some of the interesting samples generated by the model.</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1277807791&amp;show_artwork=true&amp;maxwidth=1280"></iframe></figure><h3 id="finetuning-to-particular-music">Finetuning to particular music</h3><p><br>We wanted to avoid overfitting in our model, which requires large amounts of data, and at the same time steer the model in a direction that we like. To do this I downloaded MIDI files for some of the songs that we liked and extracted the two melody tracks and the accompaniment track like in the pop909 dataset. In this way we could train a model on the large dataset and finetune it on this small dataset. </p><p>You can hear that the samples are slightly more &quot;minor&quot; after finetuning on our songs.</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1277812375&amp;show_artwork=true&amp;maxwidth=1280"></iframe></figure><h3 id="result">Result </h3><p><br>So now we had a large collection of generated music. The more chaotic music from the Lakh model, which was also more interesting in variety. And the music generated from the preprocessed MIDIs, which had better structure but had less surprises in it.</p><h2 id="lyrics">Lyrics</h2><p><br>In the same time we were working on the generation of lyrics. We wanted the lyrics to sound like they were produced by an Artificial Intelligence, so they had to be futuristic. Hennie had the idea to scrape a lot of sci-fi stories from Reddit and train a GPT-2 model to generate new sci-fi texts. </p><p>The results of this model sounded like really interesting stories, but since they were not very lyrical it was hard to put them to music. Since I had just gotten access to the GPT-3 model through the <a href="https://openai.com/blog/openai-api/?ref=wingedsheep.com">OpenAI API</a> I decided it was time to put it to work. </p><p>The GPT-3 model is a huge language model, trained on 45 terabytes of text. It is a transformer network with 175 billion trainable weights trained to predict how to continue a text given a certain text as a prompt. This huge size gives it interesting properties. It can write texts that are sometimes indistinguishable from human writing. An even more amazing property is that is can &quot;learn&quot; how to do new things by giving it a few examples as a prompt. I put &quot;learn&quot; between parentheses because giving these examples does not change the model in any way. It sees a pattern and recognises that it should continue using the same pattern to keep the text consistent.</p><p>I wondered if we could build a two-stage rocket. The first stage is the GPT-2 model generating sci-fi stories. The second stage is the GPT-3 model converting the generated stories into lyrics.</p><h3 id="gpt-3-prompt-example">GPT-3 prompt example</h3><p><br>I started with some simple examples. First I was wondering if the model could understand the concept of a riddle, and generate new riddles in this way.</p><p>I gave the following prompt to GPT-3 and asked it to continue writing. </p><pre><code>Riddle: Where does a rabbit go for a shampoo?
Answer: To a hare dresser.

Riddle: Why do skeletons go on vacations alone?
Answer: Because they have no-body to go with.

Riddle: The more you take, the more you leave behind. What am I?
Answer: Footsteps.</code></pre><p>When you would give this text to a person and asked them to continue, they would try to come up with a new riddle and put the answer below. It turned out that GPT-3 could also do this. It responded with: </p><pre><code>Riddle: Why did the woman throw the clock out the window?
Answer: Because she wanted to see time fly.</code></pre><p>I had some fun generating a few more of them!</p><pre><code>Riddle: What goes up and never comes down?
Answer: Your age.</code></pre><pre><code>Riddle: What did the fish say when he hit a concrete wall?
Answer: Dam!</code></pre><pre><code>Riddle: Why did the turtle cross the road?
Answer: To get to the Shell station.</code></pre><pre><code>Riddle: What has teeth but can&apos;t bite?
Answer: A comb.</code></pre><pre><code>Riddle: How do you make a tissue dance?
Answer: Put a little boogie in it.</code></pre><p>It also had some self-knowledge.</p><pre><code>Riddle: What do you get when you let an AI generate riddles? 
Answer: Artificial stupidity.</code></pre><h3 id="converting-stories-into-lyrics">Converting stories into lyrics</h3><p><br>Then I applied the same idea to convert the generated stories into lyrics. I took some song lyrics and tried to come up with how the lyrics would look like if they were written as text. </p><p>Examples were given like this:</p><blockquote>text:<br><br>When you are with her the night is exciting.<br>You go out until the sun comes up, having the time of your life. But then the daytime is a complete disaster.<br>In the beginning you really do your best to impress her, but then you figure out that she is not someone who sticks around.<br>She will go on to have new adventures, and you will just be a small part of her life.<br><br>lyrics:<br><br>She can take the dark out of the nighttime<br>And paint the daytime black<br>You will start out standing<br>Proud to steal her anything she sees<br>You will start out standing<br>Proud to steal her anything she sees<br>But you will wind up peeking through her keyhole<br>Down upon your knees</blockquote><blockquote>text:<br><br>A single lightbulb hanging overhead was casting its light on the crowd of &#xA0;around ten thousand people. Everyone was communicating with each other, but they were doing so without speaking. They were communicating with their devices, and nobody dared to make any real sound.<br><br>lyrics:<br><br>And in the naked light, I saw<br>Ten thousand people, maybe more<br>People talking without speaking<br>People hearing without listening<br>People writing songs that voices never share<br>And no one dared<br>Disturb the sound of silence</blockquote><p>Then I picked a semi-random text sample from the internet about the Mars rover, since I like reading about Mars. The input to the model was this:</p><blockquote>As the Perseverance rover began to make tracks on the surface of Mars, a sensitive microphone it carries scored a first: the bangs, pings, and rattles of the robot&#x2019;s six wheels as they rolled over Martian terrain.&#x201C;A lot of people, when they see the images, don&#x2019;t appreciate that the wheels are metal,&#x201D; said Vandi Verma, a senior engineer and rover driver at NASA&#x2019;s Jet Propulsion Laboratory in Southern California. &#x201C;When you&#x2019;re driving with these wheels on rocks, it&#x2019;s actually very noisy.&#x201D;</blockquote><p>An interesting piece of text, but really not that interesting for putting in a song. GPT-3 then turned it into these lyrics:</p><blockquote>I am Voyager, and I travel far.<br>And this is the first full song that I ever heard.<br>And it is the last thing that will ever be.<br>Baby take my hand.<br>It&apos;s gonna be a long long time.<br>Baby take my hand.<br>In this planet we call Earth.</blockquote><p>I could imagine this text in a song. A song about feeling lonely and missing the place that you come from, or leaving someone and knowing you are never coming back. The most amazing thing about it to me was that it kind of made sense. The Voyager was a spacecraft sent into space to never come back, and the &quot;song&quot; that the text mentions could be the golden record that is on board the Voyager mission with memories of earth and music on it.</p><p>These are some of the lyrics generated by the prompt based on the sci-fi stories from the GPT-2 model.</p><blockquote>I float in the deepest space.<br>The stars are black and white, the violets, blues and greens.<br>I&apos;m floating where the air is raw.<br>My world lies far behind.<br>I see it in my mind.<br><br>I hope that someday it will be real.<br>Floating in a sea of sound,<br>I wonder what the people are going to think about me<br>on monday morning when they hear about my weekends adventures<br>with all these intergalactic friends of mine?</blockquote><blockquote>And when we sleep we dream the future.<br>And when we wake we have the past.<br>And when we&apos;re lost in time and space.<br>We turn our gaze to the skies.<br>And when we look back down to Earth.<br>We&apos;re all too blind to see the light.<br>The light is in your eyes.<br>The light is in your eyes.</blockquote><blockquote>We were caught in a quantum trap.<br>A digital world made of atoms.<br>A simulated reality made of mathematical functions.<br>We write the code and we use it to catch us.<br>We are the ones who use the particle accelerator.<br>We write the algorithm and we make it function.<br>We are the ones who simulate reality and we can also change it.</blockquote><blockquote>As the vessel drifts away<br>I can see the path we have made<br>Peeking through the distant haze<br>The long procession of our wake<br><br>I can see the places we have been<br>Reminding me how we used to be<br>Images flash before my eyes<br>I&apos;m remembering when I used to be<br><br>There was only one thing I knew how to do<br>It was enough to get by on<br>Then something happened and I became aware<br>I became aware of the space I was in<br>And I knew that I was alive<br><br>And the first thing I wanted to do was<br>Find some way to share this with you<br>And as my eyes adjust to the light<br>I can see where we are now<br>I can see that we&apos;re not alone<br><br>There are signatures all around us<br>Reminding me how we used to be<br>Images flash before my eyes<br>I&apos;m remembering when I used to be alive.</blockquote><p><strong>Creating variations on lyrics</strong></p><p>In the same way as creating the lyrics we could use a prompt to create new lyrics based on existing ones. </p><p>As prompt I used one part of an existing song, and as continuation the next part of that song. </p><p>One of the examples I used from the lyrics of &quot;These streets&quot; by Paolo Nutini. </p><blockquote>lyrics:<br>Where&apos;d the days go? When all we did was play<br>And the stress that we were under wasn&apos;t stress at all<br>Just a run and a jump into a harmless fall<br>From walking by a high-rise to a landmark square<br>You see millions of people with millions of cares<br>And I struggle to the train to make my way home<br>I look at the people as they sit there alone<br><br>variation:<br>Cross the border, into the big bad world<br>Where it takes you &apos;bout an hour just to cross the road<br>Just to stumble across another poor old soul<br>From the dreary old lanes to the high-street madness<br>I fight with my brain to believe my eyes<br>And it&apos;s harder than you think to believe this sadness<br>That creeps up my spine and haunts me through the night</blockquote><p>It turned out to be a lot harder to generate interesting variations this way. Often it would just return the same text as the input, but sometimes it would return something interesting. For example inputting these lyrics:</p><blockquote>lyrics:<br>I float in the deepest space<br>The stars are black and white, the violets, blues and greens<br>I&apos;m floating where the air is raw<br>My world lies far behind<br>I see it in my mind</blockquote><p>Would give the next variation:</p><blockquote>variation:<br>I ride the darkest planets<br>The moon is black and white<br>My world lies far behind<br>My feeling lies beyond<br>I see it in my mind</blockquote><h2 id="producing-the-song">Producing the song</h2><p></p><p>After we created the algorithms and generated a lot of content the musicians started working on the song. They went though all the generated music and lyrics to select their favourite parts with help of a hit prediction model created by Rick.</p><p>Then a kind of jamming process started. The musicians would create something and ask if we could create basslines, drums or variations for the selected parts. To create these variations we used <a href="https://openai.com/blog/musenet/?ref=wingedsheep.com">MuseNet</a>, the <a href="https://metacreation.net/mmm-multi-track-music-machine/?ref=wingedsheep.com">Multitrack Music Machine</a> and an autoencoder model created by Salomon that could generate new melodies. </p><p>The starting point of the song was this piece that we used for the chorus.</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="400" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F1075959094&amp;show_artwork=true&amp;maxwidth=1280"></iframe></figure><p>Thomas and Wendel created the music around this starting point and Jo&#xEB;lle picked her favourite lyrics to sing to the melody. Jo&#xEB;lle started by picking some lyrics that really sounded otherworldly. Something only an AI could have come up with about us living in a simulated reality, or a Quantum Trap.</p><p>A lot of cherry picking was still required to fit all the music together. And one thing the models still lacked was the overall structure of the song. It could generate parts that sounded interesting, but it would not have repeating patterns, or a distinction between verse, bridge and chorus. So the musicians decided on the overall structure of the song and picked parts of the generated music and lyrics that sounded good together. </p><p>&quot;Quantum Trap&quot; is the result of the hard work of our team and I&apos;m really proud of the song we created!</p><figure class="kg-card kg-embed-card"><iframe width="267" height="200" src="https://www.youtube.com/embed/KmK5788gixo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><h2 id="follow-up">Follow-up</h2><p></p><p>A short while after submitting our song I felt like there were so many interesting improvements to pursue. I read an article about efficient transformers, and how they could be used to process longer sequences. &#xA0;found a new interesting project by YatingMusic on better learning the structure of songs by grouping words together, called the <a href="https://github.com/YatingMusic/compound-word-transformer?ref=wingedsheep.com">compound word transformer</a>. This comes including a dataset of 17.000 songs!</p><p>I wanted to create something useful that other people who would like to experiment with this technology can use, so I started the &quot;music generation toolbox&quot; repository on Github. The plan is to keep experimenting with new techniques to make the models better and to provide a toolbox for musicians and developers that makes it easy to generate your own music.</p><p>You can find the repository including examples on how to use it here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/wingedsheep/music-generation-toolbox?ref=wingedsheep.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">wingedsheep/music-generation-toolbox</div><div class="kg-bookmark-description">Toolbox for generating music. Contribute to wingedsheep/music-generation-toolbox development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Music Generation - AI Song Contest 2021"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">wingedsheep</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/d05eabb38c0e4aa53c14b00beaef7d9854ce7c67ddca9934133c85e88a55a37e/wingedsheep/music-generation-toolbox" alt="Music Generation - AI Song Contest 2021"></div></a></figure><p>Some samples of the music generation toolbox:</p><figure class="kg-card kg-embed-card"><iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1303229827&amp;show_artwork=true"></iframe></figure><p>And some with a perceiver model:</p><figure class="kg-card kg-embed-card"><iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?visual=true&amp;url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F1502514715&amp;show_artwork=true"></iframe></figure><h2 id="references">References<br></h2><p>Artwork by: Rick Hoving &amp; Jo&#xEB;lle Smidt</p><p><em>AI song contest</em>. (2021). <a href="https://www.aisongcontest.com/?ref=wingedsheep.com">https://www.aisongcontest.com</a></p><p><em>Music Transformer: Generating Music with Long-Term Structure</em>. (2018, 13 december). Magenta. <a href="https://magenta.tensorflow.org/music-transformer?ref=wingedsheep.com">https://magenta.tensorflow.org/music-transformer</a></p><p><em>MusicVAE: Creating a palette for musical scores with machine learning.</em> (2018, 15 maart). Magenta. <a href="https://magenta.tensorflow.org/music-vae?ref=wingedsheep.com">https://magenta.tensorflow.org/music-vae</a></p><p><em>OpenAI Jukebox</em>. (2020, 4 september). OpenAI. <a href="https://openai.com/blog/jukebox/?ref=wingedsheep.com">https://openai.com/blog/jukebox/</a></p><p>Payne, C. M. (2020, 19 november). <em>MuseNet</em>. OpenAI. <a href="https://openai.com/blog/musenet/?ref=wingedsheep.com">https://openai.com/blog/musenet/</a></p><p>Huang, Yu-Siang, and Yi-Hsuan Yang. &quot;Pop music transformer: Generating music with rhythm and harmony.&quot; <em>arXiv preprint arXiv:2002.00212</em> (2020).</p><p>Dai, Zihang, et al. &quot;Transformer-xl: Attentive language models beyond a fixed-length context.&quot; <em>arXiv preprint arXiv:1901.02860</em> (2019).</p><p>Aiva Technologies. (2018, 14 september). <em>How we used our Music Engine to create the first AI-generated album of Chinese Music</em>. Medium. <a href="https://medium.com/@aivatech/how-we-used-our-music-engine-to-create-the-first-ai-generated-album-of-chinese-music-9d6fa984b4e8?ref=wingedsheep.com">https://medium.com/@aivatech/how-we-used-our-music-engine-to-create-the-first-ai-generated-album-of-chinese-music-9d6fa984b4e8</a></p><p>Radford, A. (2021, 4 mei). <em>Better Language Models and Their Implications</em>. OpenAI. <a href="https://openai.com/blog/better-language-models/?ref=wingedsheep.com">https://openai.com/blog/better-language-models/</a></p><p>Brown, Tom B., et al. &quot;Language models are few-shot learners.&quot; <em>arXiv preprint arXiv:2005.14165</em> (2020).</p><p>Wang, Ziyu, et al. &quot;Pop909: A pop-song dataset for music arrangement generation.&quot; <em>arXiv preprint arXiv:2008.07142</em> (2020).</p><p>Ens, Jeff, and Philippe Pasquier. &quot;Mmm: Exploring conditional multi-track music generation with the transformer.&quot; <em>arXiv preprint arXiv:2008.06048</em> (2020).</p><p>Raffel, Colin. <em>Learning-based methods for comparing sequences, with applications to audio-to-midi alignment and matching</em>. Diss. Columbia University, 2016.</p><p>Vaswani, Ashish, et al. &quot;Attention is all you need.&quot; <em>arXiv preprint arXiv:1706.03762</em> (2017).</p><p><em>music21: a Toolkit for Computer-Aided Musicology</em>. (2021). Music21. <a href="https://web.mit.edu/music21/?ref=wingedsheep.com">https://web.mit.edu/music21/</a></p><p><em>Free Midi - Best Free High Quality Midi Site</em>. (2021). FreeMidi. <a href="https://freemidi.org/?ref=wingedsheep.com">https://freemidi.org/</a></p><p>Raffel, Colin. (2021). <em>craffel/pretty-midi</em>. GitHub. <a href="https://github.com/craffel/pretty-midi?ref=wingedsheep.com">https://github.com/craffel/pretty-midi</a></p><p>Brockman, G. (2021, 22 juni). <em>OpenAI API</em>. OpenAI. <a href="https://openai.com/blog/openai-api/?ref=wingedsheep.com">https://openai.com/blog/openai-api/</a></p><p>Hsiao, Wen-Yi, et al. &quot;Compound Word Transformer: Learning to Compose Full-Song Music over Dynamic Directed Hypergraphs.&quot; <em>arXiv preprint arXiv:2101.02402</em> (2021).</p><p>Wang, P. (2021). <em>lucidrains/reformer-pytorch</em>. GitHub. https://github.com/lucidrains/reformer-pytorch</p><p>Wang, P. (2021b). <em>lucidrains/x-transformers</em>. GitHub. https://github.com/lucidrains/x-transformers</p><p>Young, K. (2021). <em>kimiyoung/transformer-xl</em>. GitHub. https://github.com/kimiyoung/transformer-xl</p>]]></content:encoded></item><item><title><![CDATA[Solving Lunar Lander using DQN with Keras]]></title><description><![CDATA[Solving the OpenAI gym LunarLander environment with the help of DQN implemented with Keras.]]></description><link>https://wingedsheep.com/lunar-lander-dqn/</link><guid isPermaLink="false">5f281ec019325a0082986154</guid><category><![CDATA[machine learning]]></category><dc:creator><![CDATA[Vincent Bons]]></dc:creator><pubDate>Mon, 03 Aug 2020 18:28:42 GMT</pubDate><media:content url="https://wingedsheep.com/content/images/2020/08/lunarlanderpost-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://wingedsheep.com/content/images/2020/08/lunarlanderpost-2.png" alt="Solving Lunar Lander using DQN with Keras"><p></p><p><a href="https://github.com/wingedsheep/blog/blob/main/lunar-lander-dqn/lunar_lander_dqn_blog.ipynb?ref=wingedsheep.com">View complete python notebook</a></p><p></p><p>In Februari 2015 the artificial intelligence company DeepMind published an <a href="https://deepmind.com/research/publications/human-level-control-through-deep-reinforcement-learning?ref=wingedsheep.com">article</a> in Nature showing they can solve a number of Atari games using Deep Q learning. The amazing part of this is that they didn&apos;t create a compact representation of the state of the games. They trained their algorithm purely on the pixels visible on screen and a score. Using this approach they get a better result than all the previous algorithms available, and manage to play 49 out of the 57 games to at least the level of a professional human game tester. </p><p>Since reading about their result I have been tinkering around with reinforcement learning. I managed to create some working implementations, but they were never very stable. They learned how to solve a problem, but then after some more training they would oscillate out of control and end up having to learn everything again. An infinite cycle of success and failure. This time I set the challenge for myself to solve the problem, but to also solve it in a way that can maintain its results; A robust deep Q learning algorithm.</p><p>OpenAI created a platform for testing reinforcement learning agents. It contains implementations of different problems for reinforcement learning agents to solve, from simple grid worlds to more complex control problems. The goal for this blogpost is to solve the <a href="https://gymnasium.farama.org/environments/box2d/lunar_lander/?ref=wingedsheep.com">LunarLander-v2 environment</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2020/08/lunarlander.gif" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"><figcaption>An agent playing the LunarLander environment with random actions.</figcaption></figure><p>The goal of lunar lander is to land a small spacecraft between two flags. At every time step you have a choice between 4 actions: fire your main engine, your left engine, your right engine or do nothing. If the spacecraft hits the ground at the wrong angle or too fast it crashes and you get a large penalty. You also get a small penalty for firing your main engine. You get rewards for getting closer to the desired end position, and for touching the ground.</p><p>The environment is considered solved if the agent manages to get a score of 200 or more on average in the last 100 episodes. </p><h2 id="q-learning">Q learning</h2><p><br>Let&apos;s first start by explaining a bit about the algorithm I am going to use. Q-learning is a reinforcement learning algorithm. In reinforcement learning an agent exists inside an environment. At every time step the agent can observe the environment and take an action. After taking an action the environment changes and the agent can observe the new state of the environment. In every transition from one state to another the agent receives feedback in the form of a reward or a penalty. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2020/08/reinforcement_learning.png" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"><figcaption>Reinforcement learning loop</figcaption></figure><p>Q learning is an implementation of a reinforcement learning agent that learns about the environment and tries to maximize the expected reward gained. </p><p>It does this by using a Q-function <strong>Q(s, a)</strong>. </p><p><strong>Q(s, a) </strong>is a function that predicts the future reward in state <strong>s </strong>when taking action <strong>a</strong>. If your model is accurately predicting these Q values the agent could pick the action with the highest Q value to maximize its reward. </p><p>Usually in Q learning an agent begins by randomly selecting actions and observing their effects in the environment. It then uses the Bellman equation to update the Q function. The Bellman equation looks like this: </p><figure class="kg-card kg-image-card"><img src="https://wingedsheep.com/content/images/2020/07/image-1.png" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"></figure><p>The agent was in state <strong>s </strong>and executed action <strong>a</strong>, it then ended up in state <strong>s&apos; </strong>and received reward <strong>r</strong>. We then update the predicted value <strong>Q(s, a) </strong>by adjusting the current value with the temporal difference. The temporal difference can be described as the surprise of the reward you received. If the reward you received is higher than expected the temporal difference is positive, and if it is worse than expected the temporal difference is negative. If an action ended up to be better than expected we adjust the Q value upwards, and if it is worse than expected we adjust the Q value downwards.</p><p>The values explained in more detail:</p><ul><li><strong>reward</strong>: the reward gained by moving from state <strong>s </strong>to state <strong>s&apos; </strong>using action <strong>a</strong>.</li><li><strong>discount factor</strong>: how much to take the future into account. If the discount factor is 0 the future is not taken into account at all, if the discount factor is 1 we look an unlimited number of steps into the future. Say for instance the discount factor is 0.99, then we count an action 100 steps into the future only 0.99^100 = 0.366 times of the actual amount.</li><li><strong>learning rate</strong>: how much to adjust the Q function in every training step. </li></ul><p>Practical example. Say we are in state <strong>s </strong>and the model predicted <strong>Q(s, a) </strong>to be 100. We then take action <strong>a </strong>and end up in state <strong>s&apos;</strong>. We get a reward of 8. The Q value for the best action we could take in the next state <strong>s&apos; </strong>is 95. A discount factor of 0.99 is used. We then get a temporal difference of: 8 + 0.99 * 95 - 100 = 2.05. We get 2.05 more reward from the action than expected. We don&apos;t want to adjust <strong>Q(s, a) </strong>to 102.5 right away, because making too large changes to the Q values might cause the model to never converge. So we update the model by the temporal difference multiplied by the learning rate, which is a value between 0 and 1. If the learning rate is 0.1 the new value for <strong>Q(s, a) </strong>becomes 100 + 0.1 * 2.05 = 100.205. The model is a bit more positive about selecting action <strong>a </strong>in state <strong>s</strong>. </p><p>The simplest implementation of Q-learning uses a table to hold all the values, but this quickly becomes infeasible for environments with many possible states or actions. By using a (deep) neural network to represent the <strong>Q(s, a) </strong>function the agent can generalise to never seen combinations of <strong>(s, a)</strong> better. The input for this neural network is an observation and the output is a Q value for every allowed action in that state. We call this implementation deep Q-learning.</p><h3 id="additions">Additions</h3><p><br>Deep Q-learning can be quite unstable. Without any tweaks the algorithm can oscillate between good and bad solutions or fail to converge at all. </p><p>DeepMind used some additional tricks to make sure their deep Q-learning algorithm converges towards a good solution. In my implementation I am going to implement the following additions.</p><p><strong>E-greedy action selection</strong></p><p>Reinforcement learning is always a struggle between exploration and exploitation. If you always select the actions you think are the best (exploitation) you might never discover that there are better alternatives. If you explore too much you may never reach the better solutions. </p><p>I am going to implement e-greedy action selection. The idea of this method is to have a value between 0 and 1 that determines the amount of exploration vs exploitation. If the value is 0 the agent will always choose the action it thinks is the best one, if the value is 1 it will act completely random. The value starts out high and decreases over time. In the beginning the agent does not know anything about the environment, so it should explore as much to discover the effect of its actions on the environment. As the agent learns more it can start to exploit good strategies.</p><p><strong>Experience replay</strong></p><p>In the standard Q-learning algorithm the agent learns after every time step, all past experiences are thrown away.</p><p>With experience replay we save all state transitions <strong>(state, action, reward, new_state)</strong> so we can use them for training later. </p><p>The advantages of using experience replay are: </p><ul><li>You can use batches of state transitions to learn from. The model gets adjusted for a batch of transitions at once and makes sure that the update is beneficial for predicting each of these transitions. This leads to training updates that are good for multiple state / action pairs at the same time. This means more stable training and better convergence. </li><li>You can revisit past states. Because there is a leaning rate, the model is not instantly adjusted to the correct values. It is nudged a bit in the right direction every training step. If you can revisit interesting actions you can learn more from them.</li></ul><p><strong>Double Q-learning</strong></p><p>When calculating the target values for updating the model the same model is used for calculating <strong>Q(s, a) </strong>as for calculating the Q value of the best action in the next state. This can lead to overestimation of the expected reward. <br><br>For a detailed explanation read this <a href="https://rubikscode.net/2020/01/13/introduction-to-double-q-learning/?ref=wingedsheep.com">blogpost</a> by Rubik&apos;s code. </p><p>To solve this problem we use two models. The main model \( &#xA0;\theta \) &#xA0;for selecting actions and a target model \( &#xA0;\theta &apos; \) &#xA0;for calculating the target values. The weights of the main model are copied to the target model every x steps. </p><p>Vanilla target: \( R_{t+1} + \gamma max_{a}Q(S_{t+1}, a; \theta) \)<br>Double q learning target: \( R_{t+1} + \gamma Q(S_{t+1}, argmax_{a} Q(S_{t + 1}, a; \theta); \theta &apos;) \)</p><p>\( Q(s, a; \theta) \) means the <strong>Q(s, a) </strong>value according to model \( &#xA0;\theta \), so the target is the reward plus the Q value of the target model with the best action in state the next state<strong> </strong>according to the main model. </p><p>Using double q learning leads to more realistic Q-values and thus to better models.</p><p><strong>Huber loss </strong></p><p>Using mean squared error (mse) as loss function might lead to very high errors when training. These high errors can cause the model to over-adjust and fail to converge to a good solution. Huber loss is less sensitive to outliers because it is exponential only up to a certain threshold and then becomes linear.</p><p>Using huber loss leads to a more stable Q-learning convergence. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2020/08/Huber_loss.png" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"><figcaption>blue = mean squared error, green = huber loss</figcaption></figure><h2 id="implementation">Implementation<br></h2><p>I implemented the algorithm on <a href="http://colab.research.google.com/?ref=wingedsheep.com">Google Colab</a> where certain dependencies like Tensorflow come pre-installed. If you want to replicate this code on your local machine you will have to install some more dependencies than I show here.</p><p>First we are going to install box2d. This is necessary for running the LunarLander environment.</p><pre><code class="language-text">!pip install box2d</code></pre><p>Then we install the necessary modules.</p><pre><code class="language-python">import tensorflow as tf
import gym
import os
import random

from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense
from tensorflow.keras.regularizers import l2

import numpy as np
import scipy
import uuid
import shutil

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

import keras.backend as K</code></pre><p>We create the LunarLander environment and check how large the state space and the action space are. <br><br>The state space describes the number of variables the agent can observe. Since we use observations as input for the Q-learning network this determines the number of inputs our model needs to have.</p><p>The action space describes how many actions are possible. For every action we are going to add an output to our Q-learning network.</p><pre><code class="language-python">env = gym.make(&quot;LunarLander-v2&quot;)

print(f&quot;Input: {env.observation_space}&quot;)
print(f&quot;Output: {env.action_space}&quot;)</code></pre><p>It prints out the following. An observation contains 8 variables and we can choose between 4 different actions. </p><pre><code class="language-text">Input: Box(8,)
Output: Discrete(4)</code></pre><p>Then we are going to create our model, but before we can do so we need to implement the Huber loss function. This might be the trickiest part of the implementation. </p><p>We implement this as a custom loss function using the Keras backend API. The function takes in all the predicted and true outputs for a batch of state transitions and has to calculate the average Huber loss over this batch. But there is a catch: Our model takes as input a state s, and as output the Q-values for all possible actions. If we want to update the model for a &#xA0;certain state transition (s, a, r, s&apos;) we only want to calculate the loss for the output that belongs to the action <strong>a </strong>that the agent took to get from state <strong>s </strong>to <strong>s&apos;</strong>. </p><p>If we have four actions our model could predict [10, 13, 7, 9] as Q-values. In the state transition we are training on we took action 3 and got a target value of 12. We then get a target vector of [0, 0, 12, 0]. The masked_huber_loss function nullifies the error for outputs of which the y_true is 0. So the comparison becomes [0, 0, 7, 0] to [0, 0, 12, 0]. </p><pre><code class="language-python">def masked_huber_loss(mask_value, clip_delta):
  def f(y_true, y_pred):
    error = y_true - y_pred
    cond  = K.abs(error) &lt; clip_delta
    mask_true = K.cast(K.not_equal(y_true, mask_value), K.floatx())
    masked_squared_error = 0.5 * K.square(mask_true * (y_true - y_pred))
    linear_loss  = mask_true * (clip_delta * K.abs(error) - 0.5 * (clip_delta ** 2))
    huber_loss = tf.where(cond, masked_squared_error, linear_loss)
    return K.sum(huber_loss) / K.sum(mask_true)
  f.__name__ = &apos;masked_huber_loss&apos;
  return f</code></pre><p>We then create the model as follows. We have 9 input neurons. 8 for the observations in the LunarLander environment and 1 for the fraction complete. Fraction complete indicates how far the epsiode is to ending because of reaching its maximum number of steps. Say we have a maximum of 1000 steps and the current step is 400, then fraction complete is 0.4. This can be used by the agent to decide if it has to act fast, or if it can take it&apos;s time.</p><pre><code class="language-python">input_shape = (9,) # 8 variables in the environment + the fraction finished we add ourselves
outputs = 4

def create_model(learning_rate, regularization_factor):
  model = Sequential([
    Dense(64, input_shape=input_shape, activation=&quot;relu&quot;, kernel_regularizer=l2(regularization_factor)),
    Dense(64, activation=&quot;relu&quot;, kernel_regularizer=l2(regularization_factor)),
    Dense(64, activation=&quot;relu&quot;, kernel_regularizer=l2(regularization_factor)),
    Dense(outputs, activation=&apos;linear&apos;, kernel_regularizer=l2(regularization_factor))
  ])

  optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
  model.compile(optimizer=optimizer, loss=masked_huber_loss(0.0, 1.0))
  
  return model</code></pre><p>We can use this model to predict Q-values for a single state or for a batch of states. </p><pre><code class="language-python">def get_q_values(model, state):
  input = state[np.newaxis, ...]
  return model.predict(input)[0]

def get_multiple_q_values(model, states):
  return model.predict(states)</code></pre><p>These Q-values can be used to select actions. We use the epsilon greedy implementation like described above.</p><pre><code class="language-python">def select_action_epsilon_greedy(q_values, epsilon):
  random_value = random.uniform(0, 1)
  if random_value &lt; epsilon: 
    return random.randint(0, len(q_values) - 1)
  else:
    return np.argmax(q_values)

def select_best_action(q_values):
  return np.argmax(q_values)</code></pre><p>Then we create the replay buffer with a certain size. If the number of state transitions in the replay buffer is bigger than the size it starts overwriting state transitions, starting from the oldest one. The replay buffer has a method to collect a batch of state transitions for training.</p><pre><code class="language-python">class StateTransition():

  def __init__(self, old_state, action, reward, new_state, done):
    self.old_state = old_state
    self.action = action
    self.reward = reward
    self.new_state = new_state
    self.done = done

class ReplayBuffer():
  current_index = 0

  def __init__(self, size = 10000):
    self.size = size
    self.transitions = []

  def add(self, transition):
    if len(self.transitions) &lt; self.size: 
      self.transitions.append(transition)
    else:
      self.transitions[self.current_index] = transition
      self.__increment_current_index()

  def length(self):
    return len(self.transitions)

  def get_batch(self, batch_size):
    return random.sample(self.transitions, batch_size)

  def __increment_current_index(self):
    self.current_index += 1
    if self.current_index &gt;= self.size - 1: 
      self.current_index = 0</code></pre><p>When we want to train the model on a batch of state transitions we need to calculate the target values for each of these state / action pairs. We do this using the double Q-learning technique where we use two models for calculating the target values.</p><pre><code class="language-python">def calculate_target_values(model, target_model, state_transitions, discount_factor):
  states = []
  new_states = []
  for transition in state_transitions:
    states.append(transition.old_state)
    new_states.append(transition.new_state)

  new_states = np.array(new_states)

  q_values_new_state = get_multiple_q_values(model, new_states)
  q_values_new_state_target_model = get_multiple_q_values(target_model, new_states)
  
  targets = []
  for index, state_transition in enumerate(state_transitions):
    best_action = select_best_action(q_values_new_state[index])
    best_action_next_state_q_value = q_values_new_state_target_model[index][best_action]
    
    if state_transition.done:
      target_value = state_transition.reward
    else:
      target_value = state_transition.reward + discount_factor * best_action_next_state_q_value

    target_vector = [0] * outputs
    target_vector[state_transition.action] = target_value
    targets.append(target_vector)

  return np.array(targets)</code></pre><p>We create a function to train the model using a batch of states and target values.</p><pre><code class="language-python">def train_model(model, states, targets):
  model.fit(states, targets, epochs=1, batch_size=len(targets), verbose=0) </code></pre><p>Then we create a function to make a copy of a model. We need this later to create and update the target model. The model is saved to a backup file, which is loaded into a new object. The copy of the model is returned. We need to pass the masked_huber_loss to the load_model function, because Keras does not know how to initialize the new model otherwise. The backup just has a reference to the loss function name. </p><pre><code class="language-python">def copy_model(model):
  backup_file = &apos;backup_&apos;+str(uuid.uuid4())
  model.save(backup_file)
  new_model = load_model(backup_file, custom_objects={ &apos;masked_huber_loss&apos;: masked_huber_loss(0.0, 1.0) })
  shutil.rmtree(backup_file)
  return new_model</code></pre><p>Since we want to see how well the agent is learning we introduce some logging functionality. The AverageRewardTracker keeps count of the average reward over the last 100 steps. The FileLogger writes the results to a file after every episode.</p><pre><code class="language-python">class AverageRewardTracker():
  current_index = 0

  def __init__(self, num_rewards_for_average=100):
    self.num_rewards_for_average = num_rewards_for_average
    self.last_x_rewards = []

  def add(self, reward):
    if len(self.last_x_rewards) &lt; self.num_rewards_for_average: 
      self.last_x_rewards.append(reward)
    else:
      self.last_x_rewards[self.current_index] = reward
      self.__increment_current_index()

  def __increment_current_index(self):
    self.current_index += 1
    if self.current_index &gt;= self.num_rewards_for_average: 
      self.current_index = 0

  def get_average(self):
    return np.average(self.last_x_rewards)


class FileLogger():

  def __init__(self, file_name=&apos;progress.log&apos;):
    self.file_name = file_name
    self.clean_progress_file()

  def log(self, episode, steps, reward, average_reward):
    f = open(self.file_name, &apos;a+&apos;)
    f.write(f&quot;{episode};{steps};{reward};{average_reward}\n&quot;)
    f.close()

  def clean_progress_file(self):
    if os.path.exists(self.file_name):
      os.remove(self.file_name)
    f = open(self.file_name, &apos;a+&apos;)
    f.write(&quot;episode;steps;reward;average\n&quot;)
    f.close()</code></pre><p>Then we define the hyperparameters. </p><pre><code class="language-python">replay_buffer_size = 200000
learning_rate = 0.001
regularization_factor = 0.001
training_batch_size = 128
training_start = 256
max_episodes = 10000
max_steps = 1000
target_network_replace_frequency_steps = 1000
model_backup_frequency_episodes = 100
starting_epsilon = 1.0
minimum_epsilon = 0.01
epsilon_decay_factor_per_episode = 0.995
discount_factor = 0.99
train_every_x_steps = 4</code></pre><p>Finally it all comes together in the main loop. </p><pre><code class="language-python">replay_buffer = ReplayBuffer(replay_buffer_size)
model = create_model(learning_rate, regularization_factor)
target_model = copy_model(model)
epsilon = starting_epsilon
step_count = 0
average_reward_tracker = AverageRewardTracker(100)
file_logger = FileLogger()

for episode in range(max_episodes):
  print(f&quot;Starting episode {episode} with epsilon {epsilon}&quot;)

  episode_reward = 0
  state = env.reset()
  fraction_finished = 0.0
  state = np.append(state, fraction_finished)

  first_q_values = get_q_values(model, state)
  print(f&quot;Q values: {first_q_values}&quot;)
  print(f&quot;Max Q: {max(first_q_values)}&quot;)

  for step in range(1, max_steps + 1):
    step_count += 1
    q_values = get_q_values(model, state)
    action = select_action_epsilon_greedy(q_values, epsilon)
    new_state, reward, done, info = env.step(action)
    
    fraction_finished = (step + 1) / max_steps
    new_state = np.append(new_state, fraction_finished)
    
    episode_reward += reward

    if step == max_steps:
      print(f&quot;Episode reached the maximum number of steps. {max_steps}&quot;)
      done = True

    state_transition = StateTransition(state, action, reward, new_state, done)
    replay_buffer.add(state_transition)

    state = new_state

    if step_count % target_network_replace_frequency_steps == 0:
      print(&quot;Updating target model&quot;)
      target_model = copy_model(model)

    if replay_buffer.length() &gt;= training_start and step_count % train_every_x_steps == 0:
      batch = replay_buffer.get_batch(batch_size=training_batch_size)
      targets = calculate_target_values(model, target_model, batch, discount_factor)
      states = np.array([state_transition.old_state for state_transition in batch])
      train_model(model, states, targets)

    if done:
      break

  average_reward_tracker.add(episode_reward)
  average = average_reward_tracker.get_average()

  print(
    f&quot;episode {episode} finished in {step} steps with reward {episode_reward}. &quot;
    f&quot;Average reward over last 100: {average}&quot;)

  if episode != 0 and episode % model_backup_frequency_episodes == 0:
    backup_file = f&quot;model_{episode}.h5&quot;
    print(f&quot;Backing up model to {backup_file}&quot;)
    model.save(backup_file)

  epsilon *= epsilon_decay_factor_per_episode
  epsilon = max(minimum_epsilon, epsilon)</code></pre><p>When the training is done we can use the following code to visualise the training progress by loading the log file and plotting it using matplotlib.</p><pre><code class="language-python">data = pd.read_csv(file_logger.file_name, sep=&apos;;&apos;)

plt.figure(figsize=(20,10))
plt.plot(data[&apos;average&apos;])
plt.plot(data[&apos;reward&apos;])
plt.title(&apos;Reward&apos;)
plt.ylabel(&apos;Reward&apos;)
plt.xlabel(&apos;Episode&apos;)
plt.legend([&apos;Average reward&apos;, &apos;Reward&apos;], loc=&apos;upper right&apos;)
plt.show()</code></pre><h2 id="results">Results<br></h2><p>After training the model for 578 steps I stopped training the model, because the model stopped improving. The average score over 100 episodes at that point was 248.97; a lot more than the required score of 200.0 to beat the environment. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2020/08/progress.png" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"><figcaption>Average reward (per 100 episodes) vs episode reward</figcaption></figure><p>Now it was time to see the model in action. To do this I loaded the last version of the model, turned off the training and rendered the results to the screen. It is actually working!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://wingedsheep.com/content/images/2020/08/lunarlander_trained_cropped.gif" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"><figcaption>The trained model in action</figcaption></figure><p>Although the model manages to get a pretty good score I still think it is quite slow at landing. In a future iteration of the algorithm I might add a penalty for taking too long.</p><h3 id="notes">Notes</h3><p></p><p><strong>2021-10-14: How to reproduce the visualisations?</strong></p><p>I was asked a question about how to create the visualisations, and if they can be done in Colab. Here is my answer:<br><br>I didn&apos;t do the rendering on Google Colab, but on my local machine, because the OpenAI gym environment renders it in a window and this does not work in Colab.</p><p>Before you can run the script locally you need to have python and pip installed, and you need to install the following packages using &quot;pip&quot; <a href="https://pypi.org/project/pip/?ref=wingedsheep.com">https://pypi.org/project/pip/</a>.<br><br>* gym: <a href="https://pypi.org/project/gym/?ref=wingedsheep.com">https://pypi.org/project/gym/ </a><br>* tensorflow: <a href="https://pypi.org/project/tensorflow/?ref=wingedsheep.com">https://pypi.org/project/tensorflow/</a><br>* numpy: <a href="https://pypi.org/project/numpy/?ref=wingedsheep.com">https://pypi.org/project/numpy/</a><br>* box2d: <a href="https://pypi.org/project/box2d/?ref=wingedsheep.com">https://pypi.org/project/box2d/</a></p><p>Here is a script that you can run locally to visualise runs of a certain model:</p><pre><code class="language-python">import gym
from tensorflow.keras.models import load_model
from tensorflow.keras.losses import MeanSquaredError
import numpy as np

env = gym.make(&quot;LunarLander-v2&quot;)
filename = &quot;model_xxx.h5&quot;
trained_model = load_model(filename, custom_objects={&quot;masked_huber_loss&quot;: MeanSquaredError()})

evaluation_max_episodes = 10
evaluation_max_steps = 1000


def get_q_values(model, state):
    input = state[np.newaxis, ...]
    return model.predict(input)[0]


def select_best_action(q_values):
    return np.argmax(q_values)

rewards = []
for episode in range(1, evaluation_max_episodes + 1):
    state = env.reset()

    fraction_finished = 0.0
    state = np.append(state, fraction_finished)

    episode_reward = 0

    step = 1
    for step in range(1, evaluation_max_steps + 1):
        env.render()
        q_values = get_q_values(trained_model, state)
        action = select_best_action(q_values)
        new_state, reward, done, info = env.step(action)

        fraction_finished = (step + 1) / evaluation_max_steps
        new_state = np.append(new_state, fraction_finished)

        episode_reward += reward

        if step == evaluation_max_steps:
            print(f&quot;Episode reached the maximum number of steps. {evaluation_max_steps}&quot;)
            done = True

        state = new_state

        if done:
            break

    print(f&quot;episode {episode} finished in {step} steps with reward {episode_reward}.&quot;)
    rewards.append(episode_reward)

print(&quot;Average reward: &quot; + np.average(rewards))</code></pre><p>In the demo there is a line that says </p><pre><code class="language-python">filename = &quot;model_xxx.h5&quot;</code></pre><p>Here you can enter the name of the model you downloaded. If you look at the output of the Colab script you can see the models that are saved on the checkpoints. I updated the code in the blog to save the models as &quot;.h5&quot;, which is the keras format for saving models. The advantage of this is that it is a single file that you can download from your Colab environment.</p><figure class="kg-card kg-image-card"><img src="https://mail.google.com/mail/u/1?ui=2&amp;ik=af48e2df03&amp;attid=0.0.1&amp;permmsgid=msg-a:r1061937765910675345&amp;th=17898ef1574db2d7&amp;view=fimg&amp;sz=s0-l75-ft&amp;attbid=ANGjdJ_FHoraHgxRSWvgHiEiYXm0gh4rjhFz0-OXHYRFkUg5pIlcg5qbBUPPaINxTiBTKOWAj8HkDONPElSqNBNI3r00Su5pO4e_jsC7w3NGUncJhsptlRpLlO6nr7g&amp;disp=emb&amp;realattid=ii_kn216ic81" class="kg-image" alt="Solving Lunar Lander using DQN with Keras" loading="lazy"></figure><p>If you download a model you can put it in the same folder as the &quot;lunarlander_demo.py&quot; script, adjust the filename to point to and run the script.The environments of OpenAI have a &quot;render()&quot; function which renders the current state of the environment to the screen. This is used to render the runs.</p>]]></content:encoded></item></channel></rss>