<?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: Omar Guerrero</title>
    <description>The latest articles on DEV Community by Omar Guerrero (@omargpax).</description>
    <link>https://dev.to/omargpax</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3039450%2F0df4f4a8-c010-4068-a432-02d6b12fe3fb.png</url>
      <title>DEV Community: Omar Guerrero</title>
      <link>https://dev.to/omargpax</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omargpax"/>
    <language>en</language>
    <item>
      <title>D-MO (Data Micro-Optimizer)</title>
      <dc:creator>Omar Guerrero</dc:creator>
      <pubDate>Tue, 18 Aug 2026 21:07:05 +0000</pubDate>
      <link>https://dev.to/omargpax/d-mo-data-micro-optimizer-244f</link>
      <guid>https://dev.to/omargpax/d-mo-data-micro-optimizer-244f</guid>
      <description>&lt;p&gt;In day-to-day software development and data analysis, preparing and cleaning financial files is often one of the most repetitive and error-prone tasks. Dealing with rigid layouts, misaligned rows, and column names that change without warning creates constant operational friction.&lt;/p&gt;

&lt;p&gt;To solve this problem at its root—while maintaining a strict focus on information security—I developed &lt;strong&gt;D-MO (Data Micro-Optimizer)&lt;/strong&gt;, a powerful &lt;strong&gt;ETL (Extract, Transform, Load)&lt;/strong&gt; web-based processing tool that runs entirely on the client side.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Origin: Privacy by Design
&lt;/h2&gt;

&lt;p&gt;When handling banking reports or sensitive financial information, uploading them to external conversion platforms represents a critical security risk. &lt;strong&gt;D-MO was built on the principle of absolute privacy:&lt;/strong&gt; all processing takes place locally in the browser's memory on the client side. Structured data is never sent to an external server, eliminating network latency and providing a &lt;em&gt;zero-server-overhead&lt;/em&gt; environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline Architecture (Data Flow)
&lt;/h2&gt;

&lt;p&gt;The system processes information sequentially through a decoupled pipeline, making it possible to transform complex files into production-ready datasets with a single click.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   [ Local File ] (.csv / .xlsx / .xlsb)
         │
         ▼
   ┌──────────────┐
   │   DropZone   │ ◄── File Extension and Size Validation
   └──────┬───────┘
         │ (Buffer / Plain Text)
         ▼
   ┌──────────────┐
   │ File Parser  │ ◄── Delimiter Detection and Dynamic Header Resolution
   └──────┬───────┘
         │ (Normalized JSON)
         ▼
   ┌──────────────┐
   │  ETL Engine  │ ◄── Business Rules, Alias Mapping, and CUSTOM Filters
   └──────┬───────┘
         │ (Clean Dataset)
         ▼
   ┌──────────────┐
   │ Export File  │ ◄── Generation of Clean, Ready-to-Use Reports
   └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Core and System Layers
&lt;/h2&gt;

