<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yoga Pradana Ismail</title>
    <description>The latest articles on DEV Community by Yoga Pradana Ismail (@yogabyallwaysever).</description>
    <link>https://dev.to/yogabyallwaysever</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4115286%2F5e38bcad-681d-479a-b8d3-9c0f9726b71d.jpg</url>
      <title>DEV Community: Yoga Pradana Ismail</title>
      <link>https://dev.to/yogabyallwaysever</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yogabyallwaysever"/>
    <language>en</language>
    <item>
      <title>I built a single-file CLI that compiles a folder into a valid EPUB 3</title>
      <dc:creator>Yoga Pradana Ismail</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:30:44 +0000</pubDate>
      <link>https://dev.to/yogabyallwaysever/i-built-a-single-file-cli-that-compiles-a-folder-into-a-valid-epub-3-m9i</link>
      <guid>https://dev.to/yogabyallwaysever/i-built-a-single-file-cli-that-compiles-a-folder-into-a-valid-epub-3-m9i</guid>
      <description>&lt;p&gt;Around February last year, that was also when I started my career as a writer. I made a Light Novel and published it on Google Play Books, and at the time I built it directly in &lt;code&gt;.EPUB&lt;/code&gt; format using an Android app called ZisE. The app was simple enough for making EPUBs, but the annoying part was the tons of ads and how it forced you to go premium if you tried to bypass them by turning on airplane mode.&lt;/p&gt;

&lt;p&gt;Eventually I got fed up with the app, so I asked DeepSeek to build a web app called epubCreator that would make EPUBs with ZIP and metadata using local storage. But that ended up failing because the maintenance was a pain.&lt;/p&gt;

&lt;p&gt;Then I thought, why not ask DeepSeek to change how that web app worked into a Node.js script, since I was using Node for the first time. So, because it felt like a waste to have it sitting on my phone unused, I talked it through with DeepSeek until the code was done. And boom! The UX turned out to be really nice and easy to fix. The early versions still used arguments and flags, but now the script has grown a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; some features in this article haven't been discussed with DeepSeek yet. They're still as-is based on what I wanted initially, so they might not be fully polished or thoroughly tested.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr81njnwsl30o2vvekylx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr81njnwsl30o2vvekylx.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That script is now &lt;strong&gt;epubcreator.js&lt;/strong&gt; — a single Node file that takes a structured directory and produces an EPUB. Most of the technical decisions I talked through with DeepSeek.&lt;/p&gt;

&lt;p&gt;I'm pretty proud of how it turned out: almost every book I've made with this script, when checked on an EPUB validator site, scores an average of 100 — from metadata, code, all the way to accessibility. That's why this script is a good fit for EPUB developers working on standard, simple books, or indie writers like me who want a straightforward build flow without setting up a bunch of tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like
&lt;/h2&gt;

&lt;p&gt;A textbook project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-book/
├── config.txt          ← title, author, language, ISBN…
├── ord.txt             ← chapter order (optional)
├── Markdowns/          ← source .md files
│   ├── 01-intro.md
│   └── 02-chapter-one.md
└── EPUB/
    └── images/
        └── cover.png   ← required
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node epubcreator.js build
&lt;span class="c"&gt;# → builds/my-book.epub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A comic/manga project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-comic/
├── config.txt          ← type: comic | manga, reading_direction: ltr | rtl
├── ord.txt             ← *page-spread | alt text, per page
└── EPUB/
    ├── images/
    │   ├── cover.jpg
    │   └── pages/
    │       ├── ch1/0001.jpg
    │       └── ch2/0001.jpg
    └── xhtmls/         ← auto-generated from images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with no arguments and you get a full-screen TUI (raw ANSI escape codes — no Ink, no blessed — arrow keys, inline prompts, a scrolling log panel above the menu). If the terminal is too small or not a TTY, it falls back to a plain numeric menu. On first launch in a fresh project it fetches its own &lt;code&gt;node_modules&lt;/code&gt; from a GitHub branch, so &lt;code&gt;git clone &amp;amp;&amp;amp; node epubcreator.js&lt;/code&gt; genuinely works with zero setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feature list, briefly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Textbook mode&lt;/strong&gt; — reflowable EPUB 3, Markdown → XHTML, standard nested TOC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comic / Manga mode&lt;/strong&gt; — fixed-layout EPUB 3. LTR for comics, RTL for manga. Auto-detects double-page spreads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Converters&lt;/strong&gt; — MD ↔ XHTML, DOCX → MD (with heading detection by Word style or by font size), images → XHTML pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import&lt;/strong&gt; — point it at an existing &lt;code&gt;.epub&lt;/code&gt; and it reconstructs the project, extracts images, detects fixed-layout, and rebuilds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug&lt;/strong&gt; — file watcher that re-converts + re-builds on save.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; — wraps &lt;code&gt;epubcheck&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings&lt;/strong&gt; — &lt;code&gt;.epubcreator/settings.txt&lt;/code&gt; for &lt;code&gt;watch_delay&lt;/code&gt;, &lt;code&gt;auto_build&lt;/code&gt;, &lt;code&gt;overwrite_policy&lt;/code&gt;, and &lt;code&gt;default_type&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The internals (if you care)
