<?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>Forem: Lotfi Jebali</title>
    <description>The latest articles on Forem by Lotfi Jebali (@lotfijb).</description>
    <link>https://forem.com/lotfijb</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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg</url>
      <title>Forem: Lotfi Jebali</title>
      <link>https://forem.com/lotfijb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lotfijb"/>
    <language>en</language>
    <item>
      <title>Check MockBlast and get a free lifetime pro licence now at https://mockblast.com !!!</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Tue, 06 Jan 2026 08:45:19 +0000</pubDate>
      <link>https://forem.com/lotfijb/check-mockblast-and-get-a-free-lifetime-pro-licence-now-at-httpsmockblastcom--5fho</link>
      <guid>https://forem.com/lotfijb/check-mockblast-and-get-a-free-lifetime-pro-licence-now-at-httpsmockblastcom--5fho</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/lotfijb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg" alt="lotfijb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/lotfijb/i-built-a-universal-data-generator-to-kill-the-1000-row-limit-here-is-the-stack-1jb4" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I built a Universal Data Generator to kill the 1,000 row limit. Here is the stack.&lt;/h2&gt;
      &lt;h3&gt;Lotfi Jebali ・ Jan 6&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#database&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#sass&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://mockblast.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fph-files.imgix.net%2F0f2ec9a2-f683-400f-9724-3556476a5aa5.x-icon%3Fauto%3Dformat%26fit%3Dcrop%26w%3D80%26h%3D80" height="80" class="m-0" width="80"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://mockblast.com/" rel="noopener noreferrer" class="c-link"&gt;
            MockBlast - Online SQL &amp;amp; JSON Mock Data Generator (1M+ Rows)
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Generate massive amounts of dummy data for Postgres, MySQL, and CSV. Features SQL Import, Custom Lists for Foreign Keys, and Server-side Streaming.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmockblast.com%2Ffavicon.ico%3Ffavicon.2822ee6a.ico" width="32" height="32"&gt;
          mockblast.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>programming</category>
      <category>database</category>
      <category>sass</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built a Universal Data Generator to kill the 1,000 row limit. Here is the stack.</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Tue, 06 Jan 2026 08:44:41 +0000</pubDate>
      <link>https://forem.com/lotfijb/i-built-a-universal-data-generator-to-kill-the-1000-row-limit-here-is-the-stack-1jb4</link>
      <guid>https://forem.com/lotfijb/i-built-a-universal-data-generator-to-kill-the-1000-row-limit-here-is-the-stack-1jb4</guid>
      <description>&lt;h2&gt;
  
  
  I built a Universal Data Generator to kill the 1,000 row limit. Here is the stack.
&lt;/h2&gt;

&lt;p&gt;I’ve been a developer for years, and I have a recurring nightmare: &lt;strong&gt;Seeding the Database.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It doesn't matter if I'm using PostgreSQL, MongoDB, or just need a CSV for a client. The options are always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Write manual scripts (boring, slow).&lt;/li&gt;
&lt;li&gt; Use existing tools (great, but they cap you at 1,000 rows unless you pay a monthly subscription).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, I spent the last few weekends building &lt;strong&gt;&lt;a href="https://mockblast.com" rel="noopener noreferrer"&gt;MockBlast&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;Universal Mock Data Generator&lt;/strong&gt; designed to handle massive datasets without timeouts.&lt;/p&gt;

&lt;p&gt;Here is how I engineered it to stream 1M+ rows using Next.js and Nginx.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Syntax &amp;amp; Scale
&lt;/h2&gt;

&lt;p&gt;Most generators are dumb.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;SQL:&lt;/strong&gt; They don't escape single quotes (&lt;code&gt;O'Reilly&lt;/code&gt; breaks your insert).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;MongoDB:&lt;/strong&gt; They give you strings instead of &lt;code&gt;ObjectId("...")&lt;/code&gt; or &lt;code&gt;ISODate("...")&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Scale:&lt;/strong&gt; Browser-based generation crashes RAM after ~50k rows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a single tool where I could paste a schema and stream &lt;strong&gt;gigabytes&lt;/strong&gt; of data in any format.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack (VPS &amp;gt; Serverless)
&lt;/h2&gt;

&lt;p&gt;I started with Serverless, but I hit a wall immediately: &lt;strong&gt;Timeouts.&lt;/strong&gt;&lt;br&gt;
Generating 100,000 rows takes more than 10 seconds. Vercel/AWS Lambda kill the process.&lt;/p&gt;

