<?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: Alexei Garban</title>
    <description>The latest articles on DEV Community by Alexei Garban (@garbanv).</description>
    <link>https://dev.to/garbanv</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%2F288045%2F22028de0-e5b4-4029-a00a-29bd19e7674a.png</url>
      <title>DEV Community: Alexei Garban</title>
      <link>https://dev.to/garbanv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/garbanv"/>
    <language>en</language>
    <item>
      <title>The Interface Is Not the System</title>
      <dc:creator>Alexei Garban</dc:creator>
      <pubDate>Wed, 18 Feb 2026 19:18:13 +0000</pubDate>
      <link>https://dev.to/garbanv/the-interface-is-not-the-system-ke1</link>
      <guid>https://dev.to/garbanv/the-interface-is-not-the-system-ke1</guid>
      <description>&lt;p&gt;During a recent infrastructure migration from the US to Europe, I discovered something uncomfortable.&lt;/p&gt;

&lt;p&gt;Companies were looking at their data every day.&lt;/p&gt;

&lt;p&gt;Through dashboards.&lt;/p&gt;

&lt;p&gt;Through automations.&lt;/p&gt;

&lt;p&gt;Through internal tools.&lt;/p&gt;

&lt;p&gt;It all looked consistent.&lt;/p&gt;

&lt;p&gt;But it was not.&lt;/p&gt;

&lt;p&gt;Most of them were using n8n,Make, NocoDB, and a PostgreSQL database. At first it looked like everything was connected. Relations appeared to be defined.&lt;/p&gt;

&lt;p&gt;The data seemed to be structured.&lt;/p&gt;

&lt;p&gt;But when looking at NocoDB (tool to manage databases) it was showing a representation of relationships, not the real model as it truly existed in PostgreSQL. This is ok when you only need to use that data to create reports or something else made by human analysts but is not ok when you want to use the data for another purpose. When I needed to remove dependencies and stop relying on the interface layer, the abstraction collapsed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did I find?
&lt;/h2&gt;

&lt;p&gt;Virtual relations not enforced at database level&lt;br&gt;
Logic embedded in automations instead of schema&lt;br&gt;
Queries written around what the ui exposed, not what the data actually was in the database&lt;/p&gt;

&lt;p&gt;Data that was only accessible through the interface layer, not directly from the database&lt;/p&gt;

&lt;p&gt;In the end, the system was not the database. The system was the interface.&lt;/p&gt;

&lt;p&gt;It had structure in appearance. Not in architecture.&lt;/p&gt;

&lt;p&gt;This is more important than it sounds.&lt;/p&gt;

&lt;p&gt;Because many companies believe they own their systems when what they really own is a stack of tools connected by convenience.&lt;/p&gt;

&lt;p&gt;If removing one tool breaks your business logic, you don't control your system.&lt;/p&gt;

&lt;p&gt;You are renting coherence.&lt;/p&gt;

&lt;p&gt;Migration exposes this.&lt;/p&gt;

&lt;p&gt;Tool replacement exposes this.&lt;/p&gt;

&lt;p&gt;Moving servers from the US to Europe is easy. Reclaiming architectural clarity is not.&lt;/p&gt;

&lt;p&gt;In music production, noise is not the enemy. Unstructured noise is.&lt;/p&gt;

&lt;p&gt;In software, abstractions are not the problem. Unexamined abstractions are.&lt;/p&gt;

&lt;p&gt;A system should survive the removal of its interface. If it doesn't, the interface was the system.&lt;/p&gt;

&lt;p&gt;And that is a risk.&lt;/p&gt;

