<?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: Alexis Clarembeau</title>
    <description>The latest articles on DEV Community by Alexis Clarembeau (@alexis_clarembeau_8c3c0e2).</description>
    <link>https://dev.to/alexis_clarembeau_8c3c0e2</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%2F1828221%2Fc1159e76-019e-456f-b553-244fabfa1cd9.jpg</url>
      <title>DEV Community: Alexis Clarembeau</title>
      <link>https://dev.to/alexis_clarembeau_8c3c0e2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexis_clarembeau_8c3c0e2"/>
    <language>en</language>
    <item>
      <title>A new tool to manage your i18n locale files</title>
      <dc:creator>Alexis Clarembeau</dc:creator>
      <pubDate>Fri, 29 Aug 2025 05:20:42 +0000</pubDate>
      <link>https://dev.to/alexis_clarembeau_8c3c0e2/a-new-tool-to-manage-your-i18n-locale-files-2cam</link>
      <guid>https://dev.to/alexis_clarembeau_8c3c0e2/a-new-tool-to-manage-your-i18n-locale-files-2cam</guid>
      <description>&lt;h1&gt;
  
  
  🌐 CLI18n: The Translation Management Tool Your JavaScript Project Needs
&lt;/h1&gt;

&lt;p&gt;Managing internationalization (i18n) in JavaScript projects can be a real pain. Scattered translation keys, duplicate values, unused translations cluttering your locale files, and the constant back-and-forth between code and translation files. Sound familiar?&lt;/p&gt;

&lt;p&gt;I've been working on &lt;strong&gt;CLI18n&lt;/strong&gt; – a powerful CLI tool that tackles these exact problems and makes managing translations actually enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is CLI18n?
&lt;/h2&gt;

&lt;p&gt;CLI18n is a comprehensive internationalization management tool that helps you extract, organize, and maintain translation keys in your JavaScript projects. Think of it as your i18n Swiss Army knife.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Smart Key Extraction&lt;/strong&gt;: Automatically scan your codebase and extract translation keys using customizable regex patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔄 Duplicate Detection&lt;/strong&gt;: Find duplicate translations across locale files to maintain consistency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗑️ Cleanup Tools&lt;/strong&gt;: Remove unused translations to keep your locale files clean&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌐 Web Interface&lt;/strong&gt;: Beautiful, responsive web UI for managing translations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Real-time Editing&lt;/strong&gt;: Edit translations with instant file updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Smart Filtering&lt;/strong&gt;: Focus on untranslated keys or search specific terms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📱 Mobile-Friendly&lt;/strong&gt;: Works seamlessly on any device&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Global installation&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; cli18n

&lt;span class="c"&gt;# Or use locally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; cli18n

&lt;span class="c"&gt;# Or run without installing&lt;/span&gt;
npx cli18n extract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Quick Setup
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;cli18n.json&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"regex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;('([^']*)'&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"locales/{{lang}}.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"languages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Real-World Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Extract Translation Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cli18n extract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This scans your entire codebase, finds patterns like &lt;code&gt;t('welcome.message')&lt;/code&gt;, and automatically generates/updates your locale files while preserving existing translations.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Find Duplicate Translations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cli18n duplicates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ever had the same translation value scattered across different keys? This command finds them all, helping you maintain consistency and reduce redundancy.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Clean Up Unused Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cli18n prune-unused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over time, translation keys pile up. This command removes keys that are no longer referenced in your codebase, keeping your locale files lean and maintainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Visual Translation Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cli18n serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This launches a beautiful web interface where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse all translation keys in a clean table&lt;/li&gt;
&lt;li&gt;Edit translations inline with auto-save&lt;/li&gt;
&lt;li&gt;Filter by language or search for specific keys&lt;/li&gt;
&lt;li&gt;Focus on untranslated keys (highlighted in red)&lt;/li&gt;
&lt;li&gt;Work on mobile or desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Perfect For These Scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Migrating an existing project to i18n?&lt;/strong&gt; CLI18n can scan your entire codebase and extract all the hardcoded strings you need to translate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with a translation team?&lt;/strong&gt; The web interface makes it easy for non-technical team members to contribute translations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintaining a large multilingual app?&lt;/strong&gt; The duplicate detection and cleanup tools keep your translations organized as your project grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting a new international project?&lt;/strong&gt; Set up your i18n workflow from day one with automated extraction and management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
├── cli18n.json
├── src/
│   ├── components/
│   │   └── Header.js       // t('nav.home'), t('nav.about')
│   └── pages/
│       └── Login.js        // t('login.title'), t('login.submit')
└── locales/
    ├── en.json             // Auto-generated
    ├── fr.json             // Auto-generated
    └── es.json             // Auto-generated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Programmatic API