&lt;p&gt;I migrated to a &lt;strong&gt;Self-Hosted VPS&lt;/strong&gt; stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;App:&lt;/strong&gt; Next.js (App Router).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL (Dockerized).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Proxy:&lt;/strong&gt; &lt;strong&gt;Nginx&lt;/strong&gt; (Reverse Proxy &amp;amp; SSL).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows me to keep connections open for minutes and &lt;strong&gt;Stream&lt;/strong&gt; data directly to the user.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Secret Sauce: Nginx &amp;amp; Web Streams
&lt;/h2&gt;

&lt;p&gt;To generate 1 Million rows without crashing the server RAM, I don't build the file in memory. I pipe it row-by-row.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Next.js Route (Streaming)
&lt;/h3&gt;

&lt;p&gt;I use the Web Streams API. I also use &lt;code&gt;setTimeout(0)&lt;/code&gt; periodically to prevent the Node.js event loop from blocking during heavy CPU tasks.&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="c1"&gt;// app/api/generate/route.ts&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;fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rowCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;format&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;stream&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;ReadableStream&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&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;encoder&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;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="c1"&gt;// 1. Push Header &lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

      &lt;span class="c1"&gt;// 2. Loop and Flush&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;rowCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Heavy logic&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&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="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`('&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'),\n`&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="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`{ name: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;", _id: ObjectId("...") },\n`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// CRITICAL: Let the event loop breathe every 500 rows&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&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="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// 3. Close&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Disposition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`attachment; filename="data.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;format&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Nginx Config (The Real Trick)
&lt;/h3&gt;

&lt;p&gt;By default, Nginx &lt;strong&gt;buffers&lt;/strong&gt; responses. It waits for the whole API call to finish before sending data to the client. This kills the streaming effect and causes timeouts.&lt;/p&gt;

&lt;p&gt;I had to explicitly disable buffering in my &lt;code&gt;nginx.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# CRITICAL for Streaming:&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Increase timeouts for large files (1M+ rows)&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;300s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_connect_timeout&lt;/span&gt; &lt;span class="s"&gt;300s&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;h2&gt;
  
  
  Launch Day Stats 🚀
&lt;/h2&gt;

&lt;p&gt;I launched yesterday with a "Users who signup before January 31st get a LifeTime pro licence for free" offer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The results after 24 hours:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Data generations:&lt;/strong&gt; 63&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Users:&lt;/strong&gt; 106&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fongum4ahmi5o7uf626vr.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.amazonaws.com%2Fuploads%2Farticles%2Fongum4ahmi5o7uf626vr.png" alt="MockBlast's first day stats" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;MockBlast is live and &lt;strong&gt;Free for up to 10,000 rows&lt;/strong&gt; (10x the industry standard).&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;PostgreSQL/MySQL:&lt;/strong&gt; With Foreign Key integrity and JSONB support.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;MongoDB:&lt;/strong&gt; Native BSON types (&lt;code&gt;ObjectId&lt;/code&gt;, &lt;code&gt;ISODate&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;CSV/JSON:&lt;/strong&gt; For general use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you hate writing seed data, give it a try.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://mockblast.com" rel="noopener noreferrer"&gt;Try MockBlast (Free)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>database</category>
      <category>sass</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Kickstart Your Dev Projects: Free Starter Kit with Portfolio Templates &amp; Frontend Dashboard</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Tue, 11 Nov 2025 09:36:11 +0000</pubDate>
      <link>https://forem.com/lotfijb/kickstart-your-dev-projects-free-starter-kit-with-portfolio-templates-frontend-dashboard-4eh7</link>
      <guid>https://forem.com/lotfijb/kickstart-your-dev-projects-free-starter-kit-with-portfolio-templates-frontend-dashboard-4eh7</guid>
      <description>&lt;p&gt;Starting as a developer is hard. You need a portfolio, projects to showcase, and some real code to practice with—but most tutorials leave you with “Hello World” and nothing deployable.&lt;/p&gt;

