<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Aadarsh Guru]]></title><description><![CDATA[Founder of codeyst.app, Full-Stack Developer,  SaaS & Mobile App Builder,  Freelancer, Helping founders launch their MVPs quickly and affordably, turning ideas into revenue, Building AI tools that turn ideas into products]]></description><link>https://blog.aadarshguru.com</link><image><url>https://cdn.hashnode.com/uploads/logos/64bc86f99c4805b50a4cdde9/b23262bc-00f3-4186-a71a-5a58fc8e4a28.png</url><title>Aadarsh Guru</title><link>https://blog.aadarshguru.com</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 18 May 2026 23:50:11 GMT</lastBuildDate><atom:link href="https://blog.aadarshguru.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Built a Full-Stack AI Engineer as a Solo Developer — Here's the Honest Story]]></title><description><![CDATA[I want to tell you something that most founders don't say out loud.
Building a product alone is lonely. There's no one to celebrate the small wins with. No one to share the anxiety when something brea]]></description><link>https://blog.aadarshguru.com/i-built-a-full-stack-ai-engineer-as-a-solo-developer-here-s-the-honest-story</link><guid isPermaLink="true">https://blog.aadarshguru.com/i-built-a-full-stack-ai-engineer-as-a-solo-developer-here-s-the-honest-story</guid><category><![CDATA[codeyst]]></category><category><![CDATA[AI Full-Stack Engineer]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[webdev]]></category><category><![CDATA[startup]]></category><category><![CDATA[indie-hacker]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[AI]]></category><category><![CDATA[buildinpublic]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Aadarsh Guru]]></dc:creator><pubDate>Wed, 06 May 2026 15:55:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/64bc86f99c4805b50a4cdde9/d279363d-95d2-481d-928f-65470b8b5f93.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I want to tell you something that most founders don't say out loud.</p>
<p>Building a product alone is lonely. There's no one to celebrate the small wins with. No one to share the anxiety when something breaks at 2 AM. No one to tell you whether the thing you're building is actually good or just feels good because you made it.</p>
<p>But I did it anyway. And last month, I launched <a href="https://www.codeyst.app">Codeyst</a> publicly.</p>
<p>This is the honest story of how it happened.</p>
<hr />
<h2>It Started With Frustration</h2>
<p>I've been a freelance full-stack developer for years. In that time I've built dozens of products for founders — SaaS platforms, mobile apps, MVPs, internal tools. All kinds.</p>
<p>And I kept seeing the same pattern, over and over.</p>
<p>A founder would come to me with an idea. Excited. Energetic. Full of vision. We'd start the project and then spend the first week just setting things up — choosing a framework, configuring auth, standing up a database, writing boilerplate no one ever wants to write.</p>
<p>By the time we got to the actual product — the thing the founder was excited about — some of that energy was already gone.</p>
<p>I watched ideas lose momentum in setup.</p>
<p>And I felt it myself too. I had my own ideas. Side projects I'd start, get bogged down in configuration, and quietly abandon.</p>
<p>That frustration is where <a href="https://www.codeyst.app">Codeyst</a> was born.</p>
<hr />
<h2>The Idea Was Simple. The Execution Was Not.</h2>
<p>The idea sounds obvious in hindsight:</p>
<p>What if you could just describe what you want to build — in plain language — and something would build it for you? Not generate a snippet. Not autocomplete a function. Actually build it. End to end. With a real database, real auth, real deployment.</p>
<p>Simple idea. But actually building it taught me how complex "simple" can be.</p>
<p>The first version was terrible. The AI would generate code that looked right but didn't run. Dependencies would clash. The database schema would be wrong. The generated components wouldn't connect to each other.</p>
<p>I scrapped it and started over.</p>
<p>The insight that changed everything was this: the AI shouldn't just generate code. It should work like an actual engineer.</p>
<p>An engineer doesn't just write code. They read the existing codebase first. They understand the context. They plan before they act. They check their work. They iterate.</p>
<p>So I rebuilt <a href="https://www.codeyst.app">Codeyst</a> around that model. Before writing a single line of code, it reads the project structure, understands what's already there, builds a step-by-step plan, and then executes precisely.</p>
<p>That's when it started actually working.</p>
<hr />
<h2>The Part Nobody Talks About</h2>
<p>Building the AI was the fun part, honestly.</p>
<p>The hard part was everything else.</p>
<p>Payments. Auth. Credit systems. Deployment pipelines. Supabase integration. GitHub sync. Vercel API. Mobile support via Expo. Pricing pages. Terms and conditions. Privacy policies. Customer support flows. Documentation.</p>
<p>All of it, alone.</p>
<p>There were weeks where I questioned everything. Weeks where I'd see a competitor ship a new feature and feel behind. Weeks where I'd open my laptop and just stare at it.</p>
<p>But I kept coming back to the same thought: I've built too much to stop now.</p>
<p>So I didn't stop.</p>
<hr />
<h2>What Codeyst Actually Does</h2>
<p>Let me be clear about what <a href="https://www.codeyst.app">Codeyst</a> is — because there are a lot of "AI app builders" out there and most of them are not what they claim.</p>
<p>Codeyst is not a frontend generator. It's not a code snippet tool. It's not a drag-and-drop builder with AI sprinkled on top.</p>
<p>It's a <a href="https://www.codeyst.app">full-stack AI app builder</a> that works like a real engineer.</p>
<p>You describe your app in plain language. Codeyst reasons about your requirements, plans the architecture, and builds it — complete with:</p>
<p>→ Real PostgreSQL database via Supabase → Authentication (sign up, login, sessions) → File storage → One-click deployment to Vercel → GitHub sync → <a href="https://www.codeyst.app">Cross-platform mobile app development</a> via Expo</p>
<p>Web and mobile. Both. From one conversation.</p>
<p>Every step happens in real time, visible to you. You watch the plan form, the files get created, the preview come alive. You can give feedback at any point and it adjusts.</p>
<p>When it's done, you have a real deployed product. Not a demo. Not a prototype. Something you can share a URL for right now.</p>
<hr />
<h2>Why Mobile Matters</h2>
<p>Every other AI builder I know of is web-only.</p>
<p>But more than half the app ideas I heard from founders during my freelance years were mobile ideas. A fitness tracker. A social app. A delivery service. A marketplace. All mobile.</p>
<p>I always thought it was strange that no one in this space was solving for mobile.</p>
<p>So <a href="https://www.codeyst.app">Codeyst</a> does. Using Expo, we generate cross-platform iOS and Android apps from the same conversation you'd use to build a web app.</p>
<p>That's a real differentiator. And it came directly from listening to founders for years.</p>
<hr />
<h2>The Launch</h2>
<p>I launched on Product Hunt in April 2026.</p>
<p>I had no marketing budget. No team. No PR firm. Just me, posting on my personal Twitter and LinkedIn, asking people to check out <a href="https://www.codeyst.app">Codeyst</a>.</p>
<p>It was terrifying in the best way.</p>
<p>The feedback was honest. Some people loved it. Some had questions. Some had feature requests I'd never thought of. All of it was valuable.</p>
<p>Building in public — being honest about where you are and where you're going — is something I've come to deeply believe in. Not every founder does it. I think more should.</p>
<hr />
<h2>What's Next</h2>
<p>I'm just getting started.</p>
<p>There are features I want to build. Markets I want to reach. A company I want to grow.</p>
<p>I applied to Y Combinator for Summer 2026. Whether that works out or not, I'll keep building every day.</p>
<p>If you're a founder with an idea — try <a href="https://www.codeyst.app">Codeyst free</a>. No credit card required. You might be surprised how fast your idea becomes a real product.</p>
<p>If you're a developer who's felt the same frustration I felt — <a href="https://www.codeyst.app">I built this for you too</a>.</p>
<p>And if you're just someone who followed along this far — thank you. Genuinely.</p>
<p>Let's build something. 🚀</p>
<p>→ <a href="https://www.codeyst.app">codeyst.app</a></p>
]]></content:encoded></item><item><title><![CDATA[Upload Files in MongoDB GridFs using an express server without any additional library.]]></title><description><![CDATA[Introduction:
In this comprehensive guide, we will delve into the intricacies of uploading and retrieving files in MongoDB GridFS, employing a streamlined approach through your Express server. Unlike the previous article, which showcased the utilizat...]]></description><link>https://blog.aadarshguru.com/upload-files-in-mongodb-gridfs-using-an-express-server-without-any-additional-library</link><guid isPermaLink="true">https://blog.aadarshguru.com/upload-files-in-mongodb-gridfs-using-an-express-server-without-any-additional-library</guid><category><![CDATA[MongoDB GridFS]]></category><category><![CDATA[File upload and retrieval]]></category><category><![CDATA[Advanced file handling]]></category><category><![CDATA[File storage optimization]]></category><category><![CDATA[Streamlined file management]]></category><dc:creator><![CDATA[Aadarsh Guru]]></dc:creator><pubDate>Tue, 15 Aug 2023 05:21:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cijiWIwsMB8/upload/6499e6c087ba5f81ff911756d84a4128.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction:</h2>
<p>In this comprehensive guide, we will delve into the intricacies of uploading and retrieving files in MongoDB GridFS, employing a streamlined approach through your Express server. Unlike the previous article, which showcased the utilization of the 'multer-gridfs-storage' npm package, we will now demonstrate an efficient method devoid of additional npm packages. Accompanying this process, we will also explore the retrieval of files from the GridFS bucket. The article is accompanied by a practical example and detailed steps to ensure a seamless implementation.</p>
<h2 id="heading-step-1-uploading-files-to-mongodb-gridfs">Step 1: Uploading Files to MongoDB GridFS</h2>
<p>Before commencing the file upload process, ensure your primary Express server is fully configured and integrated with your MongoDB database.</p>
<ol>
<li>Importing Dependencies: Initiate the process by importing essential dependencies such as Express, Mongoose, and Multer. The latter facilitates data parsing, while Mongoose establishes the connection with the MongoDB database.</li>
</ol>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> express <span class="hljs-keyword">from</span> <span class="hljs-string">"express"</span>;
<span class="hljs-keyword">import</span> mongoose <span class="hljs-keyword">from</span> <span class="hljs-string">"mongoose"</span>;
<span class="hljs-keyword">import</span> multer <span class="hljs-keyword">from</span> <span class="hljs-string">"multer"</span>;
<span class="hljs-keyword">import</span> { Readable } <span class="hljs-keyword">from</span> <span class="hljs-string">'stream'</span>;