&lt;/h2&gt;

&lt;p&gt;A few decisions I talked through with DeepSeek that I'm happy with, and a few I regret.&lt;/p&gt;

&lt;h3&gt;
  
  
  No image libraries
&lt;/h3&gt;

&lt;p&gt;To write correct &lt;code&gt;&amp;lt;meta name="viewport"&amp;gt;&lt;/code&gt; tags for fixed-layout pages, I needed image dimensions. &lt;code&gt;image-size&lt;/code&gt; is a fine package, but adding a dependency for ~80 lines felt wasteful, and I wanted the whole tool to stay self-contained.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;getImageSize()&lt;/code&gt; reads the buffer directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt;: magic number check + two &lt;code&gt;readUInt32BE&lt;/code&gt; calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JPEG&lt;/strong&gt;: walk markers until SOF, skip the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GIF&lt;/strong&gt;: LE &lt;code&gt;uint16&lt;/code&gt; at offsets 6 and 8.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP&lt;/strong&gt;: three sub-formats (VP8, VP8L, VP8X) — the annoying one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG&lt;/strong&gt;: regex on the file, falling back to &lt;code&gt;viewBox&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x89&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x50&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x4E&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x47&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readUInt32BE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readUInt32BE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not exhaustive — no HEIF, no AVIF, and I haven't stress-tested progressive JPEGs — but it's been correct on every file I've thrown at it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixed-layout with &lt;code&gt;page-spread-center&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;EPUB 3 fixed-layout lets you set &lt;code&gt;rendition:layout: prepaginated&lt;/code&gt; in the OPF, then control per-page spread behavior via &lt;code&gt;properties&lt;/code&gt; on each &lt;code&gt;&amp;lt;itemref&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;itemref&lt;/span&gt; &lt;span class="na"&gt;idref=&lt;/span&gt;&lt;span class="s"&gt;"page_12"&lt;/span&gt; &lt;span class="na"&gt;properties=&lt;/span&gt;&lt;span class="s"&gt;"page-spread-center"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For manga (RTL), single-page spreads alternate right/left. The builder tracks which side the previous page landed on and assigns the next one accordingly. Double-page spreads (two-page illustrations) reset the alternation. If auto-detection gets it wrong, you override it in &lt;code&gt;ord.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ch1/0001.xhtml
*ch1/0002.xhtml | big reveal
!ch1/0003.xhtml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; forces center-spread, &lt;code&gt;!&lt;/code&gt; forces single, no prefix means auto-detect (aspect ratio &amp;gt; 1.4 → double). The &lt;code&gt;|&lt;/code&gt; part is the TOC title / alt text for that page.&lt;/p&gt;

&lt;h3&gt;
  
  
  The dependency trick
&lt;/h3&gt;

&lt;p&gt;This is the decision I talked through with DeepSeek and regret the least, even though it's a bit weird.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;update module&lt;/code&gt; fetches a tarball from the &lt;code&gt;modules&lt;/code&gt; branch of the repo and extracts a prebuilt &lt;code&gt;node_modules/&lt;/code&gt;. &lt;code&gt;update config&lt;/code&gt; does the same for a &lt;code&gt;.epubcreator/&lt;/code&gt; folder. On first launch with no &lt;code&gt;node_modules/&lt;/code&gt;, the TUI runs &lt;code&gt;update module&lt;/code&gt; automatically before showing the menu.&lt;/p&gt;