&lt;p&gt;I created a free Dev Starter Kit to solve exactly that problem. It gives you ready-to-use portfolio templates and a fully interactive frontend retail dashboard so you can start building and showcasing your skills immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s Inside:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;3 Portfolio Templates, Single-page, professional, and fully customizable. Perfect for creating your personal website quickly.&lt;/li&gt;
&lt;li&gt;Frontend Dashboard Project – Retail-style dashboard with charts, arrays, and UI components. Great for demonstrating frontend skills.&lt;/li&gt;
&lt;li&gt;GitHub Links – All projects are public and may receive updates over time, so you can explore the code and follow along.&lt;/li&gt;
&lt;li&gt;ZIP File – Everything packaged together for easy download and immediate use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Kit is Useful:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Save hours of setup and design work.&lt;/li&gt;
&lt;li&gt;Build a polished portfolio that stands out to recruiters and clients.&lt;/li&gt;
&lt;li&gt;Explore real projects and code you can extend or deploy.&lt;/li&gt;
&lt;li&gt;Start learning best practices for structuring full-stack apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Get It:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lotfijbeli.gumroad.com/l/dev-starter-kit-lotfijb" rel="noopener noreferrer"&gt;Get it here for free&lt;/a&gt; : Just enter your email, download the ZIP, and start building.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>resources</category>
      <category>portfolio</category>
      <category>react</category>
    </item>
    <item>
      <title>Why I Stopped Using Vercel (And Built My Own Setup Instead)</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Sat, 01 Nov 2025 10:57:50 +0000</pubDate>
      <link>https://forem.com/lotfijb/why-i-stopped-using-vercel-and-built-my-own-setup-instead-4b0g</link>
      <guid>https://forem.com/lotfijb/why-i-stopped-using-vercel-and-built-my-own-setup-instead-4b0g</guid>
      <description>&lt;p&gt;Vercel is convenient, but sometimes convenience hides the problem. Limited logs, hidden build steps, and deep menus make it hard to see what really happens during deployment.&lt;/p&gt;

&lt;p&gt;I wanted clarity, speed, and control so I built my own deployment system. Full visibility, one-click actions, and instant rollback if something goes wrong.&lt;/p&gt;

&lt;p&gt;Read the full story here: &lt;a href="https://lotfijebali.dev/blog/why-i-stopped-using-vercel-and-built-my-own-setup-instead" rel="noopener noreferrer"&gt;Why I stopped using Vercel and built my own setup instead&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>About the security of Next.js apps and my opinion about it</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Mon, 31 Mar 2025 07:35:56 +0000</pubDate>
      <link>https://forem.com/lotfijb/about-the-security-of-nextjs-apps-and-my-opinion-about-it-750</link>
      <guid>https://forem.com/lotfijb/about-the-security-of-nextjs-apps-and-my-opinion-about-it-750</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d" class="crayons-story__hidden-navigation-link"&gt;New Next.js Middleware Vulnerability – How Bad Is It?&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="/lotfijb" 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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg" alt="lotfijb profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lotfijb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lotfi Jebali
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lotfi Jebali
                
              
              &lt;div id="story-author-preview-content-2367530" 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="/lotfijb" 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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lotfi Jebali&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/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 31 '25&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/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d" id="article-link-2367530"&gt;
          New Next.js Middleware Vulnerability – How Bad Is It?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&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/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nextjs"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nextjs&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/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d" 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;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/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d#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;
            2 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>
      <category>webdev</category>
      <category>security</category>
      <category>nextjs</category>
      <category>discuss</category>
    </item>
    <item>
      <title>New Next.js Middleware Vulnerability – How Bad Is It?</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Mon, 31 Mar 2025 07:35:07 +0000</pubDate>
      <link>https://forem.com/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d</link>
      <guid>https://forem.com/lotfijb/new-nextjs-middleware-vulnerability-how-bad-is-it-1g5d</guid>
      <description>&lt;p&gt;A critical security flaw has been identified in &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, a widely-used React framework. This vulnerability, known as &lt;a href="https://nextjs.org/blog/cve-2025-29927" rel="noopener noreferrer"&gt;CVE-2025-29927&lt;/a&gt;, allows attackers to bypass middleware-based authorization checks by exploiting the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header. This means unauthorized users could potentially access protected routes without proper validation.&lt;/p&gt;

&lt;p&gt;Middleware in Next.js acts as a gatekeeper, performing essential tasks like authentication before requests reach their destinations. If your application's security relies solely on middleware, exploiting this vulnerability could grant attackers access to sensitive areas. However, if you've implemented additional security measures at the page or API route level, unauthorized users might bypass the middleware only to encounter another layer of defense, resulting in access to a page without sensitive data.&lt;/p&gt;