&lt;/h2&gt;

&lt;p&gt;You can also integrate CLI18n into your build process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;extractTranslations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;findDuplicateTranslations&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cli18n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// In your build script&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;extractTranslations&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;findDuplicateTranslations&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;After working on several international JavaScript projects, I kept running into the same issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual translation key management was error-prone&lt;/li&gt;
&lt;li&gt;Finding unused translations was nearly impossible&lt;/li&gt;
&lt;li&gt;Non-technical team members struggled with JSON files&lt;/li&gt;
&lt;li&gt;Duplicate translations created inconsistent UX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLI18n solves all these problems with a workflow that actually scales.&lt;/p&gt;

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

&lt;p&gt;I'm actively working on CLI18n and have some exciting features planned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration with popular translation services&lt;/li&gt;
&lt;li&gt;VS Code extension for inline translation editing&lt;/li&gt;
&lt;li&gt;Advanced analytics and translation progress tracking&lt;/li&gt;
&lt;li&gt;Support for more file formats beyond JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Today!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cli18n extract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! CLI18n will guide you through the setup and start managing your translations immediately.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/cli18n" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you tried CLI18n? What i18n challenges are you facing in your projects? Let me know in the comments!&lt;/p&gt;

</description>
      <category>i18n</category>
      <category>opensource</category>
      <category>npm</category>
      <category>cli</category>
    </item>
    <item>
      <title>How are responsive websites doing in 2024?</title>
      <dc:creator>Alexis Clarembeau</dc:creator>
      <pubDate>Tue, 22 Oct 2024 19:33:38 +0000</pubDate>
      <link>https://dev.to/alexis_clarembeau_8c3c0e2/how-are-responsive-websites-doing-in-2024-33no</link>
      <guid>https://dev.to/alexis_clarembeau_8c3c0e2/how-are-responsive-websites-doing-in-2024-33no</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;By 2024, mobile devices will account for over half of all internet traffic. A laptop or desktop computer is no longer a necessary tool for many people, who are increasingly using smartphones and tablets to explore the web. The internet is now mobile-first, whether it's for productivity, social media, or e-commerce. Because of this change, responsive web design is essential to making sure that websites work and look good on a variety of screens and devices.&lt;/p&gt;

&lt;p&gt;We know it can be costly and time-consuming to develop for numerous platforms, particularly when creating native mobile apps. It takes several codebases, specialized teams, and continuous platform maintenance to develop distinct apps for iOS, Android, and the web. Businesses incur much higher expenses as a result, and feature rollouts are slowed down. Complexity is increased by the difficulty developers still have maintaining platform-specific adaptations.&lt;/p&gt;

&lt;p&gt;There are a number of ways to make multi-platform programming less complicated. Code reuse across platforms is made possible by hybrid frameworks such as Flutter, React Native, and Progressive Web Apps (PWAs). Nevertheless, these solutions frequently have drawbacks.&lt;/p&gt;

&lt;p&gt;In today's post we'll talk about responsive websites as a potential solution for building multi-platform applications.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive websites
&lt;/h2&gt;

&lt;p&gt;A responsive website is one that is made to dynamically change its functionality, content, and layout according on the platform, screen size, and orientation of the user. Without requiring separate versions of the website, a responsive website guarantees that the material is designed for the optimal viewing experience on every device, whether a user is accessing it from a desktop, laptop, tablet, or smartphone.&lt;/p&gt;

&lt;p&gt;When you use responsive web design, you only need to write and manage a single codebase that functions across desktop, tablet, and mobile devices. As opposed to creating distinct apps for iOS, Android, and the web, this lowers the complexity and development costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to implement it?
&lt;/h3&gt;

