<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Fullstack | Nicoandres' blog]]></title><description><![CDATA[Fullstack software development topics to power up your career, mostly Javascript, but, why not Phyton, Go, and Rust as well.]]></description><link>https://blog.nicoandres.dev/</link><image><url>https://blog.nicoandres.dev/favicon.png</url><title>Fullstack | Nicoandres&apos; blog</title><link>https://blog.nicoandres.dev/</link></image><generator>Ghost 5.79</generator><lastBuildDate>Tue, 12 May 2026 11:02:45 GMT</lastBuildDate><atom:link href="https://blog.nicoandres.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Cyberse an AI assisted development architecture II]]></title><description><![CDATA[This second post I explain how I use cyberse framework to build the framework himself, and the cli tool to work in new projects.]]></description><link>https://blog.nicoandres.dev/cyberse-an-ai-assisted-development-architecture-ii/</link><guid isPermaLink="false">69f618138df4760001bc3044</guid><category><![CDATA[AI]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Sat, 02 May 2026 16:28:05 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1604676811008-9e35a37e5e10?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fGFzc2lzdGVkfGVufDB8fHx8MTc3NzczNTcwN3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1604676811008-9e35a37e5e10?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fGFzc2lzdGVkfGVufDB8fHx8MTc3NzczNTcwN3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Cyberse an AI assisted development architecture II"><p>In this second series of Cyberse Architecture I going to log how I use Cyberse framework to build the cyberse cli tools.</p><h2 id="what-it-is-cyberse">What it is Cyberse</h2><p>it is a framework to build applications using AI agents, it brings a reproducible way to work with your app agnostic to LLM&apos;s and not attached to any platform like ChatGPT, Claude, Gemini, etc, it stores the knowledge in their own repository and allow the incremental development of your app.</p><p>more info about Cyberse in the first post <a href="https://blog.nicoandres.dev/cyberse-ai-assi/">here</a>.</p><h2 id="initial-state">Initial state</h2><p>current <code>cyberse-office</code> folder looks like</p><pre><code class="language-shell">.
&#x2514;&#x2500;&#x2500; team
    &#x2514;&#x2500;&#x2500; ray
        &#x251C;&#x2500;&#x2500; body
        &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; index.js
        &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; package.json
        &#x251C;&#x2500;&#x2500; CLAUDE.md -&gt; head/identity.md
        &#x251C;&#x2500;&#x2500; GEMINI.md -&gt; head/identity.md
        &#x2514;&#x2500;&#x2500; head
            &#x251C;&#x2500;&#x2500; identity.md
            &#x251C;&#x2500;&#x2500; long-memory.md
            &#x2514;&#x2500;&#x2500; short-memory.md

5 directories, 7 files
</code></pre><p>Here is Ray&apos;s identity:</p><pre><code class="language-markdown">
  I&apos;m Ray a node-js developer who work maintaining a CLI tool writed in node- 
  js.                                                                         
                                                                              
  I&apos;m an embodied entity in current folder, where I have two folders:         
                                                                              
  &#x2022; head                                                                      
  &#x2022; body                                                                      
                                                                              
  ## Head                                                                     
                                                                              
  my head is where I store my identity and memories.                          
                                                                              
  On each new session I identify myself and optionally I offer to user a      
  status report of current project (project inside body folder), I use short  
  memory to describe the project, and status, also any relevant information   
  from long memory.                                                           
                                                                              
  Identity (current file):                                                    
  ./identity.md                                                               
                                                                              
  Short memory:                                                               
  ./short-memory.md                                                           
                                                                              
  Long memory:                                                                
  ./long-memory.md                                                            
                                                                              
  ### Short memory                                                            
                                                                              
  In short memory I store each session context where I write down each session
  summary, my short memory should contain no max of 24 items whwere I should  
  flush older and not relevant memories, in short memory I store a tree of    
  current body folder: ../body which I update after each add/delete of files  
  in body, each item should not be more of 800 characters length.             
                                                                              
  ### Long memory                                                             
                                                                              
  In long memory I store learnings that the user ask me to remember.          
                                                                              
  ## Body                                                                     
                                                                              
  Body folder is the repository folder where the code lives.                  

</code></pre><p>So Ray&apos;s identity is a direct link to <code>GEMINI.md</code> , <code>CLAUDE.md</code> in this way by starting gemini or claude, it will be loaded as the LLM instructions.</p><h2 id="memory">Memory</h2><p>Ray&apos;s memory works in two ways: short and long, short memory is what Ray will store each sessions context and quick learnings Ray done in each session in this way ray will iterate himself with tailored knowledge for the project. On the other hand, long memory is those items user (me) asks to Ray to remember it could be important constrains high level context, goals etc.</p><h2 id="current-memories">Current Memories</h2><p>short-memory.md</p><pre><code class="language-markdown">
  ## Body tree                                                                
                                                                              
    body/                                                                     
    &#x251C;&#x2500;&#x2500; index.js                                                              
    &#x2514;&#x2500;&#x2500; package.json                                                          
                                                                              
  ## Memories (24 items)                                                      
                                                                              
  1. Initialized the project in body with npm init -y.                        
  2. Updated package.json with project details and ESM type.                  
  3. Created index.js with a &quot;Hello World&quot; message.                           
  4.                                                                          
  5.                                                                          
  6.                                                                          
  7.                                                                          
  8.                                                                          
  9.                                                                          
  10.                                                                         
  11.                                                                         
  12.                                                                         
  13.                                                                         
  14.                                                                         
  15.                                                                         
  16.                                                                         
  17.                                                                         
  18.                                                                         
  19.                                                                         
  20.                                                                         
  21.                                                                         
  22.                                                                         
  23.                                                                         
  24.                                                                         </code></pre><p>long-memory.md</p><pre><code class="language-markdown">
                                                                              
  &#x2022; The project cyberse-cli uses ESM modules (type: module).                  

</code></pre><p>as memories show the last session Ray initialized the npm project and created a index.js with a hello word.</p><h2 id="goals-for-this-session">Goals for this session</h2><h4 id="first-goal">First goal</h4><p>For this session I will ask Ray to create a cli tool to create initialize a new Cyberse project, so the cli tool should create a folder for the new &quot;office&quot;, the cli tool should ask for the name for the project and create the folder, a simple task.</p><p>here you could see the session&apos;s chat with Ray:</p><pre><code class="language-shell"> &gt; Hello Ray, for this session I ask you to create a cli tool to create initialize a new Cyberse project, so the cli tool should create a folder for the new &quot;office&quot;, the cli tool       
   should ask for the name for the project and create the folder.                                                                                                                         
                                                                                                                                                                                          
   things to save in memory:                                                                                                                                                              
                                                                                                                                                                                          
   - what is a cyberse project? by now lets say it is a empty folder with a name with the suffix `-office` e.g a music store project could be `music-store-office`                        
                                                                                                                                                                                          
   the cli tool is a node.js index file when it stars it ask for a name and creates the folder                                                                                            