<span class="hljs-keyword">const</span> route = express.Router();
<span class="hljs-keyword">const</span> upload = multer();
</code></pre>
<ol>
<li>Creating the Upload API Route: Define a designated API route for uploading files to the GridFS storage.</li>
</ol>
<pre><code class="lang-javascript">route.post(<span class="hljs-string">'/upload'</span>, upload.single(<span class="hljs-string">'file'</span>), <span class="hljs-keyword">async</span> (req, res) =&gt; {
    <span class="hljs-keyword">try</span> {
        <span class="hljs-keyword">const</span> gridFsBucket = <span class="hljs-keyword">new</span> mongoose.mongo.GridFSBucket(mongoose.connection.db);
        <span class="hljs-keyword">const</span> uploadFile = gridFsBucket.openUploadStream(<span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-built_in">Date</span>.now()}</span>-<span class="hljs-subst">${req?.file?.originalname}</span>`</span>, { <span class="hljs-attr">contentType</span>: req.file?.mimetype });
        <span class="hljs-keyword">const</span> readableStream = <span class="hljs-keyword">new</span> Readable();
        readableStream.push(req.file?.buffer);
        readableStream.push(<span class="hljs-literal">null</span>);
        readableStream.pipe(uploadFile);
        res.status(<span class="hljs-number">200</span>).json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'success'</span>, <span class="hljs-attr">success</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">filename</span>: uploadFile.filename, <span class="hljs-attr">id</span>: uploadFile.id });
    } <span class="hljs-keyword">catch</span> (error) {
        res.status(<span class="hljs-number">500</span>).json({ <span class="hljs-attr">message</span>: error?.message, <span class="hljs-attr">success</span>: <span class="hljs-literal">false</span> });
    }
});
</code></pre>
<ol>
<li>File Uploading Process Explanation: In this API route, Multer middleware facilitates the parsing of file data originating from the front end. Subsequently, a GridFS bucket instance is established, and an upload stream is initialized using the <code>openUploadStream</code> method. The file's content type is defined, and the data is piped into the MongoDB database through a readable stream. The response includes crucial details such as the filename and unique identifier of the uploaded file.</li>
</ol>
<h2 id="heading-step-2-retrieving-files-from-mongodb-gridfs">Step 2: Retrieving Files from MongoDB GridFS</h2>
<p>To retrieve files from the GridFS storage, a dynamic GET route is implemented, requiring the filename as a parameter.</p>
<pre><code class="lang-javascript">route.get(<span class="hljs-string">'/:filename'</span>, <span class="hljs-keyword">async</span> (req, res) =&gt; {
    <span class="hljs-keyword">try</span> {
        <span class="hljs-keyword">const</span> file = <span class="hljs-keyword">await</span> mongoose.connection.db.collection(<span class="hljs-string">'fs.files'</span>).findOne({ <span class="hljs-attr">filename</span>: req.params?.filename });
        <span class="hljs-keyword">const</span> gridFsBucket = <span class="hljs-keyword">new</span> mongoose.mongo.GridFSBucket(mongoose.connection.db);
        <span class="hljs-keyword">const</span> stream = gridFsBucket.openDownloadStream(file?._id);
        res.set(<span class="hljs-string">'Content-Type'</span>, file?.contentType);
        stream.pipe(res);
    } <span class="hljs-keyword">catch</span> (error) {
        res.status(<span class="hljs-number">500</span>).json({ <span class="hljs-attr">message</span>: error?.message, <span class="hljs-attr">success</span>: <span class="hljs-literal">false</span> });
    }
});
</code></pre>
<p>Conclusion: In this comprehensive guide, we have meticulously outlined a proficient approach to uploading and retrieving files in the MongoDB GridFS storage system using your Express server. Through a step-by-step breakdown of the process, we have elucidated the integration of essential dependencies, the creation of API routes, and the utilization of MongoDB's GridFSBucket for seamless file management. By adhering to these guidelines, you can establish a robust file management system within your Express application. If you encounter any challenges during implementation or wish to explore advanced concepts such as video streaming directly from the GridFS bucket, please feel free to engage with us through the comments section. Your inquiries and interests are valued and appreciated.</p>
]]></content:encoded></item><item><title><![CDATA[How to upload files into MongoDB using grifFs Storage and Node js]]></title><description><![CDATA[uploading media files into the Monogb database is quite convenient for a beginner developer. lots of developers face problems when they want to store files in MongoDB greater than 16MB, Because MongoDB Document size is 16MB, that's why we can't uploa...]]></description><link>https://blog.aadarshguru.com/how-to-upload-files-into-mongodb-using-griffs-storage-and-node-js</link><guid isPermaLink="true">https://blog.aadarshguru.com/how-to-upload-files-into-mongodb-using-griffs-storage-and-node-js</guid><category><![CDATA[MongoDB]]></category><category><![CDATA[File Upload]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[Grid fs bucket]]></category><category><![CDATA[GridFsStorage]]></category><dc:creator><![CDATA[Aadarsh Guru]]></dc:creator><pubDate>Wed, 09 Aug 2023 10:13:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cijiWIwsMB8/upload/7b5a450622b5c16ded093c738ea966aa.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>uploading media files into the Monogb database is quite convenient for a beginner developer. lots of developers face problems when they want to store files in MongoDB greater than 16MB, Because MongoDB Document size is 16MB, that's why we can't upload files that are greater than 16MB into a single document. To resolve this problem, MongoDB provides a method called GridFs Bucket in which mongoDB stores files by dividing them into 255kb chunks. you can read much more about it by clicking below.</p>
<p><a target="_blank" href="https://www.mongodb.com/docs/manual/core/gridfs/">Click here</a></p>
<p>now let's set up our simple project in which we will learn how to upload files into the MongoDB database using the GridFs method.</p>
<p>for this, you must have installed node js in your local system, if not make sure you have installed it before getting further.</p>
<p>In this blog, we will explore how to upload files into MongoDB using the <code>gridfs-storage</code> package in combination with <code>Node.js</code>, <code>Express</code>, <code>Multer</code>, and <code>Mongoose</code>. GridFS is a specification for storing and retrieving large files (such as images, audio, video, etc.) in MongoDB.</p>
<h3 id="heading-prerequisites"><strong>Prerequisites</strong></h3>
<p>Before we begin, make sure you have the following tools and libraries installed:</p>
<ol>
<li><p>Node.js and npm</p>
</li>
<li><p>Express.js</p>
</li>
<li><p>Mongoose</p>
</li>
<li><p>Multer</p>
</li>
<li><p>GridFS Storage</p>
</li>
</ol>
<p><strong>Step 1: Set Up the Project</strong></p>
<p>Make a project directory, open it in any code editor and run this command into the terminal "npm init -y"</p>
<pre><code class="lang-javascript">npm init -y
</code></pre>
<p>now after setting up your, you will be able to see a package.json file in your root directory.</p>
<p>now install these dependencies. by running this command.</p>
<pre><code class="lang-javascript">npm install express mongoose multer gridfs-stream
</code></pre>
<h3 id="heading-step-2-create-the-express-server"><strong>Step 2: Create the Express Server</strong></h3>
<p>Create a file named <code>app.js</code> (or <code>index.js</code>) in your project directory and set up the basic Express server:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> express = <span class="hljs-built_in">require</span>(<span class="hljs-string">'express'</span>);
<span class="hljs-keyword">const</span> mongoose = <span class="hljs-built_in">require</span>(<span class="hljs-string">'mongoose'</span>);
<span class="hljs-keyword">const</span> multer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'multer'</span>);
<span class="hljs-keyword">const</span> app = express();
<span class="hljs-keyword">const</span> port = process.env.PORT || <span class="hljs-number">3000</span>;
app.use(express.json());