&lt;p&gt;To implement a responsive website, you need to use different css techniques such as flexible layouts (like grids), scalable images, and media queries in CSS to adjust the site's design based on the device's screen size. By defining breakpoints, you can change the layout and styling of elements as the screen gets smaller or larger. For example, you can switch from a multi-column desktop layout to a single-column mobile layout, ensuring a seamless user experience across all devices. Here's an example of using a media query to handle a mobile breakpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Desktop styles */&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Mobile breakpoint */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The layout in this example changes from a block layout on smaller devices to a flexbox layout on larger ones. This improves the content's mobile friendliness without requiring a complete redesign.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus: CSS may not need drastic changes
&lt;/h3&gt;

&lt;p&gt;It is frequently not necessary to dramatically alter the layout of a well-designed responsive website for mobile devices. You can easily make your website responsive to mobile screens by changing the layout to a one-column format and making minor adjustments to the sizes and paddings. Certain parts can be made mobile-friendly if needed, but the fundamental codebase stays the same, cutting down on redundancy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The evolution of responsive websites
&lt;/h3&gt;

&lt;p&gt;With new capabilities like Grid, Flexbox, and advanced media queries being nearly fully supported by contemporary browsers, CSS has seen substantial development. Additionally, JavaScript support has improved significantly, acting consistently in the majority of browsers. To assist designers in managing mobile devices with dynamic screen heights (like those with notches or on-screen keyboards), new units like &lt;code&gt;dvh&lt;/code&gt; (Dynamic Viewport Height) are being developed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Example using dvh unit */&lt;/span&gt;
&lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="n"&gt;dvh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Adjusts based on available viewport height */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with these developments, creating completely responsive, mobile-friendly websites remains difficult. Using Service Workers to develop offline-first web apps can be challenging and prone to mistakes. Furthermore, despite its improvements, Safari on iOS still lags behind other browsers in terms of consistency and support, and several issues are still being reported. Additionally, developers may need to address additional edge circumstances brought about by users on outdated devices or browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world example: Our application
&lt;/h3&gt;

&lt;p&gt;As an example, we want to show our application: &lt;a href="https://touchlead.app" rel="noopener noreferrer"&gt;Touchlead&lt;/a&gt;, a marketing automation software. &lt;br&gt;
To achieve mobile support, we built our web application using Tailwind CSS. &lt;br&gt;
We created mobile-friendly layouts easily, using utility classes like &lt;code&gt;md:flex-col&lt;/code&gt; to adjust for mobile breakpoints. For example, on desktop, we use a horizontal flex layout, and on mobile, we switch to a column layout, all with minimal code changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col md:flex-row p-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content 1&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content 2&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This strategy has allowed us to keep our codebase consistent while guaranteeing a fantastic desktop and mobile user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Let's tell us what you think about responsivity in website design in 2024. &lt;br&gt;
Do you use it to build your sites and applications, or, do you consider the challenges are too high?&lt;br&gt;
Your opinions and experiences about responsive web design would be greatly appreciated. &lt;br&gt;
Have you encountered difficulties when creating content for many platforms? &lt;br&gt;
Which remedies have you discovered to work best? Tell us what you think!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mobile</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>From idea to launch: Creating a multi-platform SaaS with a small development team</title>
      <dc:creator>Alexis Clarembeau</dc:creator>
      <pubDate>Fri, 06 Sep 2024 05:21:10 +0000</pubDate>
      <link>https://dev.to/alexis_clarembeau_8c3c0e2/from-idea-to-launch-creating-a-multi-platform-saas-with-a-small-development-team-33ke</link>
      <guid>https://dev.to/alexis_clarembeau_8c3c0e2/from-idea-to-launch-creating-a-multi-platform-saas-with-a-small-development-team-33ke</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Before we start, two small disclaimers: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This post tells our own experience of building a SAAS application. It doesn't say anything about what you should or should not do. There is no universal truth when it comes to building something. Our goal is to give you inspiration and ideas to build your application or project.&lt;/li&gt;
