<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss/atom-styles.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Irchiinnuss</title>
  <subtitle>A universe similar to ours, a distant one. Joining past, present and future.</subtitle>
  <link href="https://irchiinnuss.com//atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://irchiinnuss.com/" rel="alternate" type="text/html"/>
  <updated>2026-05-29T06:55:45.749Z</updated>
  <language>en</language>
  <id>https://irchiinnuss.com//</id>
  <author>
    <name>Komediruzecki</name>
    <uri>https://irchiinnuss.com/</uri>
  </author>
  <generator uri="https://github.com/Dnzzk2/Litos" version="5.0">Astro Litos Theme</generator>
  <rights>Copyright © 2026 Komediruzecki</rights>
  
  <entry>
    <title>A story about alternate views</title>
    <link href="https://irchiinnuss.com//posts/a-story-about-alternate-views" rel="alternate" type="text/html"/>
    <id>https://irchiinnuss.com//posts/a-story-about-alternate-views</id>
    <updated>2026-06-01T00:00:00.000Z</updated>
    <published>2026-06-01T00:00:00.000Z</published>
    <author>
      <name>maff</name>
    </author>
    <summary type="text">Entails story about a group of friends, encompased in their own distinct memories, close, but far apart, ready to take up on challenge but scared of consequences.</summary>
    <content type="html"><![CDATA[<img src="https://irchiinnuss.com/_astro/cover.7-E_J0u9_Z19SPhO.webp" alt="A story about alternate views" style="width: 100%; height: auto; margin-bottom: 1em;" />
<h2>Preface</h2>
<div><div><div></div><div>NOTE</div></div><div><p>If you have discomfort during reading this,
please take a break and take care.</p></div></div>
<h3>The House</h3>
<p>If you find yourself alone in the room, it might
be because your friends have abandoned you.</p>
<p>The evening was still young, a group of friends
entered a house, looking to have fun by
enjoying their stories, sharing what no one else
would have the privilege to hear.</p>
<p>They didn’t know that the house has its own
stories to tell.</p>
<p>After a while, the doors started opening in the
small cabin they entered. There were doors
everywhere, they looked odd, all stud in silence.</p>
<p>[name-me] had a first vision, he knew something
bad was going to happen.</p>
<p>All were instructed to finish a task, a simple,
benign thing, that almost felt like pleasure, fun
activity. But [name-me] knew one less will be left
afterwards.</p>
<p>And so they solved the puzzle, they enjoyed the
experience but left in doubt, what is going on?
Are we all in a different place?</p>
<p>Shortly after, a second round started.
This time, [name-me] got its first vision.
The vision was about the consequences of
getting your freedom.</p>
<p>One of the friends was locked, they needed to free
him, mostly from his own history, but as soon as
they would manage, he would be free, free to
catch. Since the next round was all about catching
the pray, as soon as it is free, it must be caught
again, and no one can stop themselves but to
continue whatever the house has to say.</p>
<p>The [name-me-2] got caught in the most fearful
experience ever, started shaking and losing its
mind, [name-me-2] didn’t know what was real
anymore.</p>
<p>The house has its ways, and the doors started
suddenly closing, there were no more escape, the
loud thunderous sounds started portruding the
space, making the unpleasent experience feel like
a nightmare.</p>
<ul>
<li>Note: The [name-me] is missing actor name, it
should be generated and adjusted to the story
before the processing of the story starts.</li>
</ul>
<div><div><div></div><div>TIP</div></div><div><p>To read more similar stories, please subscribe
to our monthly newsletter</p></div></div>
<h3>End</h3>]]></content>
    <category term="adventure" />
    <category term="dimensions" />
    <category term="friends" />
  </entry>
  <entry>
    <title>Individuals - Alternate Views</title>
    <link href="https://irchiinnuss.com//posts/individuals-alternate-views" rel="alternate" type="text/html"/>
    <id>https://irchiinnuss.com//posts/individuals-alternate-views</id>
    <updated>2026-05-29T00:00:00.000Z</updated>
    <published>2026-05-29T00:00:00.000Z</published>
    <author>
      <name>Komediruzecki</name>
    </author>
    <summary type="text">A gathering of friends unravels as the walls of an ancient sanctuary begin to breathe, forcing each to confront the terrifying architecture of their own divergent realities.</summary>
    <content type="html"><![CDATA[<img src="https://irchiinnuss.com/_astro/cover.7-E_J0u9_Z19SPhO.webp" alt="Individuals - Alternate Views" style="width: 100%; height: auto; margin-bottom: 1em;" />
<h2>Preface</h2>
<div><div><div></div><div>NOTE</div></div><div><p>If you find yourself experiencing discomfort as the walls of this narrative close in, please step away. The architecture of the mind is fragile, and this tale is designed to test its load-bearing pillars.</p></div></div>
<h3>Chapter I: The Sanctuary of Echoes</h3>
<p>If you ever find yourself entirely alone in a room that was crowded just moments prior, it might not be a trick of the light; it might simply be the universe reconfiguring itself to reveal how thoroughly your friends have abandoned you.</p>
<p>The evening was still tethered to its youth when the quintet crossed the threshold of the manor. It was an estate that seemed to exist slightly out of phase with the rest of Irchiinnuss—a place where the past, present, and future bled together like watercolors left in the rain. They had come seeking sanctuary, a secluded haven to unburden themselves of secrets too heavy for the waking world. Kaelen, Elara, Valerius, Julian, and Silas—each bound by a shared history, yet imprisoned in their own distinctly tailored memories.</p>
<p>They poured their confessions into the quiet air, unaware that the house was not merely a vessel for their voices, but a ravenous listener. It harbored stories of its own, woven into the very timber and stone, waiting for the right resonance to awaken.</p>
<h3>Chapter II: The First Threshold</h3>
<p>The shift was imperceptible at first—a subtle thickening of the atmosphere, a drop in the ambient temperature that raised the hair on Elara’s arms. Then, the doors appeared.</p>
<p>Where there was once solid oak paneling, narrow passages fractured the geometry of the room. They stood in terrifying silence, framing abysses of profound, consuming darkness. Valerius scoffed, his arrogance a thin veil draped over a sudden, violently pulsing terror, while Elara stepped back, her practical mind desperately trying to rationalize the impossible architecture.</p>
<p>It was Kaelen who felt it first. A vision, sharp and blinding as splintered glass, pierced the veil of his consciousness. He tasted copper and ash; he saw the inevitable erosion of their fellowship. He knew, with a certainty that chilled the marrow of his bones, that a toll would be extracted.</p>
<p>A voice that resonated not in the room, but directly against their skulls, instructed them to complete a task. It was a deceptively simple puzzle—a benign interplay of light and mirrors that, for a fleeting moment, masqueraded as an innocent parlor game. They solved it in frantic unison, the thrill of collaboration masking the underlying dread. Yet, as the final mechanism clicked into place, a suffocating unease settled over Kaelen. <em>One less will remain,</em> the intuition whispered. <em>One less will make the journey back.</em></p>
<p>They stood in the aftermath of their hollow victory, staring at each other through eyes clouded with suspicion. Were they still occupying the same physical space, or had the room already bifurcated their realities?</p>
<h3>Chapter III: The Burden of Liberation</h3>
<p>Before the dust of their anxiety could settle, the architecture shifted again. The second crucible had begun.</p>
<p>This time, Kaelen’s vision was not a mere premonition; it was a deluge of temporal collapse. He witnessed the devastating paradox of liberation. Silas, the quietest among them, had been swallowed by one of the alcoves, sealed behind a barrier composed entirely of his own unresolved regrets. He was locked within the amber of his own history, suspended in a state of perpetual torment.</p>
<p>The task demanded they shatter the amber. They had to emancipate Silas from the prison of his past. But Kaelen’s foresight offered a cruel caveat: the moment Silas tasted freedom, he would transform into the hunted. The house operated on the brutal logic of equilibrium—to release a captive was to trigger the hunt. Once unbound, Silas would become the prey, and the remaining four would be compelled by the house’s infectious will to become his pursuers.</p>
<h3>Chapter IV: The Convergence of Nightmares</h3>
<p>The barrier broke with the sound of a thousand shattering mirrors. Silas tumbled into the center of the room, gasping for air that tasted of static and ozone.</p>
<p>Instantly, the atmosphere weaponized. The thrill of the hunt overrode their rational minds. Julian was the first to succumb. Caught in the gravitational pull of sheer, unadulterated terror, his psyche fractured. He began to shake violently, his eyes darting frantically as the boundaries between friend and predator dissolved. Julian was no longer observing reality; he was drowning in a hallucinatory nightmare where every shadow possessed teeth, and every friend wore the face of a stranger.</p>
<p>“Julian, look at me!” Elara screamed, but her voice was swallowed by the sudden, thunderous groans of the manor itself.</p>
<p>The house had grown tired of its guests. The doors that had materialized earlier began to slam shut, one by one, with the deafening finality of a crypt being sealed. The labyrinth was contracting. There was no escape, only the suffocating realization that the walls were moving in.</p>
<p>The thunderous cacophony of the shifting architecture drowned out Julian’s manic laughter, Kaelen’s desperate pleas, and the sound of Silas running blindly into the dark. It was no longer a puzzle to be solved. It was a nightmare demanding to be endured.</p>
<hr />
<div><div><div></div><div>TIP</div></div><div><p>The universe of Irchiinnuss is vast, and its stories are infinite. If you wish to chart these dark constellations with us, consider subscribing to the monthly manifest.</p></div></div>]]></content>
    <category term="adventure" />
    <category term="dimensions" />
    <category term="friends" />
    <category term="mystery" />
  </entry>
  <entry>
    <title>Photos Page Config</title>
    <link href="https://irchiinnuss.com//posts/photos" rel="alternate" type="text/html"/>
    <id>https://irchiinnuss.com//posts/photos</id>
    <updated>2025-08-10T00:00:00.000Z</updated>
    <published>2025-08-10T00:00:00.000Z</published>
    <author>
      <name>Dnzzk2</name>
    </author>
    <summary type="text">Current implementation notes for the Photos page, including PHOTOS_CONFIG, PhotosList, and getPhotos().</summary>
    <content type="html"><![CDATA[<img src="https://irchiinnuss.com/_astro/cover.Do3E5r53_Z1UoMh2.webp" alt="Photos Page Config" style="width: 100%; height: auto; margin-bottom: 1em;" />
<p>This document describes the current implementation of the Photos page.</p>
<h2>Current file structure</h2>
<ul>
<li><code>src/pages/photos/index.astro</code>
<ul>
<li>Reads page text from <code>PHOTOS_CONFIG</code></li>
<li>Reads timeline data from <code>PhotosList</code></li>
</ul>
</li>
<li><code>src/config.ts</code>
<ul>
<li>Stores <code>PHOTOS_CONFIG</code></li>
</ul>
</li>
<li><code>src/lib/photos.ts</code>
<ul>
<li>Stores <code>PhotosList</code></li>
<li>Auto-imports photo files</li>
<li>Converts one folder of images into <code>Photo[]</code> with <code>getPhotos()</code></li>
</ul>
</li>
<li><code>src/types.ts</code>
<ul>
<li>Defines <code>PhotoData</code>, <code>Photo</code>, and <code>PolaroidVariant</code></li>
</ul>
</li>
<li><code>src/components/photos/PolaroidCard.tsx</code>
<ul>
<li>Maps each <code>variant</code> to the actual card size</li>
</ul>
</li>
</ul>
<h2>Page text</h2>
<p>The page title and intro text come from <code>src/config.ts</code>.</p>
<pre><code>export const PHOTOS_CONFIG: PhotosConfig = {
  title: 'Photos',
  description: 'Here I will record some photos taken in daily life.',
  introduce: 'Here I will record some photos taken in daily life.',
}
</code></pre>
<p><code>src/pages/photos/index.astro</code> renders the page like this:</p>
<pre><code>---
import { PHOTOS_CONFIG } from '~/config'
import { PhotosList } from '~/lib/photos'

const { title, description, introduce } = PHOTOS_CONFIG
---

&lt;Layout {title} {description}&gt;
  &lt;PageTitle {title} {introduce} /&gt;
  &lt;PhotoTimeline photoData={PhotosList} /&gt;
&lt;/Layout&gt;
</code></pre>
<h2>PhotosList</h2>
<p><code>PhotosList</code> is defined in <code>src/lib/photos.ts</code>. Each item is one timeline entry.</p>
<pre><code>export const PhotosList: PhotoData[] = [
  {
    title: 'Ningbo - Botanical Garden',
    icon: { type: 'emoji', value: '🌼' },
    description: 'It was early spring, so I went to see the cherry blossoms.',
    date: '2026-03-07',
    travel: '',
    photos: getPhotos(
      '2026-03-07-botanicalGarden',
      'Early spring cherry blossoms at the botanical garden',
      ['3x4', '3x4', '3x4', '3x4', '3x4', '3x4']
    ),
  },
]
</code></pre>
<h3>PhotoData fields</h3>

































<table><thead><tr><th>Field</th><th>Meaning</th></tr></thead><tbody><tr><td><code>title</code></td><td>Timeline title</td></tr><tr><td><code>icon</code></td><td>Left-side timeline icon</td></tr><tr><td><code>description</code></td><td>Optional timeline description</td></tr><tr><td><code>date</code></td><td>Timeline date</td></tr><tr><td><code>travel</code></td><td>Optional extra label</td></tr><tr><td><code>photos</code></td><td>Array of <code>Photo</code> objects</td></tr></tbody></table>
<h2>How <code>getPhotos()</code> works</h2>
<p>Current implementation:</p>
<pre><code>function getPhotos(dir: string, alt: string, variants: PolaroidVariant[]): Photo[] {
  return Object.entries(photoModules)
    .filter(([path]) =&gt; path.includes(`/${dir}/`))
    .sort(([a], [b]) =&gt; a.localeCompare(b))
    .map(([, mod], index) =&gt; {
      const img = mod.default
      return {
        src: img,
        alt,
        width: img.width,
        height: img.height,
        variant: variants[index] || '4x3',
      }
    })
}
</code></pre>
<h3>Parameter meaning</h3>





















<table><thead><tr><th>Parameter</th><th>Meaning</th></tr></thead><tbody><tr><td><code>dir</code></td><td>Folder name under <code>src/assets/photos</code></td></tr><tr><td><code>alt</code></td><td>Shared <code>alt</code> text for every image returned from that folder</td></tr><tr><td><code>variants</code></td><td>Ratio list matched to the sorted images by index</td></tr></tbody></table>
<h3>Important behavior</h3>
<ol>
<li><code>getPhotos()</code> first filters all imported images by folder name.</li>
<li>It then sorts the matched file paths with <code>localeCompare</code>.</li>
<li>It creates the final <code>Photo[]</code> in that sorted order.</li>
<li><code>variants[index]</code> is applied to the photo at the same index.</li>
<li>If one index is missing in <code>variants</code>, that photo falls back to <code>'4x3'</code>.</li>
</ol>
<h3>How the third parameter is matched</h3>
<p>The third parameter is not random metadata. It is position-based.</p>
<p>For this code:</p>
<pre><code>photos: getPhotos(
  '2026-03-07-botanicalGarden',
  'Early spring cherry blossoms at the botanical garden',
  ['3x4', '3x4', '3x4', '3x4', '3x4', '3x4']
)
</code></pre>
<p>Assume the folder <code>src/assets/photos/2026-03-07-botanicalGarden/</code> contains these files after sorting:</p>
<pre><code>01.webp
02.webp
03.webp
04.webp
05.webp
06.webp
</code></pre>
<p>Then the mapping is:</p>

































<table><thead><tr><th>File</th><th>Applied variant</th></tr></thead><tbody><tr><td><code>01.webp</code></td><td>first item in the array -&gt; <code>3x4</code></td></tr><tr><td><code>02.webp</code></td><td>second item in the array -&gt; <code>3x4</code></td></tr><tr><td><code>03.webp</code></td><td>third item in the array -&gt; <code>3x4</code></td></tr><tr><td><code>04.webp</code></td><td>fourth item in the array -&gt; <code>3x4</code></td></tr><tr><td><code>05.webp</code></td><td>fifth item in the array -&gt; <code>3x4</code></td></tr><tr><td><code>06.webp</code></td><td>sixth item in the array -&gt; <code>3x4</code></td></tr></tbody></table>
<p>So if you want the first photo in the folder to use <code>3x4</code>, the first item in the third array must be <code>3x4</code>.</p>
<p>If you want mixed ratios, write them in the same order as the sorted files:</p>
<pre><code>photos: getPhotos('2025-03-01-dongqianhu', 'Ningbo - Dongqian Lake', ['4x5', '1x1', '4x3'])
</code></pre>
<p>That means:</p>
<ul>
<li>first sorted image -&gt; <code>4x5</code></li>
<li>second sorted image -&gt; <code>1x1</code></li>
<li>third sorted image -&gt; <code>4x3</code></li>
</ul>
<p>If the folder contains more photos than the array length:</p>
<pre><code>photos: getPhotos('example-folder', 'Example alt', ['3x4', '4x5'])
</code></pre>
<p>Then:</p>
<ul>
<li>first sorted image -&gt; <code>3x4</code></li>
<li>second sorted image -&gt; <code>4x5</code></li>
<li>third sorted image and later -&gt; default <code>4x3</code></li>
</ul>
<h2>Supported variants</h2>
<p><code>PolaroidVariant</code> is currently:</p>
<pre><code>export type PolaroidVariant = '1x1' | '4x5' | '4x3' | '3x4' | '9x16'
</code></pre>
<p>Current size mapping in <code>src/components/photos/PolaroidCard.tsx</code>:</p>
<pre><code>const polaroidVariants: Record&lt;PolaroidVariant, string&gt; = {
  '1x1': 'w-20 h-20',
  '4x5': 'w-20 h-24',
  '4x3': 'w-20 h-16',
  '3x4': 'w-[4.5rem] h-24',
  '9x16': 'w-20 h-32',
}
</code></pre>
<h2>How to add a new timeline entry</h2>
<ol>
<li>Create a folder under <code>src/assets/photos/</code>, for example <code>2026-04-01-spring-walk</code>.</li>
<li>Put image files into that folder.</li>
<li>Make sure the file names are in the order you want after sorting.</li>
<li>Add one item to <code>PhotosList</code> in <code>src/lib/photos.ts</code>.</li>
<li>Pass the third argument to <code>getPhotos()</code> in the same order as the sorted files.</li>
</ol>
<p>Example:</p>
<pre><code>{
  title: 'Spring Walk',
  icon: { type: 'emoji', value: '🌿' },
  description: 'A short walk with a camera.',
  date: '2026-04-01',
  travel: '',
  photos: getPhotos(
    '2026-04-01-spring-walk',
    'Photos from a spring walk',
    ['3x4', '4x3', '4x5', '4x3']
  ),
}
</code></pre>
<h2>Notes</h2>
<ul>
<li><code>alt</code> is applied to every photo returned from the same folder.</li>
<li>The order is determined by sorted file path, not by import order in the editor.</li>
<li>If you rename files, the sort order may change, and the <code>variants</code> array will then map to different photos.</li>
</ul>]]></content>
    <category term="Litos" />
    <category term="Documentation" />
  </entry>
</feed>