<?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: Adrian Crîșmaruc</title>
    <description>The latest articles on DEV Community by Adrian Crîșmaruc (@adrian_crismaruc).</description>
    <link>https://dev.to/adrian_crismaruc</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%2F3495295%2Fd01f2dd2-dee8-4ba2-924e-e75e74be413a.jpeg</url>
      <title>DEV Community: Adrian Crîșmaruc</title>
      <link>https://dev.to/adrian_crismaruc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adrian_crismaruc"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Adrian Crîșmaruc</dc:creator>
      <pubDate>Thu, 11 Sep 2025 14:43:16 +0000</pubDate>
      <link>https://dev.to/adrian_crismaruc/-43n8</link>
      <guid>https://dev.to/adrian_crismaruc/-43n8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf" class="crayons-story__hidden-navigation-link"&gt;My 18-Month Journey Building a SaaS App&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="/adrian_crismaruc" 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%2F3495295%2Fd01f2dd2-dee8-4ba2-924e-e75e74be413a.jpeg" alt="adrian_crismaruc profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/adrian_crismaruc" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Adrian Crîșmaruc
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Adrian Crîșmaruc
                
              
              &lt;div id="story-author-preview-content-2839275" 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="/adrian_crismaruc" 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%2F3495295%2Fd01f2dd2-dee8-4ba2-924e-e75e74be413a.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Adrian Crîșmaruc&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/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 11 '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/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf" id="article-link-2839275"&gt;
          My 18-Month Journey Building a SaaS App
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&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/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf#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;
            6 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>programming</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>rust</category>
    </item>
    <item>
      <title>My 18-Month Journey Building a SaaS App</title>
      <dc:creator>Adrian Crîșmaruc</dc:creator>
      <pubDate>Thu, 11 Sep 2025 14:37:39 +0000</pubDate>
      <link>https://dev.to/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf</link>
      <guid>https://dev.to/adrian_crismaruc/my-18-month-journey-building-a-saas-app-2njf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;10,000+ photos. Hundreds of videos. One specific memory I desperately needed to find.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sound familiar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Tip: Skip to the solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://rekosearch.com/demo" rel="noopener noreferrer"&gt;RekoSearch Demo&lt;/a&gt; yourself, sign up for the &lt;a href="https://rekosearch.com/beta?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-rekosearch-initial" rel="noopener noreferrer"&gt;RekoSearch Closed Beta&lt;/a&gt; or explore the &lt;a href="https://github.com/Obscurely/RekoSearch-Public" rel="noopener noreferrer"&gt;technical deep-dive&lt;/a&gt; if you're curious about the architecture and implementation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When Digital Hoarding Becomes a Real Problem
&lt;/h2&gt;

&lt;p&gt;About a year and a half ago, I was looking for my next big project, but I wasn't sure what it would be. Fortunately, while I was trying to filter through my media and find some very specific photos and videos, I encountered a problem that motivated me to build this.&lt;/p&gt;

&lt;p&gt;The problem is that I have literally over 10,000 photos and videos, and while they are organized by year and even by period, that still results in hundreds per folder. Going through everything to find exactly what I need takes time, and a lot of it.&lt;/p&gt;

&lt;p&gt;While there are tools that allow you to find a piece of media by face or search for text within them, they either don't provide in-depth enough searching capabilities, a broad enough scope of things to search for, or are tailored to a particular use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  RekoSearch: Semantic Search Across All Your Content
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://rekosearch.com" rel="noopener noreferrer"&gt;RekoSearch&lt;/a&gt;, on the other hand, allows you to simultaneously search across photos, videos, documents, and audio files semantically, using natural language queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Natural Language Search&lt;/strong&gt;: Search using phrases like 'dog mountain' to find all photos and videos with mountains and dogs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📁 Multi-Format Support&lt;/strong&gt;: Search across photos, videos, documents, and audio files simultaneously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Advanced Queries&lt;/strong&gt;: Use Boolean operators and filters for precise results with complex search logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, you may be looking for something simple like "dog mountain" which in this case would return all photos and videos having a mountain and a dog in them or a phrase like "happy birthday" which will return photos, videos, documents and audio files containing either the sentence "happy birthday" or happy people and a birthday-like scene.&lt;/p&gt;