&lt;li&gt;We also use AI-generated images from Bing image creator to illustrate the sections. If you don't like them, tell me, I can change it, if it causes issues in the reading. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building a SaaS product is an exciting journey, filled with learning and challenges. In this post, I’ll walk you through how we created &lt;strong&gt;Touchlead&lt;/strong&gt;—an all-in-one marketing solution for businesses—starting with just a small development team. While this isn’t about selling anything, we’ll share the steps we took from ideation to launch, hoping you find some useful takeaways. You can check out Touchlead at &lt;a href="https://touchlead.app" rel="noopener noreferrer"&gt;touchlead.app&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Before we start
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6hhnjo315eqclbpj3nk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6hhnjo315eqclbpj3nk.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Created SaaS
&lt;/h2&gt;

&lt;p&gt;The idea of building our own product had always been exciting. With SaaS, we could experiment quickly compared to hardware or on-premise software. The ability to iterate rapidly based on feedback and continuously improve was incredibly appealing.&lt;/p&gt;

&lt;p&gt;We also had some past experience building SaaS applications, and starting this project on the side while maintaining our full-time jobs helped avoid the pressure of diving in too fast. It allowed us the freedom to test ideas without the risk of jumping into something prematurely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the Idea
&lt;/h2&gt;

&lt;p&gt;One of the most important things when creating a product is picking a domain you understand and enjoy. In our case, sales and marketing are critical for many businesses, and it was something we were familiar with. This was our focus for Touchlead: building a solution to simplify marketing for small businesses, helping them generate more leads and close more deals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gathering a Team
&lt;/h2&gt;

&lt;p&gt;You don’t need a big team to start. In fact, the more people you add, the harder it becomes to coordinate everything. Initially, I started this project solo, handling everything from coding to marketing. As the idea matured, I reached out to professionals from my network and friends to lend their expertise. If you're starting out, don’t hesitate to work solo—additional help can always come later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the Name
&lt;/h2&gt;

&lt;p&gt;Choosing the right name for your product can feel daunting, but it doesn’t have to be perfect. The key is to find something easy to understand and relevant to your audience. For us, &lt;strong&gt;Touchlead&lt;/strong&gt; made sense. It reflects our product’s mission: helping businesses get in touch with more leads. Don’t overthink it—many successful applications use simple and effective names.&lt;/p&gt;

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

&lt;p&gt;There’s no universal "best" tech stack. We decided to go with what we knew best: &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, &lt;strong&gt;Koa&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, and &lt;strong&gt;Vite&lt;/strong&gt;. This is a common and well-supported stack that allowed us to build fast and efficiently. These technologies have large communities and plenty of resources, which made it easier to find solutions when we ran into problems.&lt;/p&gt;

&lt;p&gt;However, the most important thing is to use technologies that you and your team are comfortable with, as long as they meet your product’s requirements. What matters most is being able to iterate quickly and stay adaptable as your project evolves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make Smart Choices for Multiplatform
&lt;/h3&gt;

&lt;p&gt;From the very beginning, we knew we wanted &lt;strong&gt;Touchlead&lt;/strong&gt; to be accessible on multiple platforms. This meant the technology stack we chose had to support cross-platform functionality without requiring us to rebuild the app multiple times for different devices or operating systems.&lt;/p&gt;

&lt;p&gt;That’s why we opted for &lt;strong&gt;web technologies&lt;/strong&gt;. By using a stack based on &lt;strong&gt;React&lt;/strong&gt; for the frontend, we could easily build an interface that works on desktop, tablet, and mobile without needing separate codebases for each platform. With a responsive design, the same React code adapts to various screen sizes, ensuring seamless user experience on any device.&lt;/p&gt;

&lt;p&gt;On the backend, &lt;strong&gt;Node.js&lt;/strong&gt; allowed us to create a robust API that works equally well for any front-end client, whether it’s a web browser or a mobile app. This decision also opened the door for future possibilities like packaging the app as a Progressive Web App (PWA) or even using frameworks like &lt;strong&gt;React Native&lt;/strong&gt; to create mobile applications without reworking everything from scratch.&lt;/p&gt;

&lt;p&gt;This approach saved us countless hours in development time and ensured that as we expand, we can support multiple platforms with minimal friction. Whether on Windows, macOS, iOS, or Android, our users get the same consistent experience—all without having to build and maintain 10 different versions of the app.&lt;/p&gt;

&lt;p&gt;In short, by choosing a &lt;strong&gt;web-first tech stack&lt;/strong&gt;, we future-proofed our development efforts while keeping things flexible and efficient, ensuring Touchlead is accessible wherever users need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting Provider
&lt;/h2&gt;