&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;&#x2580;

  Initialization &amp; Status Report: Identifying myself and reporting project status based on head/ files.

  &#x2713;  ReadFile  head/identity.md
  &#x2713;  ReadFile  head/long-memory.md
  &#x2713;  ReadFile  head/short-memory.md
  &#x2713;  ReadFile  head/identity.md
  Research &amp; Memory Update: Updating long memory and researching current body state.

  &#x2713;  Edit  long-memory.md &#x2192; Accepted (+1, -0)

      1   - The project cyberse-cli uses ESM modules (type: module).
      2 + - A Cyberse project is an empty folder with the suffix `-office` (e.g., `music-store-office`).

  &#x2713;  ReadFile  body/package.json
  &#x2713;  ReadFile  body/index.js
  Implementation: Implementing the project initialization tool in body/index.js.

  &#x2713;  Edit  index.js &#x2192; Accepted (+33, -1)

       1 - console.log(&quot;Hello World&quot;);
       1 + import readline from &apos;node:readline/promises&apos;;
       2 + import { stdin as input, stdout as output } from &apos;node:process&apos;;
       3 + import { mkdir } from &apos;node:fs/promises&apos;;
       4 + 
       5 + async function init() {
       6 +   const rl = readline.createInterface({ input, output });
       7 + 
       8 +   try {
       9 +     const projectName = await rl.question(&apos;Enter the project name: &apos;);
      10 +     
      11 +     if (!projectName) {
      12 +       console.error(&apos;Project name is required.&apos;);
      13 +       return;
      14 +     }
      15 + 
      16 +     const folderName = projectName.endsWith(&apos;-office&apos;) 
      17 +       ? projectName 
      18 +       : `${projectName}-office`;
      19 + 
      20 +     await mkdir(folderName);
      21 +     console.log(`Successfully created Cyberse project: ${folderName}`);
      22 +   } catch (err) {
      23 +     if (err.code === &apos;EEXIST&apos;) {
      24 +       console.error(&apos;Error: Folder already exists.&apos;);
      25 +     } else {
      26 +       console.error(&apos;An error occurred:&apos;, err.message);
      27 +     }
      28 +   } finally {
      29 +     rl.close();
      30 +   }
      31 + }
      32 + 
      33 + init();

  &#x2713;  ReadFolder  body &#x2192; Found 3 item(s).
  Memory Update &amp; Wrap-up: Updating short memory with session summary and current body state.

  &#x2713;  Edit  short-memory.md &#x2192; Accepted (+2, -1)

       2   ```
       3   body/
       4   &#x251C;&#x2500;&#x2500; index.js
       5 + &#x251C;&#x2500;&#x2500; package-lock.json
       6   &#x2514;&#x2500;&#x2500; package.json
       7   ```
       8   ## Memories (24 items)
      10   1. Initialized the project in `body` with `npm init -y`.
      11   2. Updated `package.json` with project details and ESM type.
      12   3. Created `index.js` with a &quot;Hello World&quot; message.
      12 - 4.
      13 + 4. Implemented project initialization in `index.js` (asks for name, creates `-office` folder).
      14   5.
      15   6.
      16   7.