&lt;p&gt;Or you may have a more advanced need, in which case, consider this example: you have created a new product, such as a couch, and recorded a promotional video for it, but it required many takes. You specifically want to look at those that feature the product, the brand name, and the person in them is not sad. In this case, you could do an advanced search query like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;label:couch AND text:"brand name" NOT face:sad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Furthermore, &lt;a href="https://rekosearch.com" rel="noopener noreferrer"&gt;RekoSearch&lt;/a&gt; also features functions such as filtering, saving searches, downloading results, and many more features planned for implementation.&lt;/p&gt;

&lt;p&gt;Building this, however, turned out to be far more complex than I initially anticipated.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Technical Challenge: Why This Was Hard to Build
&lt;/h2&gt;

&lt;p&gt;At first, thinking about how to build it didn't seem that hard, but I soon realized this was way more complex than I expected. Even a simple thing, such as authentication and authorization for someone like me who hasn't implemented OAuth 2.0 from scratch before, was challenging. Still, you have to ensure it's secure when actual people's money is involved.&lt;/p&gt;

&lt;p&gt;Another challenge that has arisen as I've delved deeper into the project is the sheer size and complexity of managing everything. You have infrastructure, API methods each with their own program (15+ Lambda functions), backend processing servers, which in themselves could be entirely separate projects, and the frontend Homepage and Dashboard (which are both separate entities). To make a change or add something new, you need to ensure it propagates and works well with everything else, from the backbone to what the user sees.&lt;/p&gt;