<span class="hljs-keyword">const</span> mongoURI = <span class="hljs-string">'mongodb://localhost:27017/gridfs-file-upload'</span>;

<span class="hljs-keyword">const</span> connectToMongoDB = <span class="hljs-keyword">async</span> ()=&gt;{
 <span class="hljs-keyword">try</span>{
  <span class="hljs-keyword">await</span> mongoose.connect(mongoURI)
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'connected to database.'</span>)
 }<span class="hljs-keyword">catch</span>(error){
  <span class="hljs-built_in">console</span>.log(error)
 }
}
connectToMongoDB();

app.get(<span class="hljs-string">'/'</span>, <span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> {
  res.json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'Welcome to GridFS File Upload!'</span> });
});

app.listen(port, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Server is running on port <span class="hljs-subst">${port}</span>`</span>);
});
</code></pre>
<h3 id="heading-step-3-configure-multer-and-gridfs-storage"><strong>Step 3: Configure Multer and GridFS Storage</strong></h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> multer <span class="hljs-keyword">from</span> <span class="hljs-string">'multer'</span>
<span class="hljs-keyword">import</span> { GridFsStorage } <span class="hljs-keyword">from</span> <span class="hljs-string">'multer-gridfs-storage'</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> upload = multer({
    <span class="hljs-attr">storage</span>: <span class="hljs-keyword">new</span> GridFsStorage({
        <span class="hljs-attr">url</span>: mongoURI ,
        <span class="hljs-attr">file</span>: <span class="hljs-function">(<span class="hljs-params">req, file</span>) =&gt;</span> {
            <span class="hljs-keyword">return</span> {
                <span class="hljs-attr">bucketName</span>: <span class="hljs-string">"media"</span>,
                <span class="hljs-attr">filename</span>: <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-built_in">Date</span>.now()}</span>.<span class="hljs-subst">${file.originalname.split(<span class="hljs-string">'.'</span>).pop()}</span>`</span>
            }
        }
    })
})

app.post(<span class="hljs-string">'/upload'</span>, upload.single(<span class="hljs-string">'file'</span>), <span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (!req.file) {
    <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">400</span>).json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'No file uploaded'</span> });
  }
  <span class="hljs-keyword">return</span> res.json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'File uploaded successfully'</span> });
});
</code></pre>
<h3 id="heading-step-4-run-the-application"><strong>Step 4: Run the Application</strong></h3>
<p>Start the Express server:</p>
<pre><code class="lang-javascript">node app.js
</code></pre>
<p>by hitting the upload route with post API along with a file in the form of FornData you'll be able to upload the file into the MongoDB database, This setup allows you to upload files to MongoDB using the GridFS specification. You can further enhance this application by adding features such as file retrieval, deleting files, and more.</p>
<p>Feel free to explore more advanced features and customize the application according to your needs.</p>
<p>if you want to know how can we upload files without using 'multer-gridfs-storage', comments down and ill be wring the blog on that too. similarly, if you want to know how can we retrieve files from the GridFs Bucket, let me know in the comments.</p>
]]></content:encoded></item></channel></rss>