&lt;p&gt;More articles on my website &lt;a href="https://dev.tourl"&gt;www.agarban.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>devchallenge</category>
      <category>softwareengineering</category>
      <category>tooling</category>
    </item>
    <item>
      <title>If ESLint won't let you build your NextJS 15 app because of no-unused-vars do this</title>
      <dc:creator>Alexei Garban</dc:creator>
      <pubDate>Wed, 29 Jan 2025 12:13:28 +0000</pubDate>
      <link>https://dev.to/garbanv/if-eslint-wont-let-you-build-your-nextjs-15-app-because-of-no-unused-vars-do-this-30kc</link>
      <guid>https://dev.to/garbanv/if-eslint-wont-let-you-build-your-nextjs-15-app-because-of-no-unused-vars-do-this-30kc</guid>
      <description>&lt;h1&gt;
  
  
  Problem
&lt;/h1&gt;

&lt;p&gt;When you try to deploy your new NEXTJs 15 site and see this error:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!ERROR]&lt;br&gt;
Warning: 'someParams' is defined but never used.  no-unused-vars&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You just need to disable a eslint configuration by adding a rule like this one:&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="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@typescript-eslint/no-unused-vars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the complete eslint.config.mjs will look like this&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dirname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fileURLToPath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlatCompat&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@eslint/eslintrc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;__filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fileURLToPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;__dirname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__filename&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;compat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FlatCompat&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseDirectory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;compat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/core-web-vitals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@typescript-eslint/no-unused-vars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;

&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;eslintConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>nextjs</category>
      <category>eslint</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Integración de Tawk.to con GatsbyJs</title>
      <dc:creator>Alexei Garban</dc:creator>
      <pubDate>Mon, 10 Jan 2022 11:40:02 +0000</pubDate>
      <link>https://dev.to/garbanv/integracion-de-tawkto-con-gatsbyjs-in1</link>
      <guid>https://dev.to/garbanv/integracion-de-tawkto-con-gatsbyjs-in1</guid>
      <description>&lt;p&gt;Esta semana me asignaron la tarea de integrar &lt;a href="//tawk.to"&gt;Tawk.to&lt;/a&gt;, un live chat (Gratis) para conectar con posibles clientes en tiempo real.&lt;/p&gt;

&lt;p&gt;La comunidad de Gatsby es muy grande y al buscar en su lista de plugins encontré gatsby-plugin-tawk pero desafortunadamente en la actualidad no funciona.&lt;/p&gt;

&lt;p&gt;Así que buscando encontré una forma de agregarlo bastante simple.&lt;/p&gt;

&lt;p&gt;Lo primero que debemos hacer es ir tawk.to y crear tu widget.&lt;/p&gt;

&lt;p&gt;Luego ir a gatsby-browser.js y utilizar una de sus APIs &lt;a href="https://www.gatsbyjs.com/docs/reference/config-files/gatsby-browser/#onInitialClientRender" rel="noopener noreferrer"&gt;onInitialClientRender&lt;/a&gt;. Si no tienes este archivo puedes crearlo en tu directorio base.&lt;/p&gt;