&lt;p&gt;Plus many other challenges related, but not limited to (with non-exhaustive examples):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: processing many files without delays, wasting resources and unnecessary costs (solution: scheduling job processors on AWS Fargate).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: ensuring user data is handled securely, encrypted, and access to it is limited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: not leaving out resources unused in case of processing simple files like images, and thus processing multiple in parallel for faster processing times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Optimization&lt;/strong&gt;: Utilizing the cheapest hosting options (e.g, using Digital Ocean instead of AWS for the Kubernetes cluster) and building more efficient components (e.g, using Rust Lambda functions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Service Integration&lt;/strong&gt;: Learning and utilizing the SDK for each AWS service, all of them having their own tricks and ways of handling things.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Niche Implementation Challenges&lt;/strong&gt;: Things that you would think someone has to have implemented a way to do this, or there has to be a standard defined, only to find out there isn't, and you are all on your own. An example in this case would be reliably counting the pages in a PDF file, tamper-proof and exploit-proof, by streaming it and doing so exceptionally fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combine all of these, and from the 3-4 months I initially thought it would take me to develop this, I am &lt;strong&gt;1.5 years and over 60,000 lines of code later&lt;/strong&gt;, and this is only the start of the beta.&lt;/p&gt;

&lt;p&gt;Yet, by no means do I regret taking on this project; in fact, I am actually thrilled. The amount of knowledge I gained in this year and a half of building a proper, enterprise-like SaaS application is something I could never have acquired by building smaller desktop apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;I could not possibly explain everything in a paragraph or two here, so if you are interested in a deep dive, please don't hesitate to check the public repository containing highly in-depth documentation and technical diagrams that cover every aspect of it: &lt;a href="https://github.com/Obscurely/RekoSearch-Public" rel="noopener noreferrer"&gt;https://github.com/Obscurely/RekoSearch-Public&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Infrastructure
&lt;/h3&gt;

&lt;p&gt;All managed by Terraform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Services&lt;/strong&gt; for managing stuff like login (Cognito), databases (DynamoDB), storage (S3) and the processing of the files (Rekognition, Textract and Transcribe).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes Cluster&lt;/strong&gt; on DigitalOcean for hosting the Dashboard, the Queue Processor (which listens to jobs pushed to the SQS queue and spins up job processing applications on AWS Fargate, allowing for infinite job processing scalability), the stats application (Grafana), and the analytics application (Umami).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Backend
&lt;/h3&gt;

&lt;p&gt;All programmed in &lt;strong&gt;Rust&lt;/strong&gt;, allowing for fast and safe execution of all the backend services, as well as lower costs in case of AWS Lambda (pre-compiled Rust functions are much quicker and lighter weight and can also run on arm64, making them dirt cheap).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Frontend
&lt;/h3&gt;

&lt;p&gt;Built using &lt;strong&gt;TypeScript and Python&lt;/strong&gt;, it's split into two components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The homepage&lt;/strong&gt;: a Next.js static website exported and hosted on S3 behind Cloudfront, handles any amount of traffic with ease and at a very low cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dashboard&lt;/strong&gt;: a React SPA hosted on the Kubernetes cluster using Gunicorn (production WSGI server) and Flask as the business logic layer. It can be scaled as needed, and in this case, users pay for it when processing their files.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;✅ The Power of Rust + ARM64&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's how much of a crazy difference developing your Lambda functions in Rust and running them on ARM makes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rust lambda functions execute on average &lt;strong&gt;10 to 100 times faster&lt;/strong&gt; than Python-based ones.&lt;/li&gt;
&lt;li&gt;Say you pay about $100 a month for Lambda functions written in Python that run on x86. If you convert to arm64, you save about 20%, so you are down to about 80%. If you convert to Rust due to its greater efficiency, you will be down to about $15-30 per month. &lt;strong&gt;That's a 70-85% reduction in costs!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I plan to continually work on and improve this project, as it's very close to my heart and I genuinely enjoy working on it. Some of the features I have planned that are in my immediate attention include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementing the use of parentheses&lt;/strong&gt; in the search query to allow writing complex queries easier. Currently, the search follows the algebraic Boolean order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementing an API keys system&lt;/strong&gt;, allowing the use of the API outside the Dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adding support for more file types&lt;/strong&gt; by converting them on the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adding social provider identities&lt;/strong&gt; for login (OIDC for Google, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementing a library-like feature&lt;/strong&gt; for organizing searches, files, combining multiple jobs and other features to turn it into a fully fledged knowledge mining platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My long-term vision for &lt;a href="https://rekosearch.com" rel="noopener noreferrer"&gt;RekoSearch&lt;/a&gt; is tied to the last feature I mentioned. I want to implement multiple features, including organizing, filtering, combining various data sources, adding integrations with other platforms, and others, to make it a one-stop solution for all knowledge mining-related needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experience RekoSearch Yourself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://rekosearch.com/beta?utm_source=blog&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blog-rekosearch-initial" rel="noopener noreferrer"&gt;Get Started with Closed Beta&lt;/a&gt;&lt;/strong&gt;: 50 free credits ($5 value) • Perfect for testing with your own files • No commitment required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Obscurely/RekoSearch-Public" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;: Complete architecture documentation • Technical diagrams and implementation details • Deep dive into how I built it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://rekosearch.com" rel="noopener noreferrer"&gt;Main Website&lt;/a&gt;&lt;/strong&gt;: Learn more about RekoSearch and its capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Want to Connect?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send me an email straight at &lt;a href="mailto:me@adrian.tech"&gt;me@adrian.tech&lt;/a&gt; or use the contact form on my &lt;a href="https://adrian.tech/#contact" rel="noopener noreferrer"&gt;portfolio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reach out to me on &lt;a href="https://www.linkedin.com/in/adrian-crismaruc" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Or even send me a message on &lt;a href="https://www.reddit.com/user/CrismarucAdrian/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