&lt;p&gt;The point is to make a fresh clone genuinely useful — &lt;code&gt;git clone&lt;/code&gt;, &lt;code&gt;node epubcreator.js&lt;/code&gt;, done — for people who might not have npm installed, or who are on Android/Termux and don't want to fight the toolchain. Downside: if GitHub is unreachable or the branch is gone, you're back to &lt;code&gt;npm install&lt;/code&gt; manually. Fair trade for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do (yet)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No EPUB 2, no MOBI.&lt;/strong&gt; You'll still need &lt;code&gt;kindlegen&lt;/code&gt; or Calibre for legacy Kindles. EPUB 3 → KDP handles conversion for newer ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No image processing.&lt;/strong&gt; No resize, no compression. Pipe through &lt;code&gt;sharp&lt;/code&gt; or ImageMagick upstream.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No test suite.&lt;/strong&gt; I know. It's next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows needs Git Bash&lt;/strong&gt; for the auto-download (it shells out to &lt;code&gt;tar&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I recommend using it
&lt;/h2&gt;

&lt;p&gt;My recommended setup: clone the repo once as a script source, then &lt;strong&gt;copy &lt;code&gt;epubcreator.js&lt;/code&gt; from the cloned repo into your EPUB project directory&lt;/strong&gt;. I suggest putting projects under &lt;code&gt;~/projects/epubs/{project-name}/&lt;/code&gt;, so each book gets its own folder and doesn't get mixed up with the source repo.&lt;/p&gt;

&lt;p&gt;The reason is simple: almost all operations in this script use &lt;code&gt;process.cwd()&lt;/code&gt;, so it works most predictably when run from inside the project directory that contains &lt;code&gt;config.txt&lt;/code&gt;, &lt;code&gt;ord.txt&lt;/code&gt;, &lt;code&gt;Markdowns/&lt;/code&gt;, and &lt;code&gt;EPUB/&lt;/code&gt;. By putting a copy of &lt;code&gt;epubcreator.js&lt;/code&gt; there, you just &lt;code&gt;cd&lt;/code&gt; into the project folder and run &lt;code&gt;node epubcreator.js&lt;/code&gt; without having to remember the script path.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# clone the repo once as a script source&lt;/span&gt;
git clone https://github.com/YogabyAllwaysever/epubcreator.js.git ~/tools/epubcreator.js

&lt;span class="c"&gt;# set up the EPUB project directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/epubs/nama-proyek
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/tools/epubcreator.js/epubcreator.js ~/projects/epubs/nama-proyek/

&lt;span class="c"&gt;# go into the project and run it&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/epubs/nama-proyek
node epubcreator.js createdir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After &lt;code&gt;createdir&lt;/code&gt;, fill in the project according to the structure you want (&lt;code&gt;config.txt&lt;/code&gt;, &lt;code&gt;ord.txt&lt;/code&gt;, &lt;code&gt;Markdowns/&lt;/code&gt;, &lt;code&gt;EPUB/images/&lt;/code&gt;, etc.), then run &lt;code&gt;node epubcreator.js build&lt;/code&gt; to build. On first launch in a new project, the script will fetch its own &lt;code&gt;node_modules&lt;/code&gt; from the GitHub branch, so you don't need to set up npm manually.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;epubcreator.js&lt;/code&gt; in the source repo gets updated later, just copy the file again into the project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; ~/tools/epubcreator.js/epubcreator.js ~/projects/epubs/nama-proyek/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, the cloned repo stays clean as a script source, while each EPUB project has its own working directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick try
&lt;/h2&gt;

&lt;p&gt;If you just want to see the script run without setting up a project, clone the repo and run it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/YogabyAllwaysever/epubcreator.js.git
&lt;span class="nb"&gt;cd &lt;/span&gt;epubcreator.js
node epubcreator.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MIT-licensed. Issues and angry bug reports welcome — especially around manga spreads and accessibility metadata, where I know I'm weakest.&lt;/p&gt;

&lt;p&gt;If you ship EPUBs, I'd love to know what breaks for you.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>node</category>
      <category>javascript</category>
      <category>epub</category>
    </item>
    <item>
      <title>A project that I feel I'm starting to abandon.</title>
      <dc:creator>Yoga Pradana Ismail</dc:creator>
      <pubDate>Tue, 08 Sep 2026 09:14:42 +0000</pubDate>
      <link>https://dev.to/yogabyallwaysever/a-project-that-i-feel-im-starting-to-abandon-30ij</link>
      <guid>https://dev.to/yogabyallwaysever/a-project-that-i-feel-im-starting-to-abandon-30ij</guid>
      <description>&lt;p&gt;Hello, I am a developer who is about to turn 15 years old. A year ago—precisely in September 2025—I started learning the Vanilla Stack by building a web app to interact with the Gemini API, and all of this code was written with AI; I was the one providing the workflow.&lt;/p&gt;

&lt;p&gt;The web app's name is &lt;a href="https://allwaysevermirai.netlify.app/" rel="noopener noreferrer"&gt;MirAI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq13ol1jwgexdh82zob60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq13ol1jwgexdh82zob60.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is my first coding project, which unfortunately I am now starting to leave behind in terms of development, as I tend to focus on building an ebook catalog platform for a publisher that I created myself, which leans more toward digital publishing rather than a cool SPA like &lt;a href="https://allwaysevermirai.netlify.app/" rel="noopener noreferrer"&gt;MirAI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those reading this thread, is anyone interested in continuing the development of MirAI? I will invite you to collaborate after you submit an &lt;a href="https://github.com/Allwaysever/MirAI/issues" rel="noopener noreferrer"&gt;issue on MirAI's GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your help would be much appreciated.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>vanillastack</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