&lt;p&gt;The application is built with &lt;strong&gt;Next.js 14 (App Router)&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;, with its internal logic divided into three main components:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Interface and Coordination (&lt;code&gt;page.tsx&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;It acts as the orchestrator of the data lifecycle. It captures uploaded files through a drag-and-drop interface (&lt;code&gt;DropZone&lt;/code&gt;), invokes the parsing utilities, feeds the transformation engine with the current state, and dynamically updates the UI metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Parsing and Serialization Layer (&lt;code&gt;file-parser.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses the &lt;code&gt;xlsx&lt;/code&gt; (SheetJS) library to analyze workbooks, normalize raw data, and dynamically identify the correct header row in complex Excel files.&lt;/li&gt;
&lt;li&gt;Implements &lt;code&gt;papaparse&lt;/code&gt; for fast in-memory parsing and automatic delimiter detection in CSV files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Variation-Tolerant Rules Engine (&lt;code&gt;etl-engine.ts&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;This is the brain of D-MO. It uses a robust matching system based on string normalization functions. This allows the engine to identify dynamic headers through a flexible alias catalog, processing layouts with subtle variations in column names without breaking the transformation workflow.&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;// Enfoque conceptual del mapeo dinámico y tolerante a alias&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resolveColumnHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aliasMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&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;normalizedTarget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\s&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&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;for &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;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;aliasMap&lt;/span&gt;&lt;span class="p"&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;aliases&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[\s&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;normalizedTarget&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;key&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="kc"&gt;null&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;
  
  
  Dashboard and Real-Time Indicators
&lt;/h2&gt;

&lt;p&gt;To provide visual support and full traceability throughout the technical process, the UI includes two key sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Log Console (&lt;code&gt;LogConsole&lt;/code&gt;):&lt;/strong&gt; Provides real-time visual auditing of every validation and transformation performed by the engine, categorized by status through a clean design (&lt;code&gt;info&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics Panel (&lt;code&gt;StatsBar&lt;/code&gt;):&lt;/strong&gt; Provides immediate analytical visibility into processed vs. exported rows, the number of resulting columns, and the exact execution time of the pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Approach Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Traditional Processing (Server)&lt;/th&gt;
&lt;th&gt;D-MO Approach (Client-Side)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Potential risk when transferring data to third parties&lt;/td&gt;
&lt;td&gt;Absolute privacy; data never leaves the browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure Costs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires dedicated servers and scalable computing resources&lt;/td&gt;
&lt;td&gt;Zero infrastructure consumption; leverages the client's hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subject to network upload and download latency&lt;/td&gt;
&lt;td&gt;Instant processing directly in memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;D-MO demonstrates that it is not always necessary to delegate heavy operational data workflows to complex backend architectures. Moving the logic of a direct ETL pipeline to the client side using TypeScript not only reduces infrastructure costs, but also addresses the most critical factor in corporate financial environments: regulatory compliance and data protection.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; When building client-side data tools, prioritize libraries that support chunked reading or streaming to avoid freezing the user interface's main thread when processing large datasets.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try it: &lt;a href="https://dmo.omargpax.dev" rel="noopener noreferrer"&gt;D-MO&lt;/a&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>nextjs</category>
      <category>etl</category>
      <category>ai</category>
    </item>
    <item>
      <title>Personalised creator-badge and sound player?</title>
      <dc:creator>Omar Guerrero</dc:creator>
      <pubDate>Thu, 10 Apr 2025 22:14:58 +0000</pubDate>
      <link>https://dev.to/omargpax/personalised-creator-badge-and-sound-player-3134</link>
      <guid>https://dev.to/omargpax/personalised-creator-badge-and-sound-player-3134</guid>
      <description>&lt;p&gt;Yep... just that. &lt;/p&gt;

&lt;p&gt;A few days ago I was wanting to try something new, and seeing the spotify embedded sound player I wanted to replicate it, but with a custom, creator oriented touch. It took me a few days to customize it and it's finally here (visit: &lt;a href="https://creator-badge.vercel.app" rel="noopener noreferrer"&gt;creator-badge&lt;/a&gt;).&lt;/p&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%2Fub8ve81gotgf7ajzhjeb.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%2Fub8ve81gotgf7ajzhjeb.png" alt=" " width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I'm thinking of taking it a step further, how would you like it if I added little things like the number of followers on GitHub? Or maybe the number of fans on your main social network, whichever one you like to show the most on your card! I think that will be the mission of some early mornings well accompanied by coffee. ☕&lt;/p&gt;

&lt;p&gt;What do you think of this first version, would you embed it on your website? I'd love to hear your feedback - what do you think I could improve or change to make it even cooler?&lt;/p&gt;

&lt;p&gt;PS: In fact, I'm already working on a version that will return an SVG (without sound), similar to the cool &lt;a href="https://github.com/anuraghazra/github-readme-stats" rel="noopener noreferrer"&gt;github-readme-stats&lt;/a&gt;, but with its own features.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