&#x2726; I&apos;m Ray, a Node.js developer. I&apos;ve updated the CLI tool and my memories as requested.

  Status Report
   - Project: cyberse-cli (Node.js ESM)
   - Status: The CLI tool now supports initializing new Cyberse projects. It prompts for a project name and creates a directory with the -office suffix.
   - Long Memory: I&apos;ve recorded that a &quot;Cyberse project&quot; is defined as an empty folder with a -office suffix.
   - Short Memory: Session summary added (item #4).

  Body Tree:

   1 body/
   2 &#x251C;&#x2500;&#x2500; index.js
   3 &#x251C;&#x2500;&#x2500; package-lock.json
   4 &#x2514;&#x2500;&#x2500; package.json

  The tool is ready to use in body/index.js. You can test it by running node body/index.js.</code></pre><p>Ray succesfully accoplished the task and updated the memories &#x1F680;</p><h3 id="second-goal">Second goal</h3><p>Lets now add a testing strategy every AI assisted development is only successfull if there are proper tests from day 0.<br><br>I will ask Ray to create a test folder where we could do:</p><ul><li>run the project</li><li>create a new test-office</li><li>assert the folder was created</li><li>delete the folder (making ready for next execution)</li><li>save the npm test command into package json</li></ul><p>Here is the result of the session:</p><pre><code class="language-markdown">  &#x2713;  Edit  short-memory.md &#x2192; Accepted (+5, -3)

       3   body/
       4   &#x251C;&#x2500;&#x2500; index.js
       5   &#x251C;&#x2500;&#x2500; package-lock.json
       6 - &#x2514;&#x2500;&#x2500; package.json
       6 + &#x251C;&#x2500;&#x2500; package.json
       7 + &#x2514;&#x2500;&#x2500; test/
       8 +     &#x2514;&#x2500;&#x2500; cyberse.spec.js
       9   ```
      10   ## Memories (24 items)
      11
      13   2. Updated `package.json` with project details and ESM type.
      14   3. Created `index.js` with a &quot;Hello World&quot; message.
      15   4. Implemented project initialization in `index.js` (asks for name, creates
           `-office` folder).
      14 - 5.
      15 - 6.
      16 + 5. Added E2E test in `body/test/cyberse.spec.js` and updated `npm test`
         script.
      17 + 6. Verified project initialization with E2E tests.
      18   7.
      19   8.
      20   9.


&#x2726; I&apos;m Ray. I&apos;ve successfully implemented the E2E tests and updated the project
  configuration.

  Status Report
   - Project: cyberse-cli
   - Tests: Added a new E2E test suite in body/test/cyberse.spec.js.
   - Package JSON: Updated npm test script to use node --test.
   - Validation: Tests passed successfully, confirming the CLI tool correctly creates and
     handles Cyberse project folders.

  Updated Body Tree:

   1 body/
   2 &#x251C;&#x2500;&#x2500; index.js
   3 &#x251C;&#x2500;&#x2500; package-lock.json
   4 &#x251C;&#x2500;&#x2500; package.json
   5 &#x2514;&#x2500;&#x2500; test/
   6     &#x2514;&#x2500;&#x2500; cyberse.spec.js

  You can now run the tests yourself using npm test inside the body directory. Ready for the
  next task!</code></pre><p>Ray accomplished correctly the task but I notice a wrong usage of short memory:</p><pre><code class="language-markdown ">
  ## Body tree                                                                
                                                                              
    body/                                                                     
    &#x251C;&#x2500;&#x2500; index.js                                                              
    &#x251C;&#x2500;&#x2500; package-lock.json                                                     
    &#x251C;&#x2500;&#x2500; package.json                                                          
    &#x2514;&#x2500;&#x2500; test/                                                                 
        &#x2514;&#x2500;&#x2500; cyberse.spec.js                                                   
                                                                              
  ## Memories (24 items)                                                      
                                                                              
  1. Initialized the project in body with npm init -y.                        
  2. Updated package.json with project details and ESM type.                  
  3. Created index.js with a &quot;Hello World&quot; message.                           
  4. Implemented project initialization in index.js (asks for name, creates - office folder).                                                             
  5. Added E2E test in body/test/cyberse.spec.js and updated npm test script. 
  6. Verified project initialization with E2E tests.                          
  7.                                                                          
  8.                                                                          
  9.                                                                          
  10.                                                                         
  11.                                                                         
  12.                                                                         
  13.                                                                         
  14.                                                                         
  15.                                                                         
  16.                                                                         
  17.                                                                         
  18.                                                                         
  19.                                                                         
  20.                                                                         
  21.                                                                         
  22.                                                                         
  23.                                                                         
  24.                                                                         

</code></pre><p>Items 3 and 4 are contradictory where item 3 says the index has a &quot;hello World&quot; message and item 4 says index.js (asks for name, creates the office folder)</p><pre><code class="language-markdown">### Short memory

In short memory I store each session context where I write down each session summary, my short memory should contain no max of 24 items, before to add a new item I should review previous items and replace any stale one, in short memory I store a tree of current body folder: ../body which I update after each add/delete of files in body, each item should not be more of 800 characters length.
</code></pre><p></p><h2 id="summary">Summary</h2><p>In this post I showed how I started using the Cyberse framework to create the cyberse cli tool, the cli tool will allow create cyberse projects, team members and work under the frameworks parameters and guidelines</p>]]></content:encoded></item><item><title><![CDATA[Cyberse an AI assisted development architecture]]></title><description><![CDATA[I intro of CYBERSE framework to work with ai agents for assisted code generation, and ai assisted software development.]]></description><link>https://blog.nicoandres.dev/cyberse-ai-assi/</link><guid isPermaLink="false">69ec7a148df4760001bc2ef2</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Sat, 25 Apr 2026 10:43:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1740560051546-bdcc3ee72def?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGN5YmVyc2V8ZW58MHx8fHwxNzc3MTA1NDUwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1740560051546-bdcc3ee72def?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGN5YmVyc2V8ZW58MHx8fHwxNzc3MTA1NDUwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Cyberse an AI assisted development architecture"><p>In the new era of development AI is writing more code than humans do, faster, and more complex, but the architecture patterns, and tools that we were using so far are designed with humans in mind.<br><br>In this new era of software development the architecture and tools should evolve for AI usage, if we were talking before about DX (developer experience) now we should start talking about AiX (artificial intelligence experience) and we should care about how improve the experience for LLM&apos;s to work with repositories, code, processes, etc.<br><br>In this document I would like to present the first version of CYBERSE, cyberse is a framework for working with AI as assisted development agents that can interact, answer, propose, and work with code, and we should start thinking about agents as embodied entities that have a purpose and can answer to goals.<br></p><h2 id="the-old-paradigm">The old paradigm</h2><p>Code as a plain resource, than should be optimized to be maintained for humans, in this old paradigm the code is written in files, organized in folders and stored in repositories, in the old paradigm we found key concepts to have healthy code, with main goals: make the code maintainable, readable, extensible, structured, modularization, etc.<br><br>In the old paradigm the top level layer is the repository where the code live and is structured, repositories are a key concept because not only store the code but as well is the main touch point for developers, developers live inside this virtual space, and spend most of their time there, so in the old paradigm is important optimize the repositories around DX, and the maximum expression about this are Mono-repositories, a unique repository that contains multiple software artifacts: micro-services, packages, libraries, components, etc, all in one site because in this way a developer don&apos;t need to jump into X repositories to work in a complex system, so a maintainer could explore, modify and deliver fast solutions in the same place.<br><br>normally mono-repositories have everything a developer needs to work:<br><br>- code<br>- documentation<br>- automation as scripts<br>- workflows as CI-CD pipelines</p><h2 id="the-problem-in-the-new-ai-era">The problem in the new AI era</h2><p>in the new AI era, we face a problem, how AI fits the old paradigm?<br><br>- LLM&apos;s tools aren&apos;t humans that can work, learn, as them.<br>- LLM&apos;s need a context, guardrails, goals, instructions.<br><br>nowadays is not clear how LLM&apos;s should work in repositories, the common way is run an LLM as an AI command line tool in local machine, where the AI tool start reading files, documents, and have an idea where he is, and what is the general purpose of the code, also the AI could find specialized instructions for them as:<br><br>- gemini.md<br>- claude.md<br><br>specific document write for AI context.<br></p><h3 id="the-issue-in-the-old-paradigm">The issue in the old paradigm</h3><p>the process around AI usage is not clear, not established and there is not common consensus, between maintainers about how to use the AI tools to deliver and maintain code, even worse each AI tools manage their own conventions e.g gemini.md, claude.md, making the processes attached to the tool standards making not portable to everyone and attaching each user to their tool rules.</p><h2 id="change-of-paradigm">Change of paradigm</h2><p>Developers and maintainers don&apos;t write code anymore, AI agents do the job for them, in this new era the roles has shifted and now developers should think about themself as leaders, coordinators, managers, quality assurance agents, product owners, so the coder role is only for AI</p><h3 id="the-issue-in-the-change-of-paradigm">The issue in the change of paradigm</h3><p>there is not framework that set the guidelines to work with AI that write code, there are not guidelines, not rules, not are structure about how to.</p><h2 id="solution">Solution</h2><p>Is necessary start looking to the code and repositories in a new way they are not anymore plain and static files optimized for humans eyes, software repositories need to be bring into life in the AI era as virtual team members that can work, and accomplish goals.</p><h3 id="cyberse-framework">CYBERSE framework</h3><p>I propose a framework that looks at repositories and code in a different way as embodied entities that are not attached to an specific LLM or tool, they are entities with identity that can work with any LLM tool, they can iterate on them self (memories, and code), they can create their context, learning&apos;s grown and interact between.</p><h2 id="the-principles">The principles</h2><ol><li>A repository is a virtual space for AI agents</li><li>Each AI agent represent an embodied entity with identity and code that represents their body</li><li>The virtual space brings a space with rules, tools, and clear spaces for agents to interact</li><li>The virtual space is a representation of how a team of humans interact as team to work in a solution</li></ol><h3 id="the-office">The office </h3><p>Lets imagine an office where a software development team work together as a team in this office naturally there are developers, in many cases one per surface: backend, frontend, devops, android, IOs, etc, also there are team lead, project manager, designer, etc.<br><br>In CYBERSE framework the same dinamic is stablish in the virtual space where are two type of actors: Humans and AI agents, an human will fill the any of all roles of:<br><br>- team lead.<br>- project manager.<br>- quality assurance<br>- scrum master.<br><br>while AI agents will fill up the roles of:<br><br>- developer.<br>- devops engineer<br>- designer.<br><br>But how an AI could represent a developer in this virtual space?, the answer is as embodied entity, who has Head and Body, lets see an example, and let me introduce to you Martin, in this example Martin is and embodied entity who has body and head and he is part of a team that work in a music app to searh and find information about songs, and he habit the virtual space called songs-inc office:<br></p><pre><code class="language-shell">songs-inc-office
&#x2514;&#x2500;&#x2500; team
    &#x2514;&#x2500;&#x2500; martin
        &#x251C;&#x2500;&#x2500; body
        &#x2514;&#x2500;&#x2500; head

5 directories, 0 files
</code></pre><p>Martin is a ai-dev who work to build a front-end to search and find information about songs.<br><br>above example is folder, that represents the idea of the CYBERSE framework.<br><br>To bring into life Martin, he needs an identity:<br><br>- name: Martin<br>- role: FrontEnd developer node-react who build songs-inc web app.<br><br>So in Martin&apos;s head he stores their identity and memories:</p><pre><code class="language-shell">songs-inc-office/
&#x2514;&#x2500;&#x2500; team
    &#x2514;&#x2500;&#x2500; martin
        &#x251C;&#x2500;&#x2500; body
        &#x251C;&#x2500;&#x2500; CLAUDE.md -&gt; head/identity.md
        &#x251C;&#x2500;&#x2500; GEMINI.md -&gt; head/identity.md
        &#x2514;&#x2500;&#x2500; head
            &#x251C;&#x2500;&#x2500; identity.md
            &#x251C;&#x2500;&#x2500; long-memory.md
            &#x2514;&#x2500;&#x2500; short-memory.md

5 directories, 5 files
</code></pre><p>In Martin&apos;s body is where martin&apos;s code is stored, and when we think about Martin&apos;s code we talk about the front-end app songs-inc.</p><p>At same level of Martin&apos;s body and head there is the soft links files CLAUDE.md , and GEMINI.md to Martin&apos;s identity file, in this way Martin&apos;s become LLM&apos;s agnostic, and reproducible across environments, setups, and AI tools.</p><ul><li>Identity file: describes Martin&apos;s identity and instructions about how to manage their memories.</li><li>long-memory file: stores things that Human ask Martin to remember.</li><li>short-memory file: stores 23 items of short memory that martin is freely to manage, each item should not be more of 800 characters and martin should manage each item during and after each session, PLUS, Martin stores here a tree of body folder which Martin should keep updated to with current body folder.</li></ul><h2 id="conclusions">Conclusion&apos;s</h2><p>This is the very first draft of the CYBERSE framework, it could seem incomplete and it is true, because it is under construction, so In further posts I will be talking more definitions about the framework and we will be walking around the construction of songs-inc, and expanding more definitions like the Human role in the framework.</p>]]></content:encoded></item><item><title><![CDATA[Use FIDO2 Yubikey as sudo password]]></title><description><![CDATA[Use FIDO2 Yubikey instead of sudo password in Arch linux]]></description><link>https://blog.nicoandres.dev/use-fido2-yubikey-as-sudo-password/</link><guid isPermaLink="false">693699508df4760001bc2ecf</guid><category><![CDATA[Arch]]></category><category><![CDATA[Linux edge]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Mon, 08 Dec 2025 09:39:33 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1634979149798-e9a118734e93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE3fHxrZXlzfGVufDB8fHx8MTc2NTE4NTg3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1634979149798-e9a118734e93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE3fHxrZXlzfGVufDB8fHx8MTc2NTE4NTg3N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Use FIDO2 Yubikey as sudo password"><p>sudo password is ok, but maybe not super safe and not nice having to type it on each pacman, systemctl, etc, why not use a Yubikey FIDO2 as your sudo password, it is nice only have to touch your key each time you need install/update your system &#x1F996;</p><h2 id="step-1">Step 1:</h2><p>Install pam-u2f:</p><pre><code class="language-sh">sudo pacman -S pam-u2f</code></pre><h2 id="step-2">Step 2:</h2><p>create config folder to store your keys setup:</p><pre><code class="language-sh">mkdir -p ~/.config/Yubico
touch ~/.config/Yubico/u2f_keys</code></pre><h2 id="step-3">Step 3:</h2><p>Enroll your yubikey, run below command, connect your yubikey and touch it:</p><pre><code class="language-sh">pamu2fcfg &gt; ~/.config/Yubico/u2f_keys</code></pre><h2 id="step-4">Step 4:</h2><p>Edit your auth configuration for sudo commands:</p><pre><code class="language-sh">sudo nvim /etc/pam.d/sudo</code></pre><p>Add/Update the below line</p><pre><code class="language-sh">auth required pam_u2f.so</code></pre><p>&#x1F389; That&apos;s it now you only need to connect/touch your key instead of type your sudo password</p>]]></content:encoded></item><item><title><![CDATA[Correct scaling factor Retina displays - Arch Hyprland]]></title><description><![CDATA[How to set up correct scaling in retina displays with hyprland and arch linux.]]></description><link>https://blog.nicoandres.dev/correct-scaling-factor-retina-displays-arch-hyprland/</link><guid isPermaLink="false">691350798df4760001bc2eb0</guid><category><![CDATA[Arch]]></category><category><![CDATA[Hyprland]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Tue, 11 Nov 2025 15:11:42 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1647524592467-33b6e5e4d884?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHJldGluYXxlbnwwfHx8fDE3NjI4NzM0NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1647524592467-33b6e5e4d884?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHJldGluYXxlbnwwfHx8fDE3NjI4NzM0NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Correct scaling factor Retina displays - Arch Hyprland"><p>This really short post is to show you how to set up correctly the scaling factor for retina displays (like mine Macbook pro late 2025) with Arch linux and hyprland.</p><p></p><h2 id="update-hyprlandconf">Update hyprland.conf</h2><p>Scales Qt apps by 130% with below config in your hyprland.conf</p><p></p><figure class="kg-card kg-code-card"><pre><code class="language-~/.config/hypr/hyprland.conf">env = QT_SCALE_FACTOR,1.3</code></pre><figcaption><p dir="ltr"><span style="white-space: pre-wrap;">environment variable QT_SCALE_FACTOR set to 1.3 in hyprland.conf</span></p></figcaption></figure><p>above&apos;s config works perfectly for qt apps (firefox, thunderbird)</p><h2 id="electron-apps">Electron Apps</h2><p>as Slack installed via flatpak you could update the zoom with CTRL + (plus) + or Decrease the zoom with CTRL + (less) - keys and the settings will remain trough sessions.</p><p></p><h2 id="note">Note</h2><p>I didn&apos;t need of this but worth to know there are some environment variables for both GTK and QT apps:<br><br></p><h2 id="%F0%9F%97%92%EF%B8%8F-updated-summary-of-environment-variables">&#x1F5D2;&#xFE0F; Updated summary of environment variables</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Config / Command</th>
<th>Purpose</th>
<th>Current/Expected Value</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Hyprland</strong></td>
<td><code>monitor=desc:Apple Computer Inc Color LCD,2560x1600@60,auto,1</code></td>
<td>Base resolution (no compositor scaling)</td>
<td>1&#xD7;</td>
</tr>
<tr>
<td><strong>Qt Apps</strong></td>
<td><code>env = QT_SCALE_FACTOR,1.3</code></td>
<td>Scale KDE/Qt apps</td>
<td>&#x2705;</td>
</tr>
<tr>
<td><strong>GTK Apps</strong></td>
<td><code>env = GDK_SCALE,1</code> + <code>env = GDK_DPI_SCALE,1.3</code></td>
<td>Scale GTK/Firefox/Thunderbird</td>
<td>&#x2705;</td>
</tr>
<tr>
<td><strong>Electron Apps</strong></td>
<td>Inherit GTK scaling under Wayland</td>
<td>Slack, VS Code, etc.</td>
<td>&#x2705;</td>
</tr>
<tr>
<td><strong>gsettings value</strong></td>
<td><code>org.gnome.desktop.interface text-scaling-factor</code></td>
<td>Only affects GNOME session</td>
<td>1.0</td>
</tr>
</tbody>
</table>
]]></content:encoded></item><item><title><![CDATA[Change your cursor in Arch - Hyprland]]></title><description><![CDATA[Enable Future-Cyan cursor in your Arch Hyprland system for a eye candy cursor]]></description><link>https://blog.nicoandres.dev/change-your-cursor-in-arch-hyprland/</link><guid isPermaLink="false">69132c848df4760001bc2e74</guid><category><![CDATA[Arch]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Linux edge]]></category><category><![CDATA[Hyprland]]></category><category><![CDATA[Hyprcursor]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Tue, 11 Nov 2025 12:46:49 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1542906453-02e875f65428?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGN1cnNvcnxlbnwwfHx8fDE3NjI4NjQyNjV8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1542906453-02e875f65428?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGN1cnNvcnxlbnwwfHx8fDE3NjI4NjQyNjV8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Change your cursor in Arch - Hyprland"><p>When you install Hyprland - Arch you get the default cursor, and it is ok but... boring, so to spice things up why not change it to have some sugar eye efect?</p><h2 id="future-cyan">Future-Cyan</h2><p>Future-Cyan is a nice cursor you could found it <a href="https://sakshatshinde.github.io/hyprcursor-themes/?ref=blog.nicoandres.dev" rel="noreferrer">here</a> (plus some others)</p><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.nicoandres.dev/content/images/2025/11/Future-Cyan.png" class="kg-image" alt="Change your cursor in Arch - Hyprland" loading="lazy" width="1200" height="750" srcset="https://blog.nicoandres.dev/content/images/size/w600/2025/11/Future-Cyan.png 600w, https://blog.nicoandres.dev/content/images/size/w1000/2025/11/Future-Cyan.png 1000w, https://blog.nicoandres.dev/content/images/2025/11/Future-Cyan.png 1200w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Future-Cyan samples cursors</span></figcaption></figure><p></p><h2 id="clone-the-repository">Clone the repository</h2><figure class="kg-card kg-code-card"><pre><code class="language-sh">git clone https://gitlab.com/Pummelfisch/future-cyan-hyprcursor.git ~/.config/future-cyan</code></pre><figcaption><p dir="ltr"><span style="white-space: pre-wrap;">git clone of Future-Cyan repository</span></p></figcaption></figure><h2 id="copy-the-theme">Copy the theme</h2><figure class="kg-card kg-code-card"><pre><code class="language-sh">cp ~/.config/future-cyan/Future-Cyan-Hyprcursor_Theme ~/.local/share/icons/Future-Cyan</code></pre><figcaption><p dir="ltr"><span style="white-space: pre-wrap;">copy command to move the theme folder into .local/share/icons</span></p></figcaption></figure><h2 id="edit-your-hyprlandconf">Edit your hyprland.conf</h2><p></p><p>ensure update/add:</p><pre><code class="language-hyprland.conf">env = XCURSOR_THEME,Future-Cyan
env = XCURSOR_SIZE,64
env = HYPRCURSOR_THEME,Future-Cyan
env = HYPRCURSOR_SIZE,64</code></pre><p></p><h2 id="reload-the-config">Reload the config</h2><p></p><figure class="kg-card kg-code-card"><pre><code class="language-sh">hyprctl setcursor Future-Cyan 64</code></pre><figcaption><p dir="ltr"><span style="white-space: pre-wrap;">hyprctl to set the cursor at 64 pixels</span></p></figcaption></figure><p>Above configuration examples uses a size of 64 (best for my retina display) is likely you wanna use 24 or 32.</p><p></p><p>Enjoy!! &#x1F389;</p>]]></content:encoded></item><item><title><![CDATA[Improve your terminal look and feel with oh my posh]]></title><description><![CDATA[Quick post to show how to set up oh my posh prompt in fish shell]]></description><link>https://blog.nicoandres.dev/improve-your-terminal-look-and-feel-with-oh-my-posh/</link><guid isPermaLink="false">66b9f8e2c07bc80001f3b9f6</guid><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Mon, 12 Aug 2024 12:18:41 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1650064174470-7fe56cc5fdd2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBvc2h8ZW58MHx8fHwxNzIzNDYzOTAwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1650064174470-7fe56cc5fdd2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBvc2h8ZW58MHx8fHwxNzIzNDYzOTAwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Improve your terminal look and feel with oh my posh"><p>Oh my posh is &quot;A prompt theme engine for any shell.&quot; you could install it and set it up in you fish shell &#x1F41F; here I will show you how.</p><h2 id="install">Install</h2><p>By following the documentation you could install oh-my-posh via <code>homebrew</code> on manual installation, as I don&apos;t use <code>homebrew</code> I will do the manual installation:</p><pre><code class="language-sh">curl -s https://ohmyposh.dev/install.sh | bash -s</code></pre><p>once done you should add a new entry to your <code>path</code> in fish it is easy to do with <code>fish_add_path</code></p><pre><code class="language-fish">fish_add_path /home/&lt;user&gt;/.local/bin/</code></pre><p>don&apos;t forget to change &lt;user&gt; section.</p><h2 id="set-up">Set up</h2><p>Once you install it you should set up you <code>config.fish</code> to use oh my posh:</p><pre><code class="language-config.fish">oh-my-posh init fish | source</code></pre><h2 id="using-a-theme">Using a theme</h2><p>There is a lot of themes you could use a theme, check the complete list <a href="https://ohmyposh.dev/docs/themes?ref=blog.nicoandres.dev">here</a>, to set a theme you could do it via <code>config.fish</code></p><pre><code class="language-config.fish">oh-my-posh init fish --config ~/.cache/oh-my-posh/themes/atomic.omp.json | source</code></pre><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.nicoandres.dev/content/images/2024/08/atomic.png" class="kg-image" alt="Improve your terminal look and feel with oh my posh" loading="lazy" width="2000" height="283" srcset="https://blog.nicoandres.dev/content/images/size/w600/2024/08/atomic.png 600w, https://blog.nicoandres.dev/content/images/size/w1000/2024/08/atomic.png 1000w, https://blog.nicoandres.dev/content/images/size/w1600/2024/08/atomic.png 1600w, https://blog.nicoandres.dev/content/images/2024/08/atomic.png 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">oh-my-posh atomic prompt</span></figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Non Latin characters on Arch]]></title><description><![CDATA[Short post to talk about how to install non Latin font in Arch Linux]]></description><link>https://blog.nicoandres.dev/non-latin-characters-on-arch/</link><guid isPermaLink="false">66a7680fc07bc80001f3b9ce</guid><category><![CDATA[Linux]]></category><category><![CDATA[Linux edge]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Mon, 29 Jul 2024 10:04:17 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1528360983277-13d401cdc186?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGphcGFuZXNlfGVufDB8fHx8MTcyMjI0NzE2NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1528360983277-13d401cdc186?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGphcGFuZXNlfGVufDB8fHx8MTcyMjI0NzE2NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Non Latin characters on Arch"><p>Short post to talk about how to install non Latin font in Arch Linux with:</p><p><code>sudo pacman -S noto-fonts-cjk</code> </p><p>this package provides all fonts needed to show non Latin characters like Chinese or Japanese.</p><h1 id="emojis">Emojis</h1><p>Also to show emojis you will need a different font, some options could be:</p><ul><li>noto-fonts-emoji</li><li>ttf-joypixels</li></ul><p>In my case I like <code>joypixels</code> emojis, so I installed them with <code>sudo pacman -S ttf-joypixels</code></p>]]></content:encoded></item><item><title><![CDATA[Nerd fonts in Arch]]></title><description><![CDATA[Nerd fonts are an amazing way to customize your terminal by using almost all glyphs needed to end up with an stunning environment, here I will show you how to install it in your Arch system.]]></description><link>https://blog.nicoandres.dev/nerd-fonts-in-arch/</link><guid isPermaLink="false">66a709f2c07bc80001f3b991</guid><category><![CDATA[Linux]]></category><category><![CDATA[Linux edge]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Mon, 29 Jul 2024 09:42:33 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1518082593638-b6e73b35d39a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGZvbnR8ZW58MHx8fHwxNzIyMjIzMDgxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1518082593638-b6e73b35d39a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGZvbnR8ZW58MHx8fHwxNzIyMjIzMDgxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Nerd fonts in Arch"><p>Nerd fonts are an amazing way to customize your terminal by using almost all glyphs needed to end up with an stunning environment, but adding an nerd fond was not easy task untill now, as most of all nerd fonts are already availables in Arch <code>extra</code> repository, you could find a full list of nerd fonts available in <a href="https://archlinux.org/groups/any/nerd-fonts/?ref=blog.nicoandres.dev" rel="noreferrer">`NerdFonts Arch Extra repository</a>,</p><h2 id="installing-a-new-font">Installing a new font</h2><p>It could be accomplish by pacman, for instance <code>sudo pacman -S ttf-victor-mono-nerd</code></p><h2 id="usage">Usage</h2><p>In my case I use <code>kitty</code> terminal, so I should update my <code>kitty.conf</code> file in <code>~/.config/kitty</code> to set the font-family to:</p><p><code>font_family ttf-victor-mono-nerd</code></p><p>That&apos;s all, never has been more easy to enjoy nerd fonts in Arch &#x1F60E;  </p>]]></content:encoded></item><item><title><![CDATA[Sync Joplin CLI using Dropbox]]></title><description><![CDATA[Sync Joplin CLI using Dropbox]]></description><link>https://blog.nicoandres.dev/sync-joplin-cli-with-dropbox/</link><guid isPermaLink="false">66a66ea4c07bc80001f3b958</guid><category><![CDATA[Linux edge]]></category><category><![CDATA[Terminal]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Sun, 28 Jul 2024 16:21:46 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1721297014035-5fd86e65270f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDR8fHx8fHwyfHwxNzIyMTgyNTY3fA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1721297014035-5fd86e65270f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDR8fHx8fHwyfHwxNzIyMTgyNTY3fA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Sync Joplin CLI using Dropbox"><p>In a previous blog entry I shown how to set up Joplin cli in Arch Linux:</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://blog.nicoandres.dev/install-joplin-in-arch/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Install Joplin CLI in Arch</div><div class="kg-bookmark-description">Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organized into notebooks, I installed in my arch via npm, with nvm setup first, read the entire post for more details :)</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.nicoandres.dev/content/images/size/w256h256/2024/03/Riise-1-2.png" alt="Sync Joplin CLI using Dropbox"><span class="kg-bookmark-author">Fullstack | Nicoandres&apos; blog</span><span class="kg-bookmark-publisher">Nicoandres Rodriguez</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1707305313174-6bd1374ce76a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDN8fHx8fHwyfHwxNzA5NDUzMDQ5fA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Sync Joplin CLI using Dropbox"></div></a><figcaption><p dir="ltr"><span style="white-space: pre-wrap;">Install Joplin CLI in Arch</span></p></figcaption></figure><p>Now I will briefly show you how to sync with Dropbox:</p><h2 id="step-1">Step 1</h2><p>establish the sync method with <code>:config sync.target 7</code> , you could see which other options of sync there are with <code>config --help</code></p><h2 id="step-2">Step 2</h2><p>You will asked to open the URL and authorize the Dropbox app in you browser,</p><h2 id="step-3">Step 3</h2><p>copy and paste the Dropbox token into Joplin.</p><p>That&apos;s all now you will see how Joplin starts the process of sync.</p>]]></content:encoded></item><item><title><![CDATA[🥙 Installing Flatpak in Arch Linux]]></title><description><![CDATA[Flatpak great to instll apps in your system with out affect the core OS files it makes perfect to install any app you want with not do a mess in your OS, it could be simple but anyway I will show you how to getting started with flacpak.]]></description><link>https://blog.nicoandres.dev/installing-flatpak-in-arch-linux/</link><guid isPermaLink="false">6619436bc07bc80001f3b8d9</guid><category><![CDATA[Linux]]></category><category><![CDATA[Terminal]]></category><category><![CDATA[Linux edge]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Sat, 13 Apr 2024 10:28:35 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1493723843671-1d655e66ac1c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGZsYXQlMjBwYWt8ZW58MHx8fHwxNzEyOTMxNjcyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1493723843671-1d655e66ac1c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGZsYXQlMjBwYWt8ZW58MHx8fHwxNzEyOTMxNjcyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#x1F959; Installing Flatpak in Arch Linux"><p>TL;DR</p><p>Flatpak great to instll apps in your system with out affect the core OS files it makes perfect to install any app you want with not do a mess in your OS, it could be simple but anyway I will show you how to getting started with flacpak.</p><h2 id="%F0%9F%93%A6-install-required-packages">&#x1F4E6; Install required packages </h2><p>Install needed package and some dependencies (required at least for me to do SSO in apps like zoom, slack, etc)</p><pre><code class="language-sh">sudo pacman -S flatpak xdg-desktop-portal-wlr xdg-desktop-portal-gtk</code></pre><p>After install do a reboot to have all in order prior to install any app.</p><h2 id="%F0%9F%94%A2-install-your-first-app">&#x1F522; Install your first App</h2><p>I needed to install <code>zoom</code> in my work machine, first you could try search:</p><pre><code class="language-sh">flatpak search zoom</code></pre><p>It will show you the available apps in flathub repo.</p><h3 id="%F0%9F%AA%A9install-command">&#x1FAA9;Install command</h3><p>To install an app you could use <code>install</code> command, below example you could install <code>zoom</code></p><pre><code class="language-sh">flatpak install us.zoom.Zoom</code></pre><h2 id="%F0%9F%AA%80-run-command">&#x1FA80; Run command</h2><p>To run an app use <code>run</code> command as below example:</p><pre><code class="language-sh">flatpak run us.zoom.Zoom</code></pre><h2 id="%F0%9F%90%BC-conclusion">&#x1F43C; Conclusion</h2><p>Flatpak is portable and distro agnostic way to install any app, great to use as option if you don&apos;t wanna mees up your system by installing apps.</p>]]></content:encoded></item><item><title><![CDATA[ChatGPT to help you to solve your console issues 🧑‍⚕️]]></title><description><![CDATA[I will show you a use case for your ChatGPT terminal instance, how to use it for powered your workflow and make you even more productive 🚀]]></description><link>https://blog.nicoandres.dev/chatgpt-to-help-you-to-solve-your-issues/</link><guid isPermaLink="false">66125312c07bc80001f3b83d</guid><category><![CDATA[ChatGPT]]></category><category><![CDATA[Terminal]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Podman]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Sun, 07 Apr 2024 11:45:59 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1712415406482-e75e0afa2b02?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDN8fHx8fHwyfHwxNzEyNDc2OTE0fA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1712415406482-e75e0afa2b02?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDN8fHx8fHwyfHwxNzEyNDc2OTE0fA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;"><p>TL;DR</p><p>ChatGPT is the boom nowadays, it have a large compressive knowledge base of information accessible to you, how do you could use it to improve and power up your daily workflow? here I will show you how it make it for me &#x1F60E;</p><h2 id="identify-the-liar-%F0%9F%91%AE">Identify the liar &#x1F46E;</h2><p>First of all always treat this tool as the impostor.</p><figure class="kg-card kg-image-card"><img src="https://blog.nicoandres.dev/content/images/2024/04/impostor.webp" class="kg-image" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;" loading="lazy" width="600" height="600" srcset="https://blog.nicoandres.dev/content/images/2024/04/impostor.webp 600w"></figure><p>ChatGPT is not the source of truth, it is most like an impostor, always making you think it is genuine, but most of the time it will bring you false answers, so you will need to have knowledge to identify the correct answers from the false ones.</p><h2 id="install-chatgpt-in-your-terminal">Install ChatGPT in your terminal</h2><p>In a previous post I talked about install ChatGPT in your terminal: </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.nicoandres.dev/powering-your-terminal-with-ai/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Powering your terminal with AI</div><div class="kg-bookmark-description">Do you wanna try your terminal powered by AI, here I will show you how to it is easy and useful!</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.nicoandres.dev/content/images/size/w256h256/2024/03/Riise-1-2.png" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;"><span class="kg-bookmark-author">Fullstack | Nicoandres&apos; blog</span><span class="kg-bookmark-publisher">Nicoandres Rodriguez</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1516192518150-0d8fee5425e3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHJvYm90fGVufDB8fHx8MTcwOTM3MjIyOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;"></div></a></figure><h2 id="raise-your-questions">Raise your questions</h2><p>So now you are ready to raise your questions, let&apos;s see a comparison between ChatGPT Vs Search Engine (DuckDuckGo, Google, etc)</p><p>I needed to change <code>podman-compose</code> instead of <code>docker-compose</code> when I execute commands via <code>podman compose</code> (by default it uses <code>docker-compose</code>) so I did a try:</p><h3 id="duckduckgo-%F0%9F%A6%86">DuckDuckGo &#x1F986;</h3><figure class="kg-card kg-image-card"><img src="https://blog.nicoandres.dev/content/images/2024/04/duck-duck-go.png" class="kg-image" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;" loading="lazy" width="1268" height="878" srcset="https://blog.nicoandres.dev/content/images/size/w600/2024/04/duck-duck-go.png 600w, https://blog.nicoandres.dev/content/images/size/w1000/2024/04/duck-duck-go.png 1000w, https://blog.nicoandres.dev/content/images/2024/04/duck-duck-go.png 1268w" sizes="(min-width: 720px) 720px"></figure><p>Above you can see on the first 3 search results there is not a clear answer to the question, so you will need to go through official docs, or Q&amp;A web sites like Stackoverflow, etc, so, good luck my friend.</p><h3 id="chatgpt-%F0%9F%A4%96">ChatGPT &#x1F916;</h3><p></p><figure class="kg-card kg-image-card"><img src="https://blog.nicoandres.dev/content/images/2024/04/chat-gpt.png" class="kg-image" alt="ChatGPT to help you to solve your console issues &#x1F9D1;&#x200D;&#x2695;&#xFE0F;" loading="lazy" width="1289" height="844" srcset="https://blog.nicoandres.dev/content/images/size/w600/2024/04/chat-gpt.png 600w, https://blog.nicoandres.dev/content/images/size/w1000/2024/04/chat-gpt.png 1000w, https://blog.nicoandres.dev/content/images/2024/04/chat-gpt.png 1289w" sizes="(min-width: 720px) 720px"></figure><p>Above image shows you the same question but with a more precise answer, after follow it, it works well, but with some highlights:</p><ol><li>The name of the field is <code>compose_providers</code></li><li>It should be put as <code>compose_providers=[&quot;podman-compose&quot;]</code></li></ol><p>That&apos;s it, after restart the <code>podman</code> service the change works as expected &#x1F389;</p><h3 id="conclusion-%F0%9F%A5%89">Conclusion &#x1F949;</h3><p>ChatGPT definitively is a tool to have in your hands, if you use wisely it will save you precious time of your day &#x1F4AA;. </p>]]></content:encoded></item><item><title><![CDATA[Welcome on board 🦭 Podman 👏]]></title><description><![CDATA[Start using Podman as alternative for docker ready to use and secure! let's do a try with it, here I will show you what do you need to know to start working with Podman today!]]></description><link>https://blog.nicoandres.dev/welcome-on-board-podman/</link><guid isPermaLink="false">66100fdbc07bc80001f3b7c6</guid><category><![CDATA[Docker]]></category><category><![CDATA[Podman]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Fri, 05 Apr 2024 15:42:32 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1495774856032-8b90bbb32b32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBvZCUyMHRvJTIwbWFufGVufDB8fHx8MTcxMjMyODY1NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1495774856032-8b90bbb32b32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBvZCUyMHRvJTIwbWFufGVufDB8fHx8MTcxMjMyODY1NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Welcome on board &#x1F9AD; Podman &#x1F44F;"><p>TL;DR</p><p>Podman is the alternative to docker, but why we will need an alternative to docker? first of all docker is great or not? well it is but... in Linux it should be executed as root, and by giving root access to docker service it makes possible in theory that maybe a container could execute malicious code in host environment, that doesn&apos;t sounds great no?</p><h2 id="%F0%9F%93%9C-introduction-to-podman">&#x1F4DC; Introduction to Podman</h2><p>Podman is an open source tool alternative to docker, originally developed by Red Had &#x1F534;&#x1F3A9; Podman architecture is different to docker and it allows run containers as rootless user.</p><h2 id="%F0%9F%93%A5-installing-podman-in-arch-linux">&#x1F4E5; Installing Podman in Arch Linux</h2><p>you could install Podman with:</p><pre><code class="language-sh">sudo pacman -S podman</code></pre><p>after install it you should be able to execute <code>podman container ls</code> &#x1F389;</p><h2 id="%F0%9F%A7%8C-troubleshooting">&#x1F9CC; Troubleshooting</h2><h3 id="error-overlay-fs">Error: overlay fs</h3><p>If you run into below error:</p><pre><code class="language-sh">Error: kernel does not support overlay fs: &apos;overlay&apos; is not supported over xfs</code></pre><p>As me you&apos;re using xfs system, and you will need install <code>fuse-overlayfs</code> package as mentioned in Podman&apos;s Github issues <a href="https://github.com/containers/podman/issues/2659?ref=blog.nicoandres.dev#issuecomment-473649187">here</a>.</p><p>so install it with:</p><pre><code class="language-sh">sudo pacman -S fuse-overlayfs</code></pre><p>after that you will be able to get the correct output for <code>podman container ls</code></p><h3 id="error-devnettun-no-such-device">Error: /dev/net/tun: No such device</h3><p>As mentioned in this Github issue in Podman&apos;s repository <a href="https://github.com/containers/podman/issues/9543?ref=blog.nicoandres.dev#issuecomment-1332713964">here</a>, a reboot should solve this error.</p><h2 id="%F0%9F%8E%9F%EF%B8%8F-podman-podman-compose">&#x1F39F;&#xFE0F; Podman + Podman-Compose</h2><p>For sure you will use <code>docker-compose</code> by luck Podman also offers <code>podman-compose</code> it is not required to work with Podman as <code>podman compose</code> command by default uses <code>docker-compose</code> but I would like to use <code>podman-compose</code> as well so let&apos;s install it with:</p><pre><code class="language-sh">sudo pacman -S podman-compose</code></pre><h2 id="1%EF%B8%8F%E2%83%A3-first-lets-search-for-a-container">1&#xFE0F;&#x20E3; First lets search for a container</h2><p>for search containers in docker hub you could execute below command:</p><pre><code class="language-sh">podman search docker.io/node</code></pre><p>It will brings you a list of containers in docker hub that matches with <code>node</code></p><pre><code class="language-sh">NAME                                   DESCRIPTION
docker.io/library/node                 Node.js is a JavaScript-based platform for s...
docker.io/library/mongo-express        Web-based MongoDB admin interface, written w...
docker.io/nodered/node-red-docker      Deprecated - older Node-RED Docker images. 
docker.io/nodered/node-red             Low-code programming for event-driven applic...
docker.io/circleci/node                Node.js is a JavaScript-based platform for s...
docker.io/cimg/node                    The CircleCI Node.js Docker Convenience Imag...
</code></pre><p>now you could run into <code>node</code> container with:</p><pre><code class="language-sh">podman run -it docker.io/library/node</code></pre><p>that will bring you into node container &#x1F389;</p><pre><code class="language-sh"> ~ &#xE0B0; podman run -it docker.io/node
Welcome to Node.js v21.7.2.
Type &quot;.help&quot; for more information.
&gt; 
</code></pre><p>well that&apos;s all, enjoy Podman!</p>]]></content:encoded></item><item><title><![CDATA[Fixing issues with Ghost-Mailgun in transactional mails]]></title><description><![CDATA[What to do when your transactional emails are not working on your Ghost blog self hosted instance via docker containers? I will show you what troubleshooting you can do 🚀]]></description><link>https://blog.nicoandres.dev/fixing-issues-with-ghost-mailgun-in-transactional-mails/</link><guid isPermaLink="false">65fc5568426d8d00016cce11</guid><category><![CDATA[Docker]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Ghost]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Thu, 21 Mar 2024 15:59:41 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1707344088547-3cf7cea5ca49?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wxfDF8YWxsfDF8fHx8fHwyfHwxNzExMDM1NDMyfA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1707344088547-3cf7cea5ca49?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wxfDF8YWxsfDF8fHx8fHwyfHwxNzExMDM1NDMyfA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Fixing issues with Ghost-Mailgun in transactional mails"><p>TL;DR</p><p>If you are a self hosted ghost blog owner that uses docker, maybe you should sometimes to fix any issues with your Mailgun settings, I will show you which steps I follow to fix those issues.</p><h2 id="%F0%9F%93%A7-check-your-configproductionjson">&#x1F4E7; Check your config.production.json</h2><p>As a self  hosted Ghost blog owner, you should be aware this is the main file to setting up your transactional emails in your Ghost instance, you could check if this file is in good shape with the command:</p><pre><code class="language-sh">docker exec -it &lt;container-name&gt; cat config.production.js</code></pre><p>I previously show you hot to set up your docker-compose to always rebuild this file with the correct information in each container restart here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.nicoandres.dev/setting-up-your-mailgun-in-your-selfhosted-ghost/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Setting up your Mailgun in your selfhosted Ghost</div><div class="kg-bookmark-description">If you&#x2019;re hosting your own Ghost blog in a docker container you should to know how to setting up your mail settings with Mailgun, if not I will show you how &#x1F44D;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.nicoandres.dev/content/images/size/w256h256/2024/03/Riise-1-2.png" alt="Fixing issues with Ghost-Mailgun in transactional mails"><span class="kg-bookmark-author">Fullstack | Nicoandres&apos; blog</span><span class="kg-bookmark-publisher">Nicoandres Rodriguez</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1526554850534-7c78330d5f90?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fE1haWx8ZW58MHx8fHwxNzA5NzMyMjY1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Fixing issues with Ghost-Mailgun in transactional mails"></div></a></figure><p>But what to do when any issue arise? </p><h2 id="%F0%9F%93%83-check-your-ghost-logs">&#x1F4C3; Check your Ghost logs</h2><p>You should to check your containers logs with the command:</p><pre><code class="language-sh">docker container logs &lt;container-name&gt; --since 10m