&lt;p&gt;My opinion about this is that the severity of this vulnerability entirely depends on how your application is structured. If you depend purely on middleware for authentication, this could be a major security risk. But if your app has proper backend validation and doesn’t expose sensitive data at the page level, an attacker might bypass the middleware only to find themselves staring at a blank page. This is why a layered security approach is crucial—middleware alone should never be your only defense.&lt;/p&gt;

&lt;p&gt;The Next.js team has addressed this issue by releasing patched versions: 12.3.5, 13.5.9, 14.2.25, and 15.2.3. It's strongly recommended to update your applications to these versions promptly. If updating isn't feasible immediately, consider configuring your server or load balancer to block external requests containing the &lt;code&gt;x-middleware-subrequest&lt;/code&gt; header as a temporary measure.&lt;/p&gt;

&lt;p&gt;This incident serves as a reminder that security is never just a one-step solution. Regularly updating dependencies and implementing proper backend checks will always be key to protecting your applications and users.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>nextjs</category>
      <category>discuss</category>
    </item>
    <item>
      <title>mail us at support@fitly.space</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Wed, 08 Jan 2025 08:16:54 +0000</pubDate>
      <link>https://forem.com/lotfijb/mail-us-at-supportfitlyspace-2h6m</link>
      <guid>https://forem.com/lotfijb/mail-us-at-supportfitlyspace-2h6m</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/lotfijb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg" alt="lotfijb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/lotfijb/looking-for-testers-before-launching-my-saas--52pb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Looking for testers before launching my Saas !&lt;/h2&gt;
      &lt;h3&gt;Lotfi Jebali ・ Jan 8&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>saas</category>
      <category>testing</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Want to build a saas ? this might give you an idea on how to approach it !</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Mon, 02 Dec 2024 07:00:13 +0000</pubDate>
      <link>https://forem.com/lotfijb/want-to-build-a-saas-this-might-give-you-an-idea-on-how-to-approach-it--3jla</link>
      <guid>https://forem.com/lotfijb/want-to-build-a-saas-this-might-give-you-an-idea-on-how-to-approach-it--3jla</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/lotfijb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F964308%2F577cd55b-dad4-4fb9-8c48-844f09975892.jpeg" alt="lotfijb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/lotfijb/building-scalable-and-cost-efficient-saas-the-architecture-behind-fitly-space-5bj7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building Scalable and Cost-Efficient SaaS: The Architecture Behind Fitly Space&lt;/h2&gt;
      &lt;h3&gt;Lotfi Jebali ・ Dec 2 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#sass&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#news&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Building Scalable and Cost-Efficient SaaS: The Architecture Behind Fitly Space</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Mon, 02 Dec 2024 06:59:29 +0000</pubDate>
      <link>https://forem.com/lotfijb/building-scalable-and-cost-efficient-saas-the-architecture-behind-fitly-space-5bj7</link>
      <guid>https://forem.com/lotfijb/building-scalable-and-cost-efficient-saas-the-architecture-behind-fitly-space-5bj7</guid>
      <description>&lt;p&gt;As a solo developer passionate about fitness and technology, I wanted to create a SaaS platform that delivers personalized fitness plans and healthy meal recommendations while remaining cost-effective and scalable. Enter &lt;strong&gt;Fitly&lt;/strong&gt;, a fitness and health app designed to adapt to users' needs with real-time communication and dynamic AI-driven insights. This article offers an overview of the thought process, challenges, and architectural decisions behind Fitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prioritizing Cost Efficiency
&lt;/h2&gt;

&lt;p&gt;Building a SaaS as a solo developer means balancing quality with cost. I chose &lt;strong&gt;open-source tools and free APIs&lt;/strong&gt; wherever possible, like &lt;strong&gt;Next.js&lt;/strong&gt; for the frontend and the &lt;strong&gt;Google Drive API&lt;/strong&gt; for file uploads. While there are unavoidable expenses, thoughtful decisions helped keep initial costs low while laying the groundwork for future scalability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Leveraging Next.js for SEO and Scalability
&lt;/h2&gt;

