<?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: Hadi Rizvi</title>
    <description>The latest articles on DEV Community by Hadi Rizvi (@hadi_rizvi_093).</description>
    <link>https://dev.to/hadi_rizvi_093</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3915123%2Fe6ac2e81-4bbd-4e04-a4b6-ab93a4a8db87.png</url>
      <title>DEV Community: Hadi Rizvi</title>
      <link>https://dev.to/hadi_rizvi_093</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hadi_rizvi_093"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Hadi Rizvi</dc:creator>
      <pubDate>Wed, 06 May 2026 04:52:42 +0000</pubDate>
      <link>https://dev.to/hadi_rizvi_093/-4jek</link>
      <guid>https://dev.to/hadi_rizvi_093/-4jek</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2" class="crayons-story__hidden-navigation-link"&gt;How I Built a Free AI Tools Website With Next.js and Groq API&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="/hadi_rizvi_093" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3915123%2Fe6ac2e81-4bbd-4e04-a4b6-ab93a4a8db87.png" alt="hadi_rizvi_093 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/hadi_rizvi_093" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Hadi Rizvi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Hadi Rizvi
                
              
              &lt;div id="story-author-preview-content-3618435" 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="/hadi_rizvi_093" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3915123%2Fe6ac2e81-4bbd-4e04-a4b6-ab93a4a8db87.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Hadi Rizvi&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/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&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/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2" id="article-link-3618435"&gt;
          How I Built a Free AI Tools Website With Next.js and Groq API
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&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/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2" 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/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&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;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How I Built a Free AI Tools Website With Next.js and Groq API</title>
      <dc:creator>Hadi Rizvi</dc:creator>
      <pubDate>Wed, 06 May 2026 04:52:16 +0000</pubDate>
      <link>https://dev.to/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2</link>
      <guid>https://dev.to/hadi_rizvi_093/how-i-built-a-free-ai-tools-website-with-nextjs-and-groq-api-4pm2</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Free AI Writing Tools Platform in a Weekend — Here’s Exactly How
&lt;/h1&gt;

&lt;p&gt;Last weekend, I built and deployed a completely free AI writing tools platform called &lt;strong&gt;Textora&lt;/strong&gt;. There are no paywalls, no word limits, and no account required.&lt;/p&gt;

&lt;p&gt;Here’s a clear breakdown of what I built, how I built it, and what I learned along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most AI writing tools today come with frustrating limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QuillBot restricts free paraphrasing to around 125 words&lt;/li&gt;
&lt;li&gt;Many “AI humanizers” charge $15–$20 per month&lt;/li&gt;
&lt;li&gt;Several tools require signups just to try basic features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to build something genuinely useful — fully free, unlimited, and easy to access.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;textora.org&lt;/strong&gt; — a platform with 15 free AI writing tools&lt;br&gt;
Built using &lt;strong&gt;Next.js 14&lt;/strong&gt;, powered by the &lt;strong&gt;Groq API&lt;/strong&gt;, and deployed at no cost&lt;/p&gt;


&lt;h2&gt;
  
  
  Tech Stack Breakdown
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Framework: Next.js 14 (App Router + TypeScript)
&lt;/h3&gt;

&lt;p&gt;I used the App Router because it provides a clean separation of concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server Components&lt;/strong&gt; for static pages and SEO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Components&lt;/strong&gt; for interactive tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Routes&lt;/strong&gt; for all AI processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure made the project easier to organize and scale.&lt;/p&gt;


&lt;h3&gt;
  
  
  AI Layer: Groq API (Llama 3.1 8B Instant)
&lt;/h3&gt;

&lt;p&gt;This was one of the most effective choices in the project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response times average around 2–3 seconds&lt;/li&gt;
&lt;li&gt;The free tier is generous&lt;/li&gt;
&lt;li&gt;Output quality is reliable for writing tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the base pattern used across all AI tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Groq&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;groq-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Groq&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GROQ_API_KEY&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tone&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;groq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;messages&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;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Rewrite the following text to sound natural and human. 
Tone: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Return only the rewritten text:

