<?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: ahmed alkrmani</title>
    <description>The latest articles on DEV Community by ahmed alkrmani (@njf).</description>
    <link>https://dev.to/njf</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%2F4101941%2F4f9d2d64-f4a1-4961-a68b-19bed2203847.png</url>
      <title>DEV Community: ahmed alkrmani</title>
      <link>https://dev.to/njf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/njf"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>ahmed alkrmani</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:26:10 +0000</pubDate>
      <link>https://dev.to/njf/-2o4d</link>
      <guid>https://dev.to/njf/-2o4d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7" class="crayons-story__hidden-navigation-link"&gt;Building an AI presentation generator that actually handles Arabic (RTL) right&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/njf" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4101941%2F4f9d2d64-f4a1-4961-a68b-19bed2203847.png" alt="njf profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/njf" class="crayons-story__secondary fw-medium m:hidden"&gt;
              ahmed alkrmani
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                ahmed alkrmani
                
                
              
              &lt;div id="story-author-preview-content-4531852" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/njf" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4101941%2F4f9d2d64-f4a1-4961-a68b-19bed2203847.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;ahmed alkrmani&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 31&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7" id="article-link-4531852"&gt;
          Building an AI presentation generator that actually handles Arabic (RTL) right
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/arabic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;arabic&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Building an AI presentation generator that actually handles Arabic (RTL) right</title>
      <dc:creator>ahmed alkrmani</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:25:36 +0000</pubDate>
      <link>https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7</link>
      <guid>https://dev.to/njf/building-an-ai-presentation-generator-that-actually-handles-arabic-rtl-right-4op7</guid>
      <description>&lt;p&gt;Most "AI presentation maker" tools fall apart the moment you type Arabic. Text drifts to the wrong side, bullet points flip, punctuation jumps to the end of the line, and the exported file looks broken. That single problem is why I ended up building &lt;a href="https://doocuai.com/" rel="noopener noreferrer"&gt;DoocuAI&lt;/a&gt; — an AI tool that turns a topic or a PDF into a full, editable PowerPoint deck, with right-to-left support treated as a first-class citizen instead of an afterthought.&lt;/p&gt;

&lt;p&gt;This post is about the parts that were actually hard, and what I learned shipping it for real students.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I was actually solving
&lt;/h2&gt;

&lt;p&gt;I'm building for university students in Iraq and the wider Arab world. A typical "seminar" (a graded classroom presentation) eats &lt;strong&gt;2–5 hours&lt;/strong&gt; of a student's time — and almost none of that time is spent thinking. It goes into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading scattered sources and pulling out the key points&lt;/li&gt;
&lt;li&gt;Rewriting paragraphs into short bullet lines&lt;/li&gt;
&lt;li&gt;Picking a template, fixing colors, aligning boxes on every slide&lt;/li&gt;
&lt;li&gt;Fighting RTL layout in tools that were never designed for it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The insight was simple: the &lt;em&gt;thinking&lt;/em&gt; is the student's job, the &lt;em&gt;mechanical formatting&lt;/em&gt; is not. So the tool should collapse the mechanical part to seconds and hand back an editable file — not a locked image, not a screenshot, an actual &lt;code&gt;.pptx&lt;/code&gt; the student owns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack (kept deliberately boring)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; — Hosting, Firestore, and Auth. Boring on purpose: I wanted to ship, not to run infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A thin API layer&lt;/strong&gt; in front of the model calls, so the model provider and prompts can change without touching the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An LLM&lt;/strong&gt; for content generation — structuring the deck, writing each slide, keeping it academic rather than fluffy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-side deck generation&lt;/strong&gt; producing standard &lt;code&gt;.pptx&lt;/code&gt; output that opens in PowerPoint, Google Slides, Keynote, or LibreOffice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60+ themeable templates&lt;/strong&gt; so the same generated content can be re-skinned instantly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing here is exotic. The interesting engineering was almost entirely in two places: &lt;strong&gt;making the LLM output a deck instead of an essay&lt;/strong&gt;, and &lt;strong&gt;RTL&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting an LLM to output a &lt;em&gt;deck&lt;/em&gt;, not prose
&lt;/h2&gt;

&lt;p&gt;An LLM will happily write you five paragraphs about photosynthesis. That's the opposite of a good slide. A good slide is one idea, a few short lines, and a title.&lt;/p&gt;

&lt;p&gt;Two things helped the most:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate the structure first, content second.&lt;/strong&gt; Ask the model for a slide &lt;em&gt;outline&lt;/em&gt; (cover → intro → objectives → main axes → results → conclusion → references), validate it, then fill each slide. Splitting it stopped the "wall of text on slide 3" problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrain aggressively at the slide level.&lt;/strong&gt; Hard limits on bullet count and line length in the prompt, plus a post-processing pass that trims anything that slips through. The model is much better at rewriting-to-fit than at self-limiting up front.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The academic structure being fixed and predictable turned out to be a feature, not a limitation — it's exactly what a grading committee expects to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  RTL is where tools quietly break
&lt;/h2&gt;