&lt;p&gt;Fitness and health are universal needs, so scalability was a priority from the start. I opted for &lt;strong&gt;Next.js&lt;/strong&gt; for its flexibility and &lt;strong&gt;server-side rendering (SSR)&lt;/strong&gt; capabilities, ensuring that Fitly could rank well in search engines while delivering fast, responsive pages. With prior experience in React development, Next.js was the natural choice, offering both familiarity and advanced functionality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Critical Backend Considerations
&lt;/h2&gt;

&lt;p&gt;At the core of Fitly’s backend is &lt;strong&gt;data consistency&lt;/strong&gt;, a critical factor due to the interconnected nature of the platform. Communication with AI models, user interactions, and fitness plans all rely on seamless integration. To ensure consistency:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt;: Operations are designed to undo changes if something fails mid-process, ensuring the system remains coherent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JWT Authentication&lt;/strong&gt;: Secure user access is implemented using &lt;strong&gt;NextAuth.js&lt;/strong&gt;, simplifying authentication flows.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Notifications&lt;/strong&gt;: User emails, such as account verification, are sent using &lt;strong&gt;Nodemailer&lt;/strong&gt;, another cost-effective choice.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Database Design for Scalability
&lt;/h2&gt;

&lt;p&gt;I designed Fitly's database with &lt;strong&gt;separation of concerns&lt;/strong&gt; in mind. Using MongoDB, I structured the models with &lt;strong&gt;proper indexing&lt;/strong&gt; for fast queries and stored metadata alongside files for better management. The database schema is prepared to scale with the user base and future features.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Real-Time Communication Without Caching
&lt;/h2&gt;

&lt;p&gt;Fitly’s reliance on real-time updates for AI-generated fitness plans and meal suggestions eliminates the need for traditional caching mechanisms. However, as the user base grows, I plan to implement caching strategies to handle specific features, like static content or user history, to optimize performance further.&lt;/p&gt;




&lt;h2&gt;
  
  
  UI/UX Challenges on the Web
&lt;/h2&gt;

&lt;p&gt;One of the most challenging aspects was creating a responsive, intuitive design. Unlike traditional workout apps, Fitly is web-based, which means it needed to be fully functional on mobile devices. Countless iterations and user feedback helped refine the experience to ensure it felt seamless across devices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Testing is Essential&lt;/strong&gt;: Especially with AI, user inputs can be unpredictable. I learned to implement strict validation and filtering mechanisms to maintain system reliability.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Management&lt;/strong&gt;: Designing the architecture, especially with the learning curve of AI model integration, took approximately &lt;strong&gt;2-3 months&lt;/strong&gt;, including research and experimentation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof Over Perfection&lt;/strong&gt;: As a SaaS entrepreneur, creating a functional product that proves your idea is more important than achieving perfection on the first try.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Advice for Aspiring SaaS Builders
&lt;/h2&gt;

&lt;p&gt;Starting a SaaS as a solo developer can be daunting, but it’s also incredibly rewarding. Here are my top tips:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus on Functionality First&lt;/strong&gt;: Get your idea working before perfecting it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Free Tools&lt;/strong&gt;: Open-source and free services can take you a long way.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep Learning&lt;/strong&gt;: Each challenge you overcome will make the next one easier.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan for Growth&lt;/strong&gt;: Even if you’re starting small, design your architecture to handle future scalability.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market Effectively&lt;/strong&gt;: Building is only half the battle—reaching users is the other.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Join Fitly’s Beta Program!
&lt;/h2&gt;

&lt;p&gt;Fitly is in beta testing, and I’m inviting you to be part of the journey! Sign up today to experience personalized fitness plans and meal recommendations tailored to your goals. Together, let’s simplify fitness and health.  &lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://beta.fitly.space/" rel="noopener noreferrer"&gt;Register for the Beta&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;This is just the beginning of the &lt;strong&gt;Fitly Space&lt;/strong&gt; series. In future articles, we will dive deeper into specific aspects of Fitly, from backend implementation to real-time communication strategies and UI/UX challenges. Stay tuned for more insights into building scalable SaaS solutions!&lt;/p&gt;

</description>
      <category>sass</category>
      <category>ai</category>
      <category>news</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CodeCompanion is launching : Take your documentation to the next level</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Fri, 24 May 2024 22:46:20 +0000</pubDate>
      <link>https://forem.com/lotfijb/codecompanion-is-launching-take-your-documentation-to-the-next-level-1d8d</link>
      <guid>https://forem.com/lotfijb/codecompanion-is-launching-take-your-documentation-to-the-next-level-1d8d</guid>
      <description>&lt;p&gt;I'm excited to announce that &lt;a href="https://codecompanion-trial.vercel.app/" rel="noopener noreferrer"&gt;CodeCompanion&lt;/a&gt; is ready!&lt;br&gt;