&lt;p&gt;Agregamos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const onInitialClientRender = () =&amp;gt; {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y dentro del mismo agregamos nuestro código del widget que nos suministra tawk.to de la siguiente forma, eliminando el tag script y los comments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const onInitialClientRender = () =&amp;gt; {
  var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
  (function(){
  var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
  s1.async=true;
  s1.src='https://embed.tawk.to/{TU-KEY}/{TU-ID}';
  s1.charset='UTF-8';
  s1.setAttribute('crossorigin','*');
  s0.parentNode.insertBefore(s1,s0);
  })();
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;gatsby develop&lt;/code&gt; y listo!&lt;/p&gt;

&lt;p&gt;Con eso te debería de funcionar correctamente.&lt;/p&gt;

</description>
      <category>gatsby</category>
      <category>react</category>
      <category>chat</category>
      <category>tawkto</category>
    </item>
    <item>
      <title>NextJs 12 en Netlify</title>
      <dc:creator>Alexei Garban</dc:creator>
      <pubDate>Sun, 12 Dec 2021 11:16:39 +0000</pubDate>
      <link>https://dev.to/garbanv/nextjs-12-en-netlify-2hif</link>
      <guid>https://dev.to/garbanv/nextjs-12-en-netlify-2hif</guid>
      <description>&lt;p&gt;Recientemente me encontré con la necesidad de actualizar un proyecto de NextJs v11 a la v12. &lt;/p&gt;

&lt;p&gt;El upgrade de versiones funcionó muy bien, actualicé otras dependencias e instalé una nueva que requería la nueva versión de next y su funcionamiento en localhost no presentó ningún problema.&lt;/p&gt;

&lt;p&gt;Ese mismo día actualicé el repositorio esperando que se actualizara el sitio en netlify y así se pudieran ver los cambios . Al día siguiente me comentan que no había cambios por lo cual al revisar veo que no se pudo hacer el build (mi error no revisar al momento).&lt;/p&gt;

&lt;p&gt;Después de investigar un poco, un post en el foro de netlify me iluminó y pude lograr el build.&lt;/p&gt;

&lt;p&gt;Por los momentos para usar la versión de nextjs 12 en netlify hay que usar el plugin en versión beta.&lt;/p&gt;

&lt;p&gt;Entonces debemos instalar &lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -D @netlify/plugin-nextjs@beta&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego en nuestro directorio base crear el archivo netlify.toml y compiar el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build]
publish = ".next"

[[plugins]]
package = "@netlify/plugin-nextjs"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta manera podrás hacer el build y todo debe funcionar como a la perfección.&lt;/p&gt;

&lt;p&gt;Si previamente habías hecho modificaciones en next.config.js agregando distDir puedes eliminarlo.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>netlify</category>
    </item>
    <item>
      <title>Custom webhook to trigger build on DigitalOcean App Platform using Strapi</title>
      <dc:creator>Alexei Garban</dc:creator>
      <pubDate>Fri, 21 May 2021 12:18:10 +0000</pubDate>
      <link>https://dev.to/garbanv/custom-webhook-to-trigger-build-on-digitalocean-app-platform-using-strapi-5e5h</link>
      <guid>https://dev.to/garbanv/custom-webhook-to-trigger-build-on-digitalocean-app-platform-using-strapi-5e5h</guid>
      <description>&lt;p&gt;A couple of days ago i needed to create a webhook to trigger a GatsbyJs build after update, create or delete something in our backend using Strapi.&lt;/p&gt;

&lt;p&gt;Strapi has a built in option to do that very easy if your frontend app is on Netlify, but our app is on Digitalocean so we need to create our own webhook.&lt;/p&gt;

&lt;p&gt;Reading digitalocean's documentation i found that the url that we need to make the request is this one: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://api.digitalocean.com/v2/apps/YOUR_APP_ID/deployments&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;First we need to go to our api endpoint models (in this case i'm using Strapi) and i want to rebuild after creating , deleting or updating a post, so i  will go to &lt;code&gt;/api/posts/models/posts.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We are going to use Strapi lifecycles hooks, afterCreate,afterUpdate,afterDestroy.&lt;/p&gt;

&lt;p&gt;We also need to create a Token / Key in digitalocean &lt;code&gt;(your digitalocean account/-&amp;gt;api-&amp;gt;Tokens/Keys)&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;I put the token in a .env file as POSTS_BUILD_TOKEN&lt;/p&gt;

&lt;p&gt;then install axios &lt;code&gt;npm i axios&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Our &lt;code&gt;/api/posts/models/posts.js&lt;/code&gt; should look 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;'use strict';
const axios = require('axios')

const token = process.env.POSTS_BUILD_TOKEN

module.exports =  {

    lifecycles: {

    async afterCreate()  {

        axios({
            method: 'post',
            headers: {
                'Content-Type': 'json',
                'Authorization': `Bearer ${token}`
            },
            url: 'https://api.digitalocean.com/v2/apps/${token}/deployments',
           body:{
               "force_build":true
            }
          });
      },


    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can go to your Content Type and create, edit or delete and as soon as you click save, it will trigger the build.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