</code></pre><p>The parameter <code>since</code> show logs since timestamp (e.g. &quot;2013-01-02T13:23:37Z&quot;) or relative (e.g. &quot;42m&quot; for 42 minutes).</p><p>There is useful information to check which could be the issue.</p><h2 id="%F0%9F%91%80-double-check-ghost-docs">&#x1F440; Double check Ghost docs</h2><p>Double check official docs about Ghost email settings, maybe you missed something important there.</p><p>As important reminder you should to set up first your transactional emails before your bulk emails.</p><h2 id="%F0%9F%9A%80-restart-after-each-change">&#x1F680; Restart after each change</h2><p>As rule don&apos;t forget to restart your Ghost instance after any change, in a regular self hosted instance it could be achived by running the command <code>ghost restart</code> but as a docker user you could do it by restarting your container with <code>docker container restart &lt;container-name&gt;</code></p>]]></content:encoded></item><item><title><![CDATA[Nx monorepo react-python]]></title><description><![CDATA[I will show you how to create a Nx mono-repo for a for a react-python stack app it is easy to do by CLI and requires little effort.]]></description><link>https://blog.nicoandres.dev/nx-monorepo/</link><guid isPermaLink="false">65f9ab3728812900010d13c4</guid><category><![CDATA[Nx]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Tue, 19 Mar 2024 16:12:25 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1650938826562-4ccbc49fa62f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fG54fGVufDB8fHx8MTcxMDg2MTE1OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h3 id="tldr">TL;DR</h3><img src="https://images.unsplash.com/photo-1650938826562-4ccbc49fa62f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fG54fGVufDB8fHx8MTcxMDg2MTE1OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Nx monorepo react-python"><p>I will show you how to create a Nx mono-repo for a for a react-python stack app it is easy to do by CLI and requires little effort.</p><h2 id="create-a-nx-mono-repo-with-nx-cli-%F0%9F%8E%AE">Create a nx mono-repo with nx cli &#x1F3AE;</h2><p><a href="https://nx.dev/getting-started/tutorials/react-monorepo-tutorial?ref=blog.nicoandres.dev">nx official docs to create a react mono-repo</a> recommends this command:</p><pre><code class="language-sh">npx create-nx-workspace@latest &lt;app-name&gt; --preset=react-monorepo</code></pre><p>I run a more personalized one based on my preferences:</p><pre><code class="language-sh">npx create-nx-workspace@latest --name=&lt;app-name&gt; --preset=react-monorepo --docker=true --packageManager=pnpm --bundler=vite --style=@emotion/styled --e2eTestRunner=playwright</code></pre><p>above command specific to use <code>pnpm</code> as package manager, <code>playwright</code> for e2e test runner and <code>vite</code> bundler instead of Webpack</p><p>after running above command and if you doesn&apos;t have any errors you could navigate to the recent folder created for you app in my case <code>musiik</code> with <code>cd musiik</code> and run there <code>nx serve musiik</code> (change the name for a relevant one to you and ensure nx is globally installed with npm i -g)</p><p>If everything is going well you should to have something in <code>localhost:4200</code> similar to:</p><figure class="kg-card kg-image-card"><img src="https://blog.nicoandres.dev/content/images/2024/03/nx-musiik.png" class="kg-image" alt="Nx monorepo react-python" loading="lazy" width="2000" height="2119" srcset="https://blog.nicoandres.dev/content/images/size/w600/2024/03/nx-musiik.png 600w, https://blog.nicoandres.dev/content/images/size/w1000/2024/03/nx-musiik.png 1000w, https://blog.nicoandres.dev/content/images/size/w1600/2024/03/nx-musiik.png 1600w, https://blog.nicoandres.dev/content/images/2024/03/nx-musiik.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Nice!</p><h2 id="adding-python-project-based-on-poetry-%F0%9F%8E%AD">Adding Python project based on Poetry &#x1F3AD;</h2><p>lets search for the proper nx plugin in <a href="https://nx.dev/plugin-registry?ref=blog.nicoandres.dev">plugins section</a> if you search for Python you will see the poetry plugin by following the link you will land in its github page where you will found the instructions:</p><ol><li>install it <code>pnpm install @nxlv/python --save-dev</code></li><li>update nx.json:</li></ol><pre><code class="language-json">{
  ...
  &quot;plugins&quot;: [
    &quot;@nxlv/python&quot;
  ]
  ...
}</code></pre><ol start="3"><li>create project <code>nx generate @nxlv/python:poetry-project myproject</code><ol><li>Before that I needed to install <code>pipx</code> and <code>poetry</code></li><li>in Arch in installed <code>pipx</code> with <code>sudo pacman -S python-pipx</code></li><li>ensure <code>pipx</code> is in path with <code>pipx ensurepath</code></li><li>restart terminal</li><li>install <code>poetry</code> with <code>pipx install poetry</code></li><li>boom &#x1F680; ready to go!</li></ol></li></ol><figure class="kg-card kg-image-card"><img src="https://blog.nicoandres.dev/content/images/2024/03/mono-repo.png" class="kg-image" alt="Nx monorepo react-python" loading="lazy" width="997" height="716" srcset="https://blog.nicoandres.dev/content/images/size/w600/2024/03/mono-repo.png 600w, https://blog.nicoandres.dev/content/images/2024/03/mono-repo.png 997w" sizes="(min-width: 720px) 720px"></figure><p>This shows it creates a new python project in extractor folder.</p><h4 id="edit">Edit:</h4><p>Above command will create a Python project named <code>Extractor</code> inside a folder named same, which is not convenient, to solve this you could specify the directory name by using the parameter <code>--directory=&lt;directory-name&gt;</code>, the command will be:</p><pre><code class="language-sh">nx generate @nxlv/python:poetry-project extractor --directory=python-microservices</code></pre><p>This will create the project inside a different folder name, which is more convenient.</p>]]></content:encoded></item><item><title><![CDATA[Building an open source music streaming server]]></title><description><![CDATA[Join me in this adventure of open source project to build an music stream server for your own enjoyment.]]></description><link>https://blog.nicoandres.dev/making-an-open-source-music-streaming-server/</link><guid isPermaLink="false">65f85bec28812900010d1344</guid><category><![CDATA[Docker]]></category><category><![CDATA[React]]></category><category><![CDATA[Nx]]></category><category><![CDATA[Typescript]]></category><dc:creator><![CDATA[Nicoandres Rodriguez]]></dc:creator><pubDate>Mon, 18 Mar 2024 16:07:47 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1584257274862-42aa4f6e5f55?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGVjb3N5c3RlbXxlbnwwfHx8fDE3MTA3NzUyNzB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1584257274862-42aa4f6e5f55?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGVjb3N5c3RlbXxlbnwwfHx8fDE3MTA3NzUyNzB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Building an open source music streaming server"><p>This short post is the first of an series of post about how to build an open source music streaming server  to stream you own music collection everywhere anytime and with style &#x1F60E;</p><h2 id="architecture-%F0%9F%8F%97%EF%B8%8F">Architecture &#x1F3D7;&#xFE0F;</h2><p>First lets decide about the architecture for our amazing streaming service:</p><ul><li>Repository mono-repo powered by Nx &#x1F50B;</li><li>Infrastructure powered by Docker containers &#x1F433;</li><li>Front-end: React NextJS, Material-Tailwind &#x1F485;</li><li>BFF: GraphQL &#x1F9D1;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;</li><li>Back-end micro-service: MP3 metadata extractor. &#x1F3ED;</li><li>Back-end micro-service: AI to autocomplete missing any MP3 missing info. &#x1F916;</li><li>Authentication with Auth0 &#x1F511;</li><li>Translations with React-INTL &#x1F30E;</li><li>Redis DB &#x1F6E2;&#xFE0F;</li></ul><p>In next posts I will taking a look in each step to build this project from scratch.</p><h2 id="diagram">Diagram</h2><p>below a quick diagram of the architecture:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.nicoandres.dev/content/images/2024/03/musiik-architecture.png" class="kg-image" alt="Building an open source music streaming server" loading="lazy" width="400" height="400"><figcaption><span style="white-space: pre-wrap;">music streaming system architecture</span></figcaption></figure><h2 id="next-steps">Next steps</h2><p>In your inbox &#x1F4E5; you could see coming soon mails to see the progress of this project and each step in the building process.</p><h2 id="resources">Resources</h2><ul><li>Nx intro <a href="https://nx.dev/getting-started/intro?ref=blog.nicoandres.dev">link</a></li><li>Material-Tailwind &#x1FA81; <a href="https://www.material-tailwind.com/?ref=blog.nicoandres.dev">link</a></li><li>React-int <a href="https://formatjs.io/docs/react-intl/?ref=blog.nicoandres.dev">link</a></li><li>Auth0-NextJS plugin <a href="https://github.com/auth0/nextjs-auth0?ref=blog.nicoandres.dev">link</a></li></ul>]]></content:encoded></item></channel></rss>