CodeCompanion is an AI-powered tool that makes documenting your code a breeze. It integrates seamlessly with platforms like GitHub and GitLab, taking care of all your documentation and commenting needs.&lt;br&gt;
Your code will be perfectly documented by just a click!&lt;br&gt;
With CodeCompanion, collaboration becomes smoother and sharing code easier than ever before. Whether you're working solo or with a team.&lt;br&gt;
Our beta launch is tomorrow, and you can join over 400 developers already on the waitlist. Don't miss out on the chance to experience a new era of code documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codecompanion-trial.vercel.app/" rel="noopener noreferrer"&gt;Sign up here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's make code documentation effortless!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Talk : How often do you document your code ?</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Wed, 22 May 2024 22:47:30 +0000</pubDate>
      <link>https://forem.com/lotfijb/talk-how-often-do-you-document-your-code--4g9b</link>
      <guid>https://forem.com/lotfijb/talk-how-often-do-you-document-your-code--4g9b</guid>
      <description>&lt;p&gt;Note : This is a discussion post&lt;/p&gt;

&lt;p&gt;How often do you document your code ?&lt;br&gt;
How much will it take you on average ? Do you really devote time to the documentation task ?&lt;br&gt;
Do you document your code in order to make it understandable for someone new to your codebase ?&lt;/p&gt;

&lt;p&gt;Thank you! &lt;br&gt;
LET'S TALK !!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Embarking on a Coding Adventure with CodeCompanion: Revolutionizing Collaboration and Efficiency</title>
      <dc:creator>Lotfi Jebali</dc:creator>
      <pubDate>Mon, 25 Dec 2023 14:56:55 +0000</pubDate>
      <link>https://forem.com/lotfijb/embarking-on-a-coding-adventure-with-codecompanion-revolutionizing-collaboration-and-efficiency-2740</link>
      <guid>https://forem.com/lotfijb/embarking-on-a-coding-adventure-with-codecompanion-revolutionizing-collaboration-and-efficiency-2740</guid>
      <description>&lt;h2&gt;
  
  
  1. A Journey Begins:
&lt;/h2&gt;

&lt;p&gt;Hey coding enthusiasts! Get ready to dive into an exciting coding adventure with CodeCompanion – the tool that's here to make coding a breeze. Picture CodeCompanion as your trusty guide, ready to make the coding experience smoother and more enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Inspiration Behind CodeCompanion: Solving Coding Challenges Through Collaboration:
&lt;/h2&gt;

&lt;p&gt;Ever felt the frustration of messy code documentation or wished for a more seamless collaboration experience? We've been there too, and that's why we created CodeCompanion. It's not just a tool; it's a solution born out of our shared experiences, addressing the coding challenges we all face. Let's make coding a collaborative and joyful process.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Navigating the Coding Landscape: CodeCompanion's Human-Centric Features:
&lt;/h2&gt;

&lt;p&gt;Meet your new coding buddy – CodeCompanion! Powered by the magic of artificial intelligence, it's not just about lines of code; it's about creating a coding experience that feels more human. With features like integration with version control systems, support for multiple languages, and an interface designed for humans, CodeCompanion is your companion in making coding a more enjoyable and friendly endeavor.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pioneering the Future of Coding: Join CodeCompanion's Trial Expedition:
&lt;/h2&gt;

&lt;p&gt;Exciting times are upon us, and we invite you, the heart of coding, to join our journey. Become a CodeCompanion pioneer, dive into the trial, and let's shape the future of coding together. Your experiences and feedback will play a crucial role in making CodeCompanion the go-to tool for every coder.&lt;/p&gt;

&lt;p&gt;Ready to explore the CodeCompanion experience? Sign up for our trial now and be among the first to experience the transformative capabilities of CodeCompanion. Join us in redefining the coding experience. Together, let's create a future where coding is not just a task but a straightforward and collaborative journey. Your CodeCompanion journey starts right here!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codecompanion-trial.vercel.app/" rel="noopener noreferrer"&gt;Register Here&lt;/a&gt;&lt;/p&gt;

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