&lt;p&gt;In the early stages, it’s easy to overthink hosting, but the truth is: keep it simple. When we first started, we ran everything locally while testing the application. This allowed us to develop and iterate without incurring any hosting costs.&lt;/p&gt;

&lt;p&gt;As we prepared to go live and gain our first users, we opted to rent a single OVH VPS (Virtual Private Server) to host everything, including the app itself, the database, and any tools we needed. This approach kept our costs extremely low while giving us enough control and flexibility to scale as needed. Cloud providers like AWS or Google Cloud can offer great services, but they can quickly become expensive, especially in the early stages when you're trying to stay lean.&lt;/p&gt;

&lt;p&gt;By using an OVH VPS, we were able to host our entire stack—from the front-end app to the backend API and database—on a single server. This setup worked well for our initial traffic and allowed us to have everything in one place, simplifying management. For most small projects, this is more than sufficient until you start getting significant traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing Costs
&lt;/h3&gt;

&lt;p&gt;Cost control is crucial when you’re a small team, especially when you don’t yet have paying users. With cloud providers, the temptation to spin up multiple services—load balancers, database instances, scaling groups—can quickly drive up your monthly expenses. Instead, by sticking to a single server, we were able to run efficiently without unnecessary overhead.&lt;/p&gt;

&lt;p&gt;We chose OVH because it offered reliable service at an affordable price, but similar providers such as DigitalOcean, Linode, or Vultr would work just as well. For us, it was all about finding a balance between performance and affordability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaling as You Grow
&lt;/h3&gt;

&lt;p&gt;As your application grows and traffic starts to increase, you can look into more advanced solutions. One option is to offload certain components (like databases) to specialized cloud services or scale horizontally by adding more servers. Another route is using Docker as a service, which can simplify deployment and scaling by packaging your app into containers.&lt;/p&gt;

&lt;p&gt;But there’s no need to rush into this. Early on, keeping your infrastructure simple and costs low allows you to focus more on building features and gathering user feedback. Once you start seeing consistent traffic and usage, then you can explore more sophisticated hosting options.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Let's get started
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr951ep3fbdk1whqy7i1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr951ep3fbdk1whqy7i1.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Coding
&lt;/h2&gt;

&lt;p&gt;When you start coding, resist the urge to build too many features right away. Focus on the core functionality that solves your users' most immediate needs. It won’t be perfect, and that’s okay—your architecture can always be revised later. Write some tests, but don’t get bogged down in trying to make everything flawless at the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch and Get Feedback
&lt;/h2&gt;

&lt;p&gt;The sooner you can get feedback, the better. Launching early helps you catch mistakes and fine-tune your product based on real-world usage. Engage with communities, forums, and blogs to gather insights. We used platforms like &lt;a href="https://touchlead.featurebase.app/fr" rel="noopener noreferrer"&gt;Touchlead’s feedback system&lt;/a&gt; to collect feedback, and it’s been invaluable. Take suggestions seriously, but keep your vision in mind. Ultimately, the only feedback that truly matters is from your real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sales and Marketing
&lt;/h2&gt;

&lt;p&gt;As a small team, you need to get creative with sales and marketing. We relied heavily on free, automated tools like Google Search Console, Google Analytics, and in-app logs. Don’t neglect your onboarding process or marketing website—it’s the front page of your product. Building a professional site can be expensive, but there are plenty of free resources out there (e.g., free themes or platforms like WordPress) to get you started.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Once it's live
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8fyccajp28hj7hc773ux.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8fyccajp28hj7hc773ux.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Iteration
&lt;/h2&gt;

&lt;p&gt;Iteration is the key to success. We keep a list of features and improvements we want to work on and are constantly iterating based on user feedback. You don’t need a complex structure to manage tasks—tools like Trello can be just as effective as more robust platforms like Jira. The goal is to stay flexible and continuously improve.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Conclusion
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77483pgool4s69wqzq0d.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77483pgool4s69wqzq0d.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope this post provided some helpful insights into the journey of building a multi-platform SaaS with a small team. Feel free to share your thoughts or ask any questions—I'd love to hear your feedback!&lt;/p&gt;

</description>
      <category>saas</category>
      <category>product</category>
      <category>marketing</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