&lt;p&gt;Here's the part I underestimated. Rendering Arabic on a web page is mostly solved (&lt;code&gt;dir="rtl"&lt;/code&gt;, &lt;code&gt;unicode-bidi&lt;/code&gt;, a decent font). Rendering Arabic &lt;em&gt;inside a generated presentation file&lt;/em&gt; is a different world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mixed content.&lt;/strong&gt; A single line might be Arabic with an English acronym and a number: &lt;code&gt;نظام ECTS بنسبة 40%&lt;/code&gt;. Naive RTL flips the whole run and the &lt;code&gt;40%&lt;/code&gt; lands in the wrong place. You need proper bidirectional handling (the Unicode Bidi algorithm), not a blanket "reverse the string."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alignment ≠ direction.&lt;/strong&gt; Setting text to right-aligned is not the same as setting the paragraph direction to RTL. Get one without the other and bullets, indentation, and list markers end up on the wrong side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Punctuation and parentheses.&lt;/strong&gt; Brackets and quotation marks are direction-aware. &lt;code&gt;(محتوى)&lt;/code&gt; has to keep its parentheses wrapping the right side, which "just reverse it" gets wrong every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fonts.&lt;/strong&gt; Plenty of otherwise-nice fonts have weak or broken Arabic glyphs, so template choice has to be validated against the actual script, not eyeballed in Latin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix wasn't one clever trick — it was refusing to treat RTL as a toggle. Direction, alignment, list markers, and numeral shaping each get set explicitly per paragraph, and templates are tested with real Arabic content before they ship. Unglamorous, but it's the difference between a file a student can hand in and one they have to redo by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons that generalized
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boring infrastructure buys you speed.&lt;/strong&gt; Every hour not spent on servers went into the two problems that actually mattered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure-then-fill beats one-shot generation&lt;/strong&gt; for anything that has a required shape — decks, reports, forms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n is not a feature you add at the end.&lt;/strong&gt; If RTL isn't designed in from slide one, you rebuild. Ask me how I know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give users the real file.&lt;/strong&gt; Handing back an editable &lt;code&gt;.pptx&lt;/code&gt; instead of a locked export changed how people trusted the tool. Ownership matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it / poke holes in it
&lt;/h2&gt;

&lt;p&gt;It's live and free to start at &lt;strong&gt;&lt;a href="https://doocuai.com/" rel="noopener noreferrer"&gt;doocuai.com&lt;/a&gt;&lt;/strong&gt; — type a topic (or upload a PDF), pick a template, and you get an editable deck in seconds. If you work with RTL languages and want to tell me everything I still got wrong, I genuinely want to hear it — that feedback loop is how the Arabic handling got good in the first place.&lt;/p&gt;

&lt;p&gt;If you're building anything that generates documents from LLM output, I'm happy to go deeper on the structure-first prompting or the bidi handling in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>arabic</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>ahmed alkrmani</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:10:43 +0000</pubDate>
      <link>https://dev.to/njf/-41j</link>
      <guid>https://dev.to/njf/-41j</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b" class="crayons-story__hidden-navigation-link"&gt;Most AI slide makers break the moment you type Arabic. I built DoocuAI: type a topic or drop a PDF and get an editable PowerPoint with real RTL support and 60+ templates. Free to try: doocuai.com&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-status"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/njf" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4101941%2F4f9d2d64-f4a1-4961-a68b-19bed2203847.png" alt="njf profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/njf" class="crayons-story__secondary fw-medium m:hidden"&gt;
              ahmed alkrmani
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                ahmed alkrmani
                
                
              
              &lt;div id="story-author-preview-content-4531785" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/njf" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4101941%2F4f9d2d64-f4a1-4961-a68b-19bed2203847.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;ahmed alkrmani&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 31&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-status"&gt;
        &lt;a href="https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b" id="article-link-4531785"&gt;
          Most AI slide makers break the moment you type Arabic. I built DoocuAI: type a topic or drop a PDF and get an editable PowerPoint with real RTL support and 60+ templates. Free to try: doocuai.com
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Most AI slide makers break the moment you type Arabic. I built DoocuAI: type a topic or drop a PDF and get an editable PowerPoint with real RTL support and 60+ templates. Free to try: doocuai.com</title>
      <dc:creator>ahmed alkrmani</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:10:22 +0000</pubDate>
      <link>https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b</link>
      <guid>https://dev.to/njf/most-ai-slide-makers-break-the-moment-you-type-arabic-i-built-doocuai-type-a-topic-or-drop-a-pdf-2n6b</guid>
      <description></description>
    </item>
  </channel>
</rss>