&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama-3.1-8b-instant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&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="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;result&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;Each tool follows this same structure, with only the prompt changing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Styling: Tailwind CSS + Custom Design System
&lt;/h3&gt;

&lt;p&gt;I created a simple but consistent design system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indigo as the primary accent&lt;/li&gt;
&lt;li&gt;Deep navy for darker sections&lt;/li&gt;
&lt;li&gt;A clean white base&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CSS variables and an extended Tailwind configuration were used for reusable design tokens.&lt;/p&gt;




&lt;h3&gt;
  
  
  Storage: Vercel Blob (for Blog System)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Blog posts are stored as JSON in private Blob storage&lt;/li&gt;
&lt;li&gt;A full admin dashboard is built with &lt;strong&gt;NextAuth and Google OAuth&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;CRUD operations are handled through API routes&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Rate Limiting: Upstash Redis
&lt;/h3&gt;

&lt;p&gt;To prevent abuse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Ratelimit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@upstash/ratelimit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@upstash/redis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratelimit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Ratelimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEnv&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Ratelimit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slidingWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1h&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-forwarded-for&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anonymous&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ratelimit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;success&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="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rate limit exceeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;429&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;This approach is simple and effective.&lt;/p&gt;




&lt;h3&gt;
  
  
  Deployment: Vercel (Free Tier)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Zero-configuration deployment for Next.js&lt;/li&gt;
&lt;li&gt;Custom domain via Namecheap&lt;/li&gt;
&lt;li&gt;Automatic SSL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total infrastructure cost: &lt;strong&gt;$0&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 15 Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI-Powered Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI Humanizer&lt;/li&gt;
&lt;li&gt;AI Detector&lt;/li&gt;
&lt;li&gt;Paraphraser&lt;/li&gt;
&lt;li&gt;Grammar Checker&lt;/li&gt;
&lt;li&gt;Text Summarizer&lt;/li&gt;
&lt;li&gt;Sentence Rewriter&lt;/li&gt;
&lt;li&gt;Email Writer&lt;/li&gt;
&lt;li&gt;Blog Title Generator&lt;/li&gt;
&lt;li&gt;Meta Description Generator&lt;/li&gt;
&lt;li&gt;Passive to Active Voice Converter&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Utility Tools (Frontend Only)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Word Counter&lt;/li&gt;
&lt;li&gt;Character Counter&lt;/li&gt;
&lt;li&gt;Case Converter&lt;/li&gt;
&lt;li&gt;Reading Time Estimator&lt;/li&gt;
&lt;li&gt;Text Cleaner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend tools were straightforward to build.&lt;/p&gt;

&lt;p&gt;The AI tools all use the same backend pattern, but prompt design made a significant difference in output quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I’d Do Differently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prompt Engineering Takes Time
&lt;/h3&gt;

&lt;p&gt;Getting consistent output required more effort than expected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models often add extra text or formatting&lt;/li&gt;
&lt;li&gt;You need to clearly define the expected output format every time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The grammar checker was particularly challenging, especially when trying to return structured error data reliably.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. SEO Is Not a Quick Setup
&lt;/h3&gt;

&lt;p&gt;This part took longer than anticipated.&lt;/p&gt;

&lt;p&gt;Tasks included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a dynamic sitemap (including blog posts)&lt;/li&gt;
&lt;li&gt;Adding metadata for every page&lt;/li&gt;
&lt;li&gt;Implementing JSON-LD structured data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SEO alone took nearly a full day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You don’t need a large budget to build something useful&lt;/li&gt;
&lt;li&gt;Iteration speed matters more than perfection&lt;/li&gt;
&lt;li&gt;Well-crafted prompts are just as important as clean code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform is live at &lt;strong&gt;textora.org&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All 15 tools are available with no login and no limits.&lt;/p&gt;




&lt;p&gt;If you’re working on something similar or have questions about the stack, feel free to reach out.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
