<?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>Forem: Federico Moretti</title>
    <description>The latest articles on Forem by Federico Moretti (@fedtti).</description>
    <link>https://forem.com/fedtti</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%2F529336%2F94c6c8c7-a806-4c14-9906-3de7350449c7.jpg</url>
      <title>Forem: Federico Moretti</title>
      <link>https://forem.com/fedtti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fedtti"/>
    <language>en</language>
    <item>
      <title>How to Run Claude Code With Ollama and Local Models for Free</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Sat, 24 Jan 2026 14:31:47 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-run-claude-code-with-ollama-and-local-models-for-free-18a8</link>
      <guid>https://forem.com/fedtti/how-to-run-claude-code-with-ollama-and-local-models-for-free-18a8</guid>
      <description>&lt;p&gt;&lt;em&gt;Yes, Ollama now officially supports Claude Code: I was just giving it a try, following a tutorial I found on the web, when an announce suddenly appeared on LinkedIn. Then, I updated my setup to fit the new configuration suggestions; it runs with GPT-OSS, Qwen3-Coder, and GLM-4.7.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Claude Code Locally
&lt;/h2&gt;

&lt;p&gt;I already knew Claude Code. It was recently activated on my company account: the funny thing is that I’ve never used it for work yet. But &lt;strong&gt;I wanted to learn how to use it&lt;/strong&gt; because it is a highly sought-after tool on the market. However, I had no intention of paying for it or keeping the company laptop on after work.&lt;/p&gt;

&lt;p&gt;So I decided to test it with an LLM model locally, following &lt;a href="https://medium.com/@joe.njenga/i-tried-new-claude-code-ollama-workflow-its-wild-free-cb7a12b733b5?sk=70a7f2a26603f81e7c9cdbdfb3d6218e" rel="noopener noreferrer"&gt;a guide I found online&lt;/a&gt;: unfortunately, I ran into the same problems as its author. Some sample models are too slow, while others &lt;strong&gt;do not support Anthropic APIs&lt;/strong&gt; such as CodeGemma, which does not allow functions to be invoked.&lt;/p&gt;

&lt;p&gt;The best solution is to use &lt;a href="https://docs.ollama.com/integrations/claude-code" rel="noopener noreferrer"&gt;one of the models mentioned&lt;/a&gt; by Ollama. They are on average heavier than I would have liked to try, but at the moment it seems like the optimal compromise. I’m talking about &lt;strong&gt;GPT-OSS, Qwen3-Coder, or GLM-4.7&lt;/strong&gt;. I opted for the second one, because the first one doesn’t work well with CPUs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Claude Code on macOS
&lt;/h3&gt;

&lt;p&gt;Installation on macOS and Linux (or any other UNIX-like operating system) is identical. At this stage, you should not even change what &lt;strong&gt;Anthropic officially recommends&lt;/strong&gt;. Just be careful with permissions: it is not recommended to be root, but in my case I had to reassign the ownership of the folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, it is recommended to export certain variables from the terminal emulator profile. You can &lt;strong&gt;do this manually&lt;/strong&gt; or launch the program from Ollama: I opted for the first option, so I don’t have to go through the latter every time. Of course, if you intend to use a model stored in the cloud, you must add an API key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.zshrc

  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ollama
  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434

&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use whichever editor you prefer, just remember to insert the three strings at the bottom of the file that is correct for your terminal — I use Zsh, for example. Now you need to &lt;strong&gt;download one of the compatible models&lt;/strong&gt; before starting the program: if you already have one locally, you can skip the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Download GPT-OSS, Qwen3-Coder, or GLM-4.7
&lt;/h3&gt;

&lt;p&gt;I assume you have already installed Ollama for your platform. If you haven’t done so, I recommend using &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;the executable installer&lt;/a&gt; that you can find on the official website. Ensure that it’s running and that the installed version is 0.14.0 or later: I’m using version 0.15.0. Then, &lt;strong&gt;download the model&lt;/strong&gt; you prefer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull qwen3-coder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;qwen3-coder&lt;/code&gt; with &lt;code&gt;gpt-oss&lt;/code&gt; for the OpenAI model or with &lt;code&gt;glm-4.7-flash&lt;/code&gt;: &lt;code&gt;glm-4.7&lt;/code&gt; is only available on the cloud (and therefore requires a paid subscription). Once the download is complete, you can proceed with running Claude Code. It is possible that &lt;strong&gt;the first time you run it&lt;/strong&gt; in a new folder, it will ask for write permission.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama launch claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use the &lt;code&gt;claude&lt;/code&gt; command directly: if you do not specify one, it will ask you which model to use from those available. I always have at least a couple. I don’t know what it does &lt;strong&gt;if there is only one&lt;/strong&gt;: in theory, it should proceed without further requests. The interesting thing would be to integrate it with an IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips and Tricks
&lt;/h2&gt;

&lt;p&gt;The best thing to do is to create a &lt;code&gt;CLAUDE.md&lt;/code&gt; file in the root folder of your project. Here you can specify details such as the framework, libraries, and best practices to follow when &lt;strong&gt;creating or modifying components&lt;/strong&gt;. It should automatically recognize certain solutions such as EditorConfig and Prettier.&lt;/p&gt;

&lt;p&gt;Running Claude Code in a generic path on your machine is pretty much useless, because &lt;strong&gt;the tool needs to access the files&lt;/strong&gt; it needs to modify. It is not the best tool for starting from scratch: it is useful when starting from an already existing project. I still need to figure out which model is best for JavaScript, Python, and Rust.&lt;/p&gt;

&lt;p&gt;As I mentioned, the best idea is to associate Claude Code with an IDE: if you use VS Code, there is &lt;a href="https://code.claude.com/docs/en/vs-code" rel="noopener noreferrer"&gt;an official extension&lt;/a&gt;, while for Antigravity I have not yet figured out if it is possible to replace the default agent and, if so, how. Otherwise, you can always &lt;strong&gt;open a terminal under the tab&lt;/strong&gt; and follow the changes live.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you’d like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;&lt;strong&gt;Bluesky&lt;/strong&gt;&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>No, Your GitHub Contribution Graph Means Nothing</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Sat, 17 Jan 2026 15:41:38 +0000</pubDate>
      <link>https://forem.com/fedtti/no-your-github-contribution-graph-means-nothing-3d2g</link>
      <guid>https://forem.com/fedtti/no-your-github-contribution-graph-means-nothing-3d2g</guid>
      <description>&lt;p&gt;&lt;em&gt;Nor your LinkedIn profile does. That’s why I struggle to prove my worth. I still haven’t figured out how to convey my true value to those who don’t know me yet. I find it particularly difficult in two completely different countries: Italy and the United States. Let’s try to understand together why (and how to deal with it).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You Are Worth More Than Your Salary
&lt;/h2&gt;

&lt;p&gt;This sentence was said to me years ago, just before leaving me at home, so it’s a bit meaningless. I read what &lt;a class="mentioned-user" href="https://dev.to/sylwia-lask"&gt;@sylwia-lask&lt;/a&gt; said last week about &lt;a href="https://dev.to/sylwia-lask/your-github-contribution-graph-means-absolutely-nothing-and-heres-why-2kjc"&gt;the GitHub contribution graph&lt;/a&gt; and I want to share my experience. I agree with her: it doesn’t mean anything. And &lt;strong&gt;that’s not the only thing&lt;/strong&gt; that, despite everything, is useless.&lt;/p&gt;

&lt;p&gt;First, although GitHub discourages from doing so, you may have separate accounts for personal and professional use just like me. You can merge them, but &lt;strong&gt;you will lose permissions&lt;/strong&gt; for what you delete. In any case, the repositories in my company account are all private and therefore would not show anything to employers.&lt;/p&gt;

&lt;p&gt;Before my last job, I worked for a startup that uses GitLab, so if I had kept it active, I would have had &lt;strong&gt;an account that had been unused for six years&lt;/strong&gt;. Does that mean I did nothing during all that time? What if I had worked in consulting, using on-premise servers? These parameters cannot be objectified.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Italian Job: A World Apart
&lt;/h3&gt;

&lt;p&gt;I’m Italian and I work in Italy. Compared to the rest of the world (or at least what I read from my foreign colleagues), &lt;strong&gt;the job market is completely different&lt;/strong&gt;. Forget about your LinkedIn profile, Stack Overflow, etc.: they will ask you for them all, and no one will look at them. You must have connections within the company.&lt;/p&gt;

&lt;p&gt;Don’t dare to have a resume in English. Everyone here has a degree, and no one really speaks it. Since my resume is only in English, no one has called me back: of course, I may have included &lt;strong&gt;information that was not interesting&lt;/strong&gt;, but it’s strange that until the day before I had numerous proposals.&lt;/p&gt;

&lt;p&gt;Another thing I did was to exclude age, marital status, and photograph. Abroad, it is illegal to include them, but in Italy, they ask everyone for them. And if, unfortunately, &lt;strong&gt;you’re a woman of childbearing age&lt;/strong&gt;, it’s a problem. Well, actually, it’s a problem even if you’re just a woman. I’m not, but I’m old.&lt;/p&gt;

&lt;h3&gt;
  
  
  LeetCode and the United States of America
&lt;/h3&gt;

&lt;p&gt;Who else hates LeetCode? I have a very clear (and very negative) idea of US education. What they study at university there, we study here in elementary school: what is &lt;strong&gt;completely different is the method&lt;/strong&gt;. LeetCode, like the US education system, seeks to objectify the subject.&lt;/p&gt;

&lt;p&gt;Let me explain. &lt;a href="https://dev.to/fedtti/how-to-manage-side-projects-when-you-have-adhd-imb"&gt;I have ADHD and an above-average IQ&lt;/a&gt;: this means, on the one hand, that I have greater potential than other candidates and, on the other, that I have special needs. If you give me a time limit to solve a problem that has nothing to do with reality, &lt;strong&gt;I will end up losing interest in solving it&lt;/strong&gt;. That’s it.&lt;/p&gt;

&lt;p&gt;For me, it makes no sense to solve an abstract problem with a specific tool within a time limit. They would never ask me to do the same at work: I’m the one who chooses &lt;strong&gt;the most suitable tool for the specific request&lt;/strong&gt;. And it’s not about calculating the distance from Earth to the Moon in light years.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s All a Matter of Trust
&lt;/h2&gt;

&lt;p&gt;Don’t get me wrong, I understand perfectly well that it’s difficult to understand the potential of the person in front of you. You can get degrees without studying, and &lt;strong&gt;you can copy homework&lt;/strong&gt;. You can be very talented and hate being watched while you work, or you can be mediocre but know how to keep your cool.&lt;/p&gt;

&lt;p&gt;But if I have a j*rk in front of me, I can tell right away. When I realize that you are not, then I have to figure out if &lt;strong&gt;you have the right motivation&lt;/strong&gt;. I can learn another programming language, another framework, but I can’t work for someone who doesn’t trust me. And, below a certain IQ level, I struggle.&lt;/p&gt;

&lt;p&gt;There are patterns that help me recognize a bad job advertisement. I suppose there are also patterns that help identify bad applicants. Measuring abilities based on code written in a specific time frame is as &lt;strong&gt;stupid as judging university grades&lt;/strong&gt;. And I say this as someone who graduated with honors… in a totally different field.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you’d like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;&lt;strong&gt;Bluesky&lt;/strong&gt;&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why I Still Prefer Sora to Nano Banana for Image Generation</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Fri, 16 Jan 2026 14:02:33 +0000</pubDate>
      <link>https://forem.com/fedtti/why-i-still-prefer-sora-to-nano-banana-for-image-generation-4a04</link>
      <guid>https://forem.com/fedtti/why-i-still-prefer-sora-to-nano-banana-for-image-generation-4a04</guid>
      <description>&lt;p&gt;&lt;em&gt;I’m using AI to create cover images only for blog posts, so I don’t have high expectations. I thought that Google was better than OpenAI at first, but I’ve changed my mind: I don’t know whether it’s a matter of hidden system prompts or an LLM model issue. But I’m noticing huge limits in Gemini.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sora vs. Nano Banana for Images
&lt;/h2&gt;

&lt;p&gt;I’m not interested in generating videos to date. I’m not even trying. I only have the need of &lt;strong&gt;creating cool pictures to use as cover images&lt;/strong&gt; for my blog posts: that’s why I’m definitely not approaching this process as a professional. On the contrary, I’m trying use the service as an end user would. So very badly.&lt;/p&gt;

&lt;p&gt;I’m not really writing “prompts”, for example. I’m just describing at a high level what I want — as I would when talking to someone. I’m also &lt;strong&gt;using the free versions of the given services&lt;/strong&gt;: being just a hobby, I didn’t consider any subscription. Most of the time I’m rely on the recent built-in feature of this platform now.&lt;/p&gt;

&lt;p&gt;But I think I’ll do otherwise, since I noticed that Nano Banana is subject to a sort of system prompt that &lt;strong&gt;limits the service capabilities&lt;/strong&gt; a priori. Despite I tried different approaches, it always ends up proposing similar images. Good, but not great… since I want to have images representing the content of my articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Same Prompt, Different Results
&lt;/h3&gt;

&lt;p&gt;Of course, Sora and Nano Banana are using different models: keep i mind that I’m Italian and I live in Italy, then I can’t use Sora 2. In order to test the prompt, &lt;strong&gt;I sent the same to both the services&lt;/strong&gt;, checking their results. My description is, as I mentioned, high-level and generic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A picture to represent the challenge between Sora and Nano Banana as
image generators powered by AI.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check the Nano Banana’s result above, having a look at the cover image of this post. Below, the result from Sora: for sure &lt;strong&gt;this is just my opinion&lt;/strong&gt;, but I think it’s far better. Please, notice that I didn’t change a single word to generate the second image. As I’ve already said, I’m using the free version of both the services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxkvef91uo6hg0i1gxr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxkvef91uo6hg0i1gxr7.png" alt="Sora vs. Nano Banana by Sora" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;&lt;sup&gt;&lt;em&gt;Generated by Sora&lt;/em&gt;&lt;/sup&gt;&lt;/center&gt;

&lt;p&gt;Things change a bit if I try Nano Banana Pro from my own Google AI Studio instance: &lt;strong&gt;the standard version outputs only a smaller square picture&lt;/strong&gt;. Anyway, I didn’t find significant differences. I still prefer the Sora’s result, even though I’m using an outdated GPT model version.&lt;/p&gt;

&lt;h3&gt;
  
  
  This Is Not a Benchmark
&lt;/h3&gt;

&lt;p&gt;Please, notice that I’m not showing off a benchmark. I’m just sharing my experience as, let’s say, a regular user who &lt;strong&gt;tries two different services as a prospect&lt;/strong&gt;. I could fine-tune the prompt (well, it would be rewritten from scratch) to get better results, but that’s not my purpose here. I already use to &lt;a href="https://dev.to/fedtti/optimize-your-prompts-by-using-shorter-synonyms-with-google-ai-studio-30lk"&gt;do it for different needs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I know that you could think I’m not testing them properly. And, from a developer perspective, you’re right: &lt;strong&gt;this is not a professional approach&lt;/strong&gt;. Comparing Sora and Nano Banana is wrong, because at the same time I’m using two different services based on two different models.&lt;/p&gt;

&lt;p&gt;It makes sense to adapt the prompt to the model, as well as to the service, in use, but I wanted to &lt;strong&gt;get an immediate result&lt;/strong&gt;: this is what I got, leaving most of the details to be defined by the LLM itself. I didn’t add any filter — even though I really like &lt;em&gt;Cartoonify&lt;/em&gt; for Sora. I wrote just two lines of text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nano Banana and Its Pro Version
&lt;/h3&gt;

&lt;p&gt;While the cover image for this post has been generated by the built-in Nano Banana version from the DEV editor, I also tried to get a result from the standard interface. I obtained &lt;strong&gt;a very different picture&lt;/strong&gt;, so I think that Forem is putting something between the model and the prompt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqhjozseclojmdbn4yd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqhjozseclojmdbn4yd0.png" alt="Sora vs. Nano Banana by Nano Banana Pro" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;&lt;sup&gt;&lt;em&gt;Generated by Nano Banana Pro&lt;/em&gt;&lt;/sup&gt;&lt;/center&gt;

&lt;p&gt;I didn’t suggest any percentage to the LLM. Funny to see that Nano Banana Pro &lt;strong&gt;assigned a better performance to its rival&lt;/strong&gt;: is it a strategy? There’s also a Gemini watermark in the lower right corner. I assume it showed up because I’m not paying for the service, but in general I’m far from being satisfied from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Will Continue to Use Sora
&lt;/h2&gt;

&lt;p&gt;No matter the service and the tier, Gemini is generating worse pictures to date. &lt;strong&gt;GPT offers the best results&lt;/strong&gt;: and I can’t even access the latest update. It would be interesting to try the APIs, sending a real prompt, to better evaluate their performances. I will definitely do it in the future, since it’s crucial in my opinion.&lt;/p&gt;

&lt;p&gt;OpenAI’s Responses API added image generation, while Completions API lacks it. &lt;strong&gt;I’ve never used Google to do the same&lt;/strong&gt; with Gemini, so I don’t know if 2.5 and 3 have different capabilities. Unfortunately, Big G drastically reduced the free tier limits, then I can’t “play” with them anymore.&lt;/p&gt;

&lt;p&gt;That’s why I’m not even trying to have a professional approach. The fastest way of getting a decent picture is to open Sora and use its web interface: I think this is &lt;strong&gt;what the end users are doing&lt;/strong&gt;. Next, I will give a chance to TranslateGemma, but it’s a completely different use case, and there I will be more technical.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you’d like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;&lt;strong&gt;Bluesky&lt;/strong&gt;&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>performance</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>How to Deploy Your Angular Website on GitHub Pages</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Wed, 14 Jan 2026 16:43:07 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-deploy-your-angular-website-on-github-pages-65i</link>
      <guid>https://forem.com/fedtti/how-to-deploy-your-angular-website-on-github-pages-65i</guid>
      <description>&lt;p&gt;&lt;em&gt;If you recall, &lt;a href="https://dev.to/fedtti/why-i-switched-from-vs-code-to-antigravity-and-im-not-going-back-2ml2"&gt;I am switching to Google services&lt;/a&gt; for all my personal needs: not for the company I work for. This means that my website has also switched to Angular. It was a painless transition, but I had to modify some existing configurations in addition to the new ones. Let’s see how I handled the changes.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular and GitHub Pages
&lt;/h2&gt;

&lt;p&gt;Fortunately, there is a more or less “official” method for deploying a web application created with Angular on GitHub Pages. Although it is &lt;a href="https://github.com/angular-schule/angular-cli-ghpages/#readme" rel="noopener noreferrer"&gt;a third-party script, &lt;strong&gt;&lt;code&gt;angular-cli-ghpages&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; is formally accepted as the best and recommended method to proceed. I must admit that it worked immediately, so I implemented it.&lt;/p&gt;

&lt;p&gt;I generally prefer built-in solutions to avoid being dependent on external libraries, but &lt;strong&gt;in this case I made an exception&lt;/strong&gt;. This is also because in the future I would like to take a further step and switch to Flutter, but in general the script does everything I need it to do. I didn’t have any problems with the custom domain, for example.&lt;/p&gt;

&lt;p&gt;In any case, I had to change my publishing strategy, based on GitHub Actions, to one based on the &lt;code&gt;gh-pages&lt;/code&gt; branch. All this while continuing to use GitHub Actions: not exactly ideal. I would have preferred to &lt;strong&gt;keep everything on the same branch&lt;/strong&gt; to avoid confusion, but in the end, I’m keeping the code to myself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What, What Not, and What the F*ck
&lt;/h3&gt;

&lt;p&gt;I chose Angular for two reasons, or rather three: I also use it for work, I found some interesting projects that &lt;strong&gt;combine it with Rust via WebAssembly&lt;/strong&gt;, and it’s easy to integrate with Antigravity. It’s not because of the framework itself. I still believe that a framework should be chosen based on specific needs.&lt;/p&gt;

&lt;p&gt;If I had to choose based on current demand, I would opt for React with Next.js, but &lt;strong&gt;I’m sure I’ll find a way to use that too&lt;/strong&gt;. More than a specific framework, I needed to leverage GitHub Pages and GitHub Actions. Leaving aside my experiments, when it comes to creating a portfolio, one framework is as good as another.&lt;/p&gt;

&lt;p&gt;I did without one for years. The longest-lasting structure I had for my personal website was based on WordPress. It still exists, but does anyone still use it for this purpose? Honestly, I hope not. Not because it’s a bad product, but because &lt;strong&gt;it has had its day&lt;/strong&gt;. Even though PHP is making a big comeback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying Angular to GitHub Pages
&lt;/h3&gt;

&lt;p&gt;There are two ways of doing the same thing: you can either add the &lt;code&gt;angular-cli-ghpages&lt;/code&gt; package manually or by using the Angular CLI. I chose the latter, since it also adds a &lt;code&gt;deploy&lt;/code&gt; entry in &lt;code&gt;angular.json&lt;/code&gt; — otherwise, you must do it on your own. Let’s start executing the command below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng add angular-cli-ghpages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m assuming that you already installed the Angular CLI globally. Then, &lt;strong&gt;you must change your publishing settings&lt;/strong&gt;, replacing GitHub Actions with the branch &lt;code&gt;gh-pages&lt;/code&gt; as the source: it doesn’t matter if we’re going to use GitHub Actions as well. That’s why you must update the &lt;code&gt;angular.json&lt;/code&gt; entry as follow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"deploy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"builder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"angular-cli-ghpages:deploy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john.doe@foo.bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"foo.bar"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember to replace &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;email&lt;/code&gt; with your own GitHub credentials. This will push any updates to the &lt;code&gt;gh-pages&lt;/code&gt; branch (it will create a new one in your repository, if it didn’t exist yet) every time you execute &lt;code&gt;ng deploy&lt;/code&gt; from your terminal emulator. Let’s automate all the things by configuring GitHub Actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic Deployment With GitHub Actions
&lt;/h3&gt;

&lt;p&gt;You’re almost done. If you don’t have specific needs – I forgot to mention that the &lt;code&gt;cname&lt;/code&gt; key is only needed if you configured a custom domain – such as a different base, all you have to do is &lt;strong&gt;creating a classic token&lt;/strong&gt; from the &lt;em&gt;Developer Settings&lt;/em&gt;: give it both the &lt;code&gt;repo&lt;/code&gt; and the &lt;code&gt;user&lt;/code&gt; scopes, then save it in a secret called &lt;code&gt;GH_PAGES&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to GitHub Pages&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v6&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;24.x'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run deploy&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;CI&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GH_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re already familiar to GitHub Actions, you shouldn’t need more details. Without further parameters, &lt;strong&gt;you could put the last three commands together&lt;/strong&gt; in a single line: &lt;code&gt;angular-cli-ghpages&lt;/code&gt; will detect your Angular configuration automatically. Just make sure to use a recent version of the framework to avoid issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Pay Attention To
&lt;/h2&gt;

&lt;p&gt;Maybe the most difficult things here is generating the token. You will need to create a new one from &lt;strong&gt;your personal settings’ page&lt;/strong&gt;, then paste it as a &lt;code&gt;GH_TOKEN&lt;/code&gt; secret in the repository’s. Of course, you can give this latter the name you want, simply replacing the variable &lt;code&gt;secrets.GH_TOKEN&lt;/code&gt; you can see above accordingly.&lt;/p&gt;

&lt;p&gt;I also assumed that you know where to put a GitHub Actions’ configuration file. It must be placed in a &lt;code&gt;.github/workspaces&lt;/code&gt; folder on your repository’s root. Since it’s a YAML file, it should have a &lt;code&gt;.yml&lt;/code&gt; extension: mine is called &lt;code&gt;deploy.yml&lt;/code&gt;. It doesn’t really matter which &lt;code&gt;name&lt;/code&gt; you choose for it.&lt;/p&gt;

&lt;p&gt;I don’t really like the idea of having a &lt;code&gt;gh-pages&lt;/code&gt; branch. Is a legacy of the past: newer CD/CI solutions excluded it, but I think I can’t get rid of it as long as I use this third-party package. I hope &lt;strong&gt;I will find a better way soon&lt;/strong&gt;. Right know, it just works, and that’s all I wanted.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you’d like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;&lt;strong&gt;Bluesky&lt;/strong&gt;&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>github</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Why JSON Format Is No Longer Suitable for Generative AI and LLM Models</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Thu, 08 Jan 2026 13:21:20 +0000</pubDate>
      <link>https://forem.com/fedtti/why-json-format-is-no-longer-suitable-for-generative-ai-and-llm-models-2mk9</link>
      <guid>https://forem.com/fedtti/why-json-format-is-no-longer-suitable-for-generative-ai-and-llm-models-2mk9</guid>
      <description>&lt;p&gt;&lt;em&gt;The king is dead, long live the king! Years later, JSON is beginning to lose its appeal due to generative AI. The problem is that it costs too much: because tokens have revolutionized the way we think about IT investments. Thus, one of the most beloved structures of recent times has become a problem.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON From Riches to Rags
&lt;/h2&gt;

&lt;p&gt;Of course, JSON is not only used to provide and receive structured data to and from generative AI agents. Therefore, &lt;strong&gt;the characteristics and usefulness of the format remain unchanged&lt;/strong&gt; in all other cases. The problem with LLM models is cost, not usefulness: JSON is too verbose.&lt;/p&gt;

&lt;p&gt;In a world forced to redistribute investments from on-premise servers to the cloud to tokens, &lt;strong&gt;JSON is starting to become a problem&lt;/strong&gt;. The paradox is that, while IT is being developed to be increasingly closer to natural language, data structures are returning to being closer to machine code.&lt;/p&gt;

&lt;p&gt;One might wonder whether it would not be better to continue investing in programming languages managed by humans and designed to be closer to the functioning of machines than to the human brain. But the industry is &lt;strong&gt;moving in the opposite direction&lt;/strong&gt;, and it is advisable to adapt to new ways of writing code.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rise of Toon
&lt;/h3&gt;

&lt;p&gt;The JSON “case” has been a trending topic in recent months. It was on these very pages that I discovered Toon: &lt;a href="https://dev.to/sreeni5018/toon-vs-json-a-modern-data-format-showdown-2ooc"&gt;a sort of CSV on steroids&lt;/a&gt; that replaces JSON. A format that delivers exactly what I anticipated, namely reduced costs at the expense of reduced readability of the structure.&lt;/p&gt;

&lt;p&gt;Yes, because &lt;strong&gt;it essentially converts JSON objects into CSV-like structures&lt;/strong&gt; with custom headers that describe their content. Those who are used to working with Excel or some other form of structured data should not have any major problems deciphering its content, but compared to JSON, its readability is poor.&lt;/p&gt;

&lt;p&gt;Not all cases are suitable for the use of Toon. The official project repository on GitHub contains &lt;a href="https://github.com/toon-format/toon?tab=readme-ov-file#benchmarks" rel="noopener noreferrer"&gt;a series of benchmarks showing performance&lt;/a&gt; in the most common cases. Personally, I think I might opt to use this format in my implementations: but I haven’t tried the format below yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  MessagePack: The Outsider
&lt;/h3&gt;

&lt;p&gt;Here is another format that is emerging. If possible, compared to Toon, we are at an even higher level (or lower, depending on how you look at it). &lt;strong&gt;MessagePack has been around for over 13 years&lt;/strong&gt;, but only recently has it begun to achieve a certain degree of success with the general public, so to speak.&lt;/p&gt;

&lt;p&gt;Credit for LLM model prompts: MessagePack is “a binary serialization format” that supports input formatted in JSON or any other data structure such as arrays. It follows that, when discussing generative AI, &lt;strong&gt;it is proposed as a valid alternative&lt;/strong&gt; to JSON in dialogue with agents.&lt;/p&gt;

&lt;p&gt;I still have to try it, but it could become my favorite, being even more efficient than Toon: the problem is that &lt;strong&gt;it completely loses the readability&lt;/strong&gt; of the data. It is no coincidence that it was conceived years before the release of the GPT models. MessagePack goes in the opposite direction to natural language, converting information back into machine code.&lt;/p&gt;

&lt;h3&gt;
  
  
   Natural Language vs. Machine Code
&lt;/h3&gt;

&lt;p&gt;It is useful to ask ourselves a serious question. Considering that &lt;a href="https://dev.to/fedtti/why-markdown-is-the-de-facto-standard-for-prompt-engineering-3d2p"&gt;Markdown is the preferred format&lt;/a&gt; for writing prompts (and the only alternative seems to be XML), does it make sense to exchange data in machine code? I mean, it seems counterintuitive to me.&lt;/p&gt;

&lt;p&gt;Where I work, they would like to delegate some of the tasks assigned to developers to people who have never written a single line of code.  This is a ploy to &lt;strong&gt;reduce salaries and hire unskilled workers&lt;/strong&gt;, which has never been successful. How could these be efficient using formats such as Toon or MessagePack?&lt;/p&gt;

&lt;p&gt;At the very least, they should be provided with data encoding and decoding tools that work in the background, &lt;strong&gt;without requiring any interaction&lt;/strong&gt; on their part. This is a hypothesis that I can assure you has never worked in my company: all attempts have been returned to the developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Impossible Replacement
&lt;/h2&gt;

&lt;p&gt;OK, let’s assume that a format similar to CSV is understandable to most employees. In Italy, this is not the case, but let’s pretend it is! What about MessagePack? I don’t think a format like this can be given to &lt;strong&gt;people who don’t have technical training&lt;/strong&gt;. It is a failed substitution hypothesis.&lt;/p&gt;

&lt;p&gt;Of course, tomorrow generative AI will cost less, and therefore a format such as &lt;strong&gt;JSON will once again become attractive&lt;/strong&gt;. It could take decades, and I’m not convinced that LLM models will still work as they do today. But in the meantime? Let’s look at the job ads.&lt;/p&gt;

&lt;p&gt;Leaving aside those that require ten years of experience (remember that GPT was released in 2018), we still find job ads that require &lt;strong&gt;bachelor’s or master’s degrees in STEM&lt;/strong&gt; disciplines and knowledge of languages such as Python. I really don’t think our work will end in 2026, as many people say.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>How to Support Light and Dark Themes in PWA Using Only CSS</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Wed, 07 Jan 2026 16:43:02 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-support-light-and-dark-themes-in-pwa-using-only-css-6ca</link>
      <guid>https://forem.com/fedtti/how-to-support-light-and-dark-themes-in-pwa-using-only-css-6ca</guid>
      <description>&lt;p&gt;&lt;em&gt;Web applications now need to be displayed in two modes: light and dark. There is no way around it, and it must be up to the user to choose which one they prefer. There are several ways to offer this feature, but one in particular is within everyone’s reach. Here’s how to do it using only CSS.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s Impossible Not to Support Dark Mode
&lt;/h2&gt;

&lt;p&gt;Although my product colleagues disagree, today &lt;strong&gt;dark themes in web applications are just the tip of the iceberg&lt;/strong&gt; when it comes to basic UX features. Updated browsers do not need to implement major code changes. If they support the &lt;code&gt;light-dark()&lt;/code&gt; function, then a CSS change is sufficient.&lt;/p&gt;

&lt;p&gt;Otherwise, a more complex solution using JavaScript and other front-end development tools must be implemented. And I will do this too, as &lt;a href="https://dev.to/fedtti/how-to-provide-light-and-dark-theme-color-variants-in-pwa-1mml"&gt;I adopted a similar strategy for metadata&lt;/a&gt; some time ago. We are still talking about the same feature, namely the media &lt;code&gt;prefers-color-scheme&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This can only accept light and dark values. Thanks to the &lt;code&gt;light-dark()&lt;/code&gt; function in CSS, we can set variables that take on the correct values based on the users’ choice. The &lt;strong&gt;choice is not made for the individual app&lt;/strong&gt;, but for the entire operating system or for the browser in use.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Implement Dark Mode in CSS
&lt;/h3&gt;

&lt;p&gt;It doesn’t matter which framework you use, or if you don’t use one at all. The only precaution is to &lt;strong&gt;integrate the code below into the main CSS file&lt;/strong&gt;, accessible from any other secondary CSS file (if available). You could use a styled component with some adjustments, but I don’t recommend it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light-dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light-dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, you can use any variables you want instead of &lt;code&gt;--background&lt;/code&gt; and &lt;code&gt;--color&lt;/code&gt;, as long as you follow the same structure. The first value assigned to the &lt;code&gt;light-dark()&lt;/code&gt; function will be valid for the light theme, and the second for the dark theme. No other adjustments are necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Same Implementation for Older Browsers
&lt;/h3&gt;

&lt;p&gt;If the browser does not support the &lt;code&gt;light-dark()&lt;/code&gt; function but supports the &lt;code&gt;prefers-color-scheme&lt;/code&gt; media feature, then the same implementation can be used with a minor modification. If it does not support either of these, there is no point in continuing, because the code would have no effect.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same instructions apply to code positioning. Furthermore, whatever you choose, you can always integrate SCSS variables instead of color codes (I used &lt;code&gt;white&lt;/code&gt; and &lt;code&gt;black&lt;/code&gt; for brevity, but you can use any of the supported formats). In my case, I didn’t want to mix the two things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problems and Limitations of This Solution
&lt;/h3&gt;

&lt;p&gt;As I mentioned earlier, this solution does not allow the user to select a choice limited to the web application in use. I will also share how I set up this option, but that is a separate issue. The &lt;strong&gt;choice taken into consideration&lt;/strong&gt; is solely that of the system, whether it has been set at the operating system or browser level.&lt;/p&gt;

&lt;p&gt;For this reason, it is not possible to use this solution on older browsers. I mean, &lt;strong&gt;it will never work on any version of Internet Explorer&lt;/strong&gt;… and I know that some people still use it. In the fallback above, I didn’t set the light mode because it’s not necessary: just set the dark mode.&lt;/p&gt;

&lt;p&gt;In my daily experience, this approach is sufficient to provide full functionality: I don’t see the point of having the desktop in one mode, the browser in another, and individual applications in yet another. However, since &lt;strong&gt;users expect to be able to switch&lt;/strong&gt; from the app’s user interface, we will have to proceed differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of Frameworks in Supporting the Feature
&lt;/h2&gt;

&lt;p&gt;I am familiar with most existing frameworks because my job requires it, but if I could, I would avoid using them. However, in this case, &lt;strong&gt;any framework can help&lt;/strong&gt; add all the pieces that contribute to full dark theme support. Because it’s not just a matter of CSS, as we’ve already seen.&lt;/p&gt;

&lt;p&gt;In addition to the theme color set in the metadata, many &lt;strong&gt;users now also customize the icon&lt;/strong&gt; in their favorites and other logos that appear on the desktop. This operation is possible provided that JavaScript code is included that modifies the DOM based on the choices made.&lt;/p&gt;

&lt;p&gt;That’s why what I’ve proposed is not enough to meet all potential needs. My idea is to &lt;strong&gt;keep this CSS code as a basis&lt;/strong&gt; (and as a potential fallback). Then, use JavaScript to add the parts that relate to the specific choice for the individual application. Which I will also propose here as soon as possible.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why I Switched From VS Code to Antigravity (and I’m Not Going Back)</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Mon, 29 Dec 2025 17:17:57 +0000</pubDate>
      <link>https://forem.com/fedtti/why-i-switched-from-vs-code-to-antigravity-and-im-not-going-back-2ml2</link>
      <guid>https://forem.com/fedtti/why-i-switched-from-vs-code-to-antigravity-and-im-not-going-back-2ml2</guid>
      <description>&lt;p&gt;&lt;em&gt;I tried Antigravity and I don’t think I’ll go back. Maybe it’s because LLM models have improved so much in such a short time, or maybe it’s because Google has closed the gap with (and perhaps even surpassed) OpenAI. That’s why I replaced VS Code for developing my personal projects.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Programming With AI: A New Normal
&lt;/h2&gt;

&lt;p&gt;If you remember, my first post here was &lt;a href="https://dev.to/fedtti/why-i-disabled-github-copilot-inline-suggestions-on-vs-code-108b"&gt;about GitHub Copilot and its inline suggestions&lt;/a&gt; in VS Code. Shortly after mid-August, I disabled it because I was dissatisfied with how it worked. So why should I now prefer &lt;strong&gt;an IDE that offers the same service&lt;/strong&gt; as its main feature?&lt;/p&gt;

&lt;p&gt;Time flies, especially when it comes to information technology: it only took four months for me to change my mind. Actually, I have to say that Google simply &lt;strong&gt;implemented the changes I suggested&lt;/strong&gt; to GitHub. In fact, you can ignore the suggestions by pressing the &lt;code&gt;[esc]&lt;/code&gt; key. It wasn’t that hard after all!&lt;/p&gt;

&lt;p&gt;Not that anyone at Big G read them, of course, but &lt;a href="https://dev.to/googleai/where-were-going-we-dont-need-chatbots-introducing-the-antigravity-ide-2c3k"&gt;Gemini’s inline suggestions on Antigravity&lt;/a&gt; work pretty much as I had hypothesized. I must say that, compared to GPT, the results are better. I tried it with both JavaScript and Python, and I must admit that &lt;strong&gt;I received some useful suggestions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Issue of Extensions and Language
&lt;/h3&gt;

&lt;p&gt;As you should know, Antigravity (by the way, I hate the name) is a fork of VS Code and &lt;strong&gt;is compatible with a number of features&lt;/strong&gt; from Microsoft’s editor. However, it does not use the official registry of extensions: it uses one managed by the Eclipse Foundation called &lt;a href="https://open-vsx.org/" rel="noopener noreferrer"&gt;Open VSX Registry&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This does not necessarily mean that all extensions available for VS Code are also available for Antigravity. Although it is possible to import settings from the first editor to the second, for example, &lt;strong&gt;Italian localization is not included by default&lt;/strong&gt;, but must be installed separately as an unofficial extension.&lt;/p&gt;

&lt;p&gt;Many extensions are derived from the official ones, including language support, and you will generally find them with the prefix &lt;code&gt;ms-&lt;/code&gt; in the publisher name. I prefer to &lt;strong&gt;keep the number of extensions installed to a minimum&lt;/strong&gt;, but if you use them extensively, you may have to wait for them to become available.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Don’t Like and Would Change
&lt;/h3&gt;

&lt;p&gt;Among the many useful options, unfortunately, there is one that stands out as particularly annoying. Antigravity has the bad habit of &lt;strong&gt;automatically changing the indentation of the code&lt;/strong&gt;, even when the indentation written in the source code is the desired one. That’s not nice at all.&lt;/p&gt;

&lt;p&gt;Of course, you can disable this feature, but it’s not as easy as it should be. The automatic change is present in several menus, and to be sure you don’t get any surprises, &lt;strong&gt;you have to search through them all&lt;/strong&gt;, depending on how many extensions you have installed.&lt;/p&gt;

&lt;p&gt;This feature, which many may find useful, becomes a problem especially when you contribute to open source projects. It has already been pointed out to me that &lt;strong&gt;I modified the structure of some lines of code&lt;/strong&gt; written by someone else, without realizing it, just by opening the same file.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Like and Would Keep
&lt;/h3&gt;

&lt;p&gt;I don’t know if it’s thanks to the MCP server, the permissions I’ve granted locally, or both, but when I copy a block of text from GitHub, I find the same structure as an inline suggestion on Antigravity. This is &lt;strong&gt;particularly useful when writing documentation&lt;/strong&gt; — and I write it very often.&lt;/p&gt;

&lt;p&gt;The most innovative part concerns the &lt;em&gt;Agent&lt;/em&gt;, i.e., a tab on the right dedicated to interaction with generative AI. This allows you to chat in two modes: Planning and Fast. The first mode allows you to &lt;strong&gt;review changes before they are applied&lt;/strong&gt; to the sources, while the second mode proceeds directly to saving.&lt;/p&gt;

&lt;p&gt;Antigravity connects directly to your Google account, so you can share settings between different devices and &lt;strong&gt;take advantage of your paid plans&lt;/strong&gt;. In addition to Gemini, Claude Sonnet, Opus, and GPT-OSS are also supported. An integrated MCP Store allows you to use your credentials to access various services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thoughts on Google and Generative AI
&lt;/h2&gt;

&lt;p&gt;Google has gone all-in on generative artificial intelligence. Not that it was ever behind, mind you: before the advent of transformers, DeepMind was &lt;strong&gt;the benchmark for state-of-the-art technology&lt;/strong&gt;. Gemini and Gemma raise the bar for LLM models. I still need to get Nano Banana into focus.&lt;/p&gt;

&lt;p&gt;Antigravity is just the latest tool in a long line. Jules, Opal, etc. are still experiments, but &lt;strong&gt;they represent Google’s path&lt;/strong&gt; to just as many uses for generative AI. Creating an IDE from scratch would have been foolish when you could create a fork of VS Code, and Google made the best choice.&lt;/p&gt;

&lt;p&gt;I don’t like that they’ve further lowered the free tier limits on APIs, because trying out &lt;strong&gt;generative AI services involves higher costs&lt;/strong&gt; than traditional software. It must be said that the competition does not offer any free tier at all, so Google still has a better policy. It’s even better if you use Gemma locally.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Optimize Your Prompts by Using Shorter Synonyms With Google AI Studio</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Wed, 24 Dec 2025 20:02:49 +0000</pubDate>
      <link>https://forem.com/fedtti/optimize-your-prompts-by-using-shorter-synonyms-with-google-ai-studio-30lk</link>
      <guid>https://forem.com/fedtti/optimize-your-prompts-by-using-shorter-synonyms-with-google-ai-studio-30lk</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for &lt;a href="https://dev.to/deved/build-apps-with-google-ai-studio"&gt;DEV Education Track: Build Apps with Google AI Studio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The Italian language is wonderful, but it has one major flaw when &lt;strong&gt;it comes to generative artificial intelligence&lt;/strong&gt;: it is rich in synonyms. This is great for literature, but not for writing prompts, which should be concise. That’s why I decided to create an application that helps optimize the length of the words used.&lt;/p&gt;

&lt;p&gt;So I chose to create &lt;strong&gt;a simple app that finds synonyms for words&lt;/strong&gt; used in a prompt that are shorter in length, saving tokens. The result is a shorter prompt than the initial one, more suitable for importing into an agentic application: it is only a rough draft of a more complicated project.&lt;/p&gt;

&lt;p&gt;Below you can see &lt;strong&gt;the prompt I used to generate the initial structure&lt;/strong&gt; of my application. I didn’t use a structure designed to be sent to the model via API: I simply described in natural language what my app should have. I have never done vibe coding until now, and I don’t know if I will do it again in the future.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please, make an app that replaces words in given sentences with
shorter synonyms to save tokens while editing prompts: it must have
a text area for writing the prompt (supporting cut’n’paste and
drag’n’drop functionalities from existing text files) and a preview
area with the result.

The output should be downloadable as a file, use Markdown for it
and consider it could be imported in Python applications by third
parties; provide the option to interactively approve/reject
every single change.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small application uses &lt;a href="https://blog.google/products/gemini/gemini-3-flash/" rel="noopener noreferrer"&gt;Gemini 3 Flash&lt;/a&gt; to search for synonyms: my idea is to provide the same service without using LLM models, so that &lt;strong&gt;the only token consumption is for the final prompt&lt;/strong&gt;. It would not make sense to save on one prompt by using a second one. Do you agree?&lt;/p&gt;

&lt;p&gt;I only asked to &lt;strong&gt;support copy and paste functionality and drag and drop&lt;/strong&gt; of existing files. Anyway, as we will see, Google AI Studio has gone further: the LLM model even suggests rewriting entire parts of the initial prompt. This is an advantage of generative AI, but it was not required.&lt;/p&gt;

&lt;p&gt;In any case, Gemini has correctly included a review function that &lt;strong&gt;allows you to accept or reject the suggested changes&lt;/strong&gt;. In my demo, I chose to accept them all, and the result was more than satisfactory. However, I would like to point out that in this experiment I used English instead of Italian.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can access &lt;a href="https://ai.studio/apps/drive/1pNuOf71v4SAli1UFpnRY0dm-vEE5rqPv" rel="noopener noreferrer"&gt;the applet for my project&lt;/a&gt;. I didn’t deploy it because I would have had to enable billing — and I have no intention of doing so. You will need to log in to your Google account to open the link, but I have &lt;strong&gt;no idea what you will see&lt;/strong&gt; because I keep seeing the same mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyk14c1ze6ut53j0ooty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyk14c1ze6ut53j0ooty.png" alt="Prompt Shrinker" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can easily switch between the preview and the source code, but the permissions I have granted to guests are read-only. By testing the app with the same prompt that generated it, I managed to &lt;strong&gt;save 261 characters, improving efficiency by 52%&lt;/strong&gt;. You must consider that the application has gone beyond its intended purpose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build an app shortens text to save tokens while editing prompts: input
field to write down the prompt (with clipboard support and file
drag-drop) and result preview; exportable, use Markdown for it and
Python-compatible; interactive review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I had asked to simply replace individual words with their synonyms, if these were shorter, but &lt;strong&gt;the app replaced entire phrases&lt;/strong&gt;. This is certainly more efficient than I had requested, but it is only possible if an LLM model is used: in my long-term project, the latter will be excluded from the outset.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;p&gt;I really don’t understand why Google AI Studio chose to use React as the default framework for &lt;strong&gt;creating applications in vibe coding&lt;/strong&gt; mode. I mean, it would have made more sense to choose Angular, but I think it was done deliberately to follow the trends. That said…&lt;/p&gt;

&lt;p&gt;I was impressed that &lt;strong&gt;the app worked on the first try&lt;/strong&gt;. The prompt I used to generate it was not designed to be foolproof: even though I don’t do vibe coding, I know how I should direct the model to better suit my needs. I deliberately chose not to do so in order to approach the instrument as any novice would.&lt;/p&gt;

&lt;p&gt;I could have used caps lock to highlight the most important terms, given examples of folder structures, and even specified which libraries to use. But all I needed to do was &lt;strong&gt;describe at a high level what I wanted&lt;/strong&gt; in order to have a working MVP: this is very, very interesting.&lt;/p&gt;

&lt;p&gt;On the other hand, though, I noticed that the app does not implement a package manager. Although it separates components and services into different folders, &lt;strong&gt;dependencies are loaded directly into HTML&lt;/strong&gt; with one script for each. It’s not quite how I would expect to create an app with React.&lt;/p&gt;

&lt;p&gt;If that weren’t enough, the application uses Tailwind CSS, which I didn’t explicitly request. &lt;strong&gt;I guess I could just change the prompt to opt out&lt;/strong&gt;, but I would have preferred an opt-in rather than an opt-out. Compared to not using a package manager, it seems like a contradiction to me.&lt;/p&gt;

&lt;p&gt;Downloading the sources changes things, in the sense that the configuration files and &lt;code&gt;package.json&lt;/code&gt; for package manager support magically appear. There are still some HTML scripts that &lt;strong&gt;seem to load something on the front end&lt;/strong&gt; that we could do without, namely the dependencies mentioned above.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>deved</category>
      <category>learngoogleaistudio</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>How to Start an RDP Session From macOS With Windows App</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Tue, 23 Dec 2025 16:43:15 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-start-an-rdp-session-from-macos-with-windows-app-15io</link>
      <guid>https://forem.com/fedtti/how-to-start-an-rdp-session-from-macos-with-windows-app-15io</guid>
      <description>&lt;p&gt;&lt;em&gt;After a long time, I came across the RDP protocol again: I thought no one used it anymore. But instead, I discovered that it’s alive and well. Here’s how to use it from macOS, without spending a penny — yes, because there is also a paid version. It’s much quicker and easier than expected.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should I Use the RDP Protocol?
&lt;/h2&gt;

&lt;p&gt;You shouldn’t. Or rather, I know more reliable methods for &lt;strong&gt;communicating between operating systems&lt;/strong&gt; for the same reason, but recently I found myself unable to avoid it. I was taking a course (see &lt;em&gt;Workload Manager Validation for SQL Server&lt;/em&gt;) on Google Cloud Platform that required me to use it.&lt;/p&gt;

&lt;p&gt;Chrome for Windows natively supports the URL handler for the protocol, so you don’t need to download anything to use it. The problem arises &lt;strong&gt;if you use macOS or Linux&lt;/strong&gt;: do not confuse this feature with Chrome Remote Desktop, available on all operating systems, which uses a proprietary protocol to do the same thing.&lt;/p&gt;

&lt;p&gt;Apple provides a paid application on the Mac App Store that is sold in Italy for €89.99, but it does not support the RDP protocol. This is &lt;strong&gt;not the solution I will recommend you&lt;/strong&gt; use in this article. I almost fainted when I saw the price, fearing that it was the only possible solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Windows App From the Mac App Store
&lt;/h3&gt;

&lt;p&gt;Previously Microsoft Remote Desktop, Windows App is &lt;a href="https://apps.apple.com/us/app/windows-app/id1295203466" rel="noopener noreferrer"&gt;a free application&lt;/a&gt; that allows you to control your computer remotely. It includes a number of features, among which &lt;strong&gt;the graphical interface for the RDP protocol&lt;/strong&gt; stands out, representing the primary function of the application.&lt;/p&gt;

&lt;p&gt;The app recognizes files with the &lt;code&gt;.rdp&lt;/code&gt; extension that can be imported to obtain &lt;strong&gt;a preconfigured connection&lt;/strong&gt;. Typically, these configuration files load default credentials to which others can be added. In my case, I had to set a new password directly from GCP, because the instance was a virtual machine in the cloud.&lt;/p&gt;

&lt;p&gt;My use was related to GCP’s Compute Engine, so &lt;strong&gt;I connected to a virtual machine&lt;/strong&gt; instead of a physical computer. In any case, Windows App allows you to connect to any instance of the operating system, regardless of where it is installed. Let’s take a look at how to configure the application and use it wisely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure and Save Connection Settings
&lt;/h3&gt;

&lt;p&gt;Remote desktop connection requests are saved as connections: they can be to PCs or workstations. There are &lt;strong&gt;many ways to add a new connection&lt;/strong&gt;. In my case, I had no choice and had to opt for importing an &lt;code&gt;.rdp&lt;/code&gt; file. Once you have added a connection, you can also export it to an &lt;code&gt;.rdp&lt;/code&gt; file to add it elsewhere later.&lt;/p&gt;

&lt;p&gt;Otherwise, simply &lt;strong&gt;specify an IP address or hostname&lt;/strong&gt;. You must have a username and password for an account that already exists and is authorized in the system in order to establish a connection. Years ago, I used the RDP protocol to control my desktop remotely: it’s a different use case from SSH.&lt;/p&gt;

&lt;p&gt;It is no coincidence that &lt;strong&gt;we are using a graphical interface&lt;/strong&gt; that allows access to the common functions of the operating system. In the past, but I believe still today, the RDP protocol was used for remote customer support sessions. Not exactly something closely related to software development as we would expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run a Remote Session From Your Mac
&lt;/h3&gt;

&lt;p&gt;By default, the session opens in full screen mode: it’s not something I’m crazy about. I discovered that I could avoid this in the settings, where &lt;strong&gt;you can also specify the resolution&lt;/strong&gt; and color depth between 16 and 32 bits. Windows App also supports optimization for Retina Displays.&lt;/p&gt;

&lt;p&gt;Just like when we virtualize an operating system, we can choose to &lt;strong&gt;share devices that are physically connected&lt;/strong&gt; to the Mac with the remote connection. Options include the ability to share printers, smart cards, webcams, and microphones. The first two are selected by default.&lt;/p&gt;

&lt;p&gt;Two other interesting features concern file and folder sharing and clipboard sharing. I must admit, however, that &lt;strong&gt;running programs and command prompts remotely&lt;/strong&gt; is not very fast. Obviously, it also depends on my internet connection, but there must be a bottleneck somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RDP Protocol Is Not the Best Solution
&lt;/h2&gt;

&lt;p&gt;I know I’m repeating myself, but I wouldn’t use this solution if I didn’t have to. &lt;strong&gt;I wouldn’t use Windows&lt;/strong&gt; at all. However, contrary to what I would have expected, I was able to use the remote desktop with relative ease. I just had a few too many slowdowns that caused me to lose precious minutes.&lt;/p&gt;

&lt;p&gt;The workshop I was participating in was time-limited, and I was afraid I wouldn’t make it. Apart from that, without time limits, &lt;strong&gt;I would not have complained&lt;/strong&gt; about the response speed of the remote operating system. I’ve had worse problems with locally run applications.&lt;/p&gt;

&lt;p&gt;It’s more the concept that I don’t like. I mean, as a developer, it’s very rare that I need to access the graphical interface of a remote computer: &lt;strong&gt;working from SSH is more than enough&lt;/strong&gt; for me. This was just a fun exercise that I wanted to share. Maybe it will be more useful to you than it was to me.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>security</category>
      <category>software</category>
    </item>
    <item>
      <title>How to Manage Side Projects When You Have ADHD</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Wed, 17 Dec 2025 18:11:30 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-manage-side-projects-when-you-have-adhd-imb</link>
      <guid>https://forem.com/fedtti/how-to-manage-side-projects-when-you-have-adhd-imb</guid>
      <description>&lt;p&gt;&lt;em&gt;I was diagnosed with combined ADHD and high intellectual potential at the age of 40, about a month ago. Now I understand a lot more about myself, but I still have problems finalizing projects. Fortunately, not at work. My GitHub profile is more of a mess than a portfolio: and that’s a problem if you’re looking for a job.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Spoiler: It’s Impossible
&lt;/h2&gt;

&lt;p&gt;First of all, I want to emphasize that &lt;strong&gt;I received my diagnosis based on the DSM-IV&lt;/strong&gt; (the criteria are identical in the DSM-5, but that’s not the point) from a clinic accredited by the Italian national health system. I am not one of those people who self-diagnose ADHD. I’ve actually had ADHD since birth.&lt;/p&gt;

&lt;p&gt;I haven’t written anything in the last month because I’m working on finishing projects before the Christmas holidays and because &lt;strong&gt;I’m trying to continue my training&lt;/strong&gt;. But, while I have successfully completed everything at work, I cannot say the same about my side projects.&lt;/p&gt;

&lt;p&gt;So my GitHub profile is &lt;strong&gt;a list of projects that I started and never finished&lt;/strong&gt;, including my personal website, which I first published in 1998 and which has undergone numerous domain and hosting changes over the years. I doubt that receiving an official diagnosis will change anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  One Project at a Time
&lt;/h3&gt;

&lt;p&gt;Of course, the best way to accomplish what you plan is to &lt;strong&gt;proceed one step at a time&lt;/strong&gt;. We can say the same about side projects. But if you have ADHD, your mind does not conceive of the linearity of time. There are only two dimensions: “now” and “not now”. Can you understand what that means?&lt;/p&gt;

&lt;p&gt;In my mind, if I don’t do something now, I’ll never do it. Don’t get me wrong, on a rational level I know very well that there is no exclusive relationship between &lt;strong&gt;doing something now and not doing it anymore&lt;/strong&gt;. However, having ADHD, I feel a physical urge to immediately devote myself to something new.&lt;/p&gt;

&lt;p&gt;All this at the expense of what I was already doing. The concept of distraction in my neurodivergence is precisely this: &lt;strong&gt;I am not distracted because I am stupid&lt;/strong&gt;, I am distracted because something new and urgent demands my attention. Furthermore, high intellectual potential makes everything easier to assimilate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adopt an Agile Approach
&lt;/h3&gt;

&lt;p&gt;Honestly, I’ve never tried it. Not in that context, at least: I’ve worked with Agile/Scrum for a startup in the past, and my company is considering adopting the same methodology. Personally, &lt;strong&gt;I like the Pomodoro Technique&lt;/strong&gt;, not only because it was conceived by an Italian compatriot. It’s a matter of anxiety.&lt;/p&gt;

&lt;p&gt;My ADHD can be summed up as oscillating between two opposite poles, boredom and anxiety, which provoke each other. Therefore, combining precise planning of activities with frequent breaks within a defined time frame works well. &lt;strong&gt;I apply the same principle to all my daily activities&lt;/strong&gt;, no matter what they are.&lt;/p&gt;

&lt;p&gt;As far as I’m concerned, the intervals are shorter than Francesco Cirillo’s model: I simply get up every 15 minutes, drink a few sips of water, then return to my desk and pick up where I left off. My approach is less structured, which &lt;strong&gt;I integrate with other regular activities&lt;/strong&gt; such as meal times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take Advantage of Gamification
&lt;/h3&gt;

&lt;p&gt;It’s difficult to take advantage of this at work, but when it comes to side projects, &lt;strong&gt;it’s definitely a great incentive&lt;/strong&gt;. I really enjoy participating in challenges, completing training courses, etc. that involve recognition: preferably in the form of a prize. But it must be an immediate reward or, in any case, not exceed a two-week wait.&lt;/p&gt;

&lt;p&gt;I admit it, I like swags. Kind of like how I like prize contests. In the past, &lt;strong&gt;I did everything I could to get gadgets&lt;/strong&gt;: it seems to me that opportunities to obtain them have decreased recently. However, I believe that companies should encourage the use of their services by providing free devices to developers.&lt;/p&gt;

&lt;p&gt;I’m not necessarily referring to high-end devices. I have a company iPhone that I use as a hotspot or to receive annoying calls from work: &lt;strong&gt;I’m referring to prototyping boards&lt;/strong&gt;, for example. Tinkering with Arduino is a relaxing activity that I should do more often, and it motivates me to finish a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t Overlook the Concept of MVP
&lt;/h2&gt;

&lt;p&gt;Minimum Viable Product (MVP) is &lt;strong&gt;a concept you should keep in mind&lt;/strong&gt;, especially if you have ADHD. I am a perfectionist, so I tend not to release anything into production unless it is 100% complete, but there is no upselling for side projects, so it doesn’t make sense. Do you agree?&lt;/p&gt;

&lt;p&gt;I mean, when it comes to work, you probably also have micro-tasks and epic milestones that guide development. When it comes to personal projects, however, &lt;strong&gt;there are no timelines to meet&lt;/strong&gt;: just publish them when you’re ready. Technically, you are not even obligated to publish anything.&lt;/p&gt;

&lt;p&gt;An MVP is the perfect compromise, in my opinion, for considering a side project “complete.” &lt;strong&gt;I will always have some refactoring in mind&lt;/strong&gt;, so there is no point in waiting to have a finished product. It is precisely the ability to “finish” that is impossible for someone with ADHD. In my case, it’s even terrifying.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>AI Agents: From Zero to Hero in 5-Days With Kaggle and Google</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Sun, 16 Nov 2025 19:48:17 +0000</pubDate>
      <link>https://forem.com/fedtti/ai-agents-from-zero-to-hero-in-5-days-with-kaggle-and-google-4ibk</link>
      <guid>https://forem.com/fedtti/ai-agents-from-zero-to-hero-in-5-days-with-kaggle-and-google-4ibk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/googlekagglechallenge"&gt;Google AI Agents Writing Challenge&lt;/a&gt;: Learning Reflections&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I already knew about the possibility of &lt;strong&gt;using multiple AI agents&lt;/strong&gt; to design complex workflows: my company is building one right now — and I’m partially involved in the development process. But I had never tried Google’s Agent Development Kit (ADK) before. Here’s what my 5-days journey with Kaggle was like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents Intensive
&lt;/h2&gt;

&lt;p&gt;I have no doubt that the most interesting part of the course was the white papers. Despite only lasting five days, they will give me the opportunity to &lt;strong&gt;delve deeper into all the topics covered&lt;/strong&gt; in the coming weeks or even months. References may require even more. Will I have time to read them all?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.kaggle.com/code" rel="noopener noreferrer"&gt;Kaggle Notebooks&lt;/a&gt;, which I already knew, were an excellent laboratory for putting into practice what I had learned: obviously the first thing I did was &lt;strong&gt;install the ADK locally&lt;/strong&gt;. So, having a free Google AI Studio API key, I did some testing from the terminal emulator using Gemini.&lt;/p&gt;

&lt;p&gt;On that note, I think I’ll stick with a local copy of &lt;a href="https://deepmind.google/models/gemma/gemma-3/" rel="noopener noreferrer"&gt;Gemma 3&lt;/a&gt; in the future, as I have no intention of subscribing to a paid plan. This is because my use is exclusively educational, as &lt;strong&gt;I’m an employee&lt;/strong&gt;. Not because I don’t think the service is valuable: but I can’t afford it right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1 • Introduction to Agents
&lt;/h3&gt;

&lt;p&gt;I used to think of agentic AI in the singular. I don’t think this is just a problem for my company, but just as DevOps is concerned with &lt;strong&gt;optimizing cloud computing costs&lt;/strong&gt;, so we have been asked to do with AI. So, as it has been from 2018 to today, I had never considered the idea of ​​integrating multiple agents into the same flow.&lt;/p&gt;

&lt;p&gt;Technology is evolving: just consider the move from the Completion to the Responses API for ChatGPT. The introduction of the &lt;code&gt;prompt&lt;/code&gt; object reduces the cost of system prompts, yet many have not adapted to the new infrastructure to date. Google’s solution goes &lt;strong&gt;exactly in this direction&lt;/strong&gt;: optimization and efficiency.&lt;/p&gt;

&lt;p&gt;Among other things, during this study day I learned above all how to &lt;strong&gt;use agents sequentially or in parallel&lt;/strong&gt;. Additionally, I figured out how to use one agent to judge another or orchestrate a group of them. I didn’t think that, regardless of the tool used, it could be so useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 2 • Agent Tools &amp;amp; Interoperability with Model Context Protocol (MCP)
&lt;/h3&gt;

&lt;p&gt;This was a slightly different day than the others, as it wasn’t focused on using multiple agents. In fact, not even &lt;strong&gt;the final project&lt;/strong&gt; requires using more than one, but out of five days, that was the standard practice for at least four. Here we took a step back, returning to talk about tools and MCPs.&lt;/p&gt;

&lt;p&gt;Tools are the reason why I reevaluated the adoption of LLM models in the company. In essence, thanks to them we are able to &lt;strong&gt;fill the gap that agents have&lt;/strong&gt;: knowledge of the present and the future. More or less advanced, models are trained on knowledge bases established at the time they are developed.&lt;/p&gt;

&lt;p&gt;You can’t ask ChatGPT what the weather will be like tomorrow like you can with Alexa, because &lt;strong&gt;it simply can’t know&lt;/strong&gt;. Tools allow agents to query external, up-to-date and predictive sources to the model. The MCP protocol is a connector that allows agents to query third-party tools for the same purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 3 • Context Engineering: Sessions &amp;amp; Memory
&lt;/h3&gt;

&lt;p&gt;Agents have no memory. This is a problem for two reasons: first, economic, and second, functional. Economically, as I mentioned when switching from Completion to Responses APIs, this means that &lt;strong&gt;the entire history of a conversation&lt;/strong&gt; needs to be submitted to the agent each time. A waste of tokens.&lt;/p&gt;

&lt;p&gt;The functional problem is the same. Without history, or context, an agent can’t go beyond the single request it receives. Try thinking about pronouns: if you start a sentence with a pronoun, but the person you’re talking to &lt;strong&gt;doesn’t know the previous sentence&lt;/strong&gt;, what you’re saying makes no sense.&lt;/p&gt;

&lt;p&gt;Therefore, Google’s ADK offers two different ways to manage agent memory: one based on a single session and one based on an external database. This solution allows you to save tokens and &lt;strong&gt;offer agents a context&lt;/strong&gt; that is not provided by default. In customer care it’s crucial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 4 • Agent Quality
&lt;/h3&gt;

&lt;p&gt;Test-Driven Development (TDD) should guide any development. It doesn’t. It’s well known that automated testing is &lt;strong&gt;the least of developers’ worries&lt;/strong&gt; — I envy anyone who thinks otherwise. It will probably be the same with agents, but the solutions proposed by Google are still more than satisfactory.&lt;/p&gt;

&lt;p&gt;It’s not just a matter of testing. Ensuring the quality of responses also means submitting the solution proposed by an agent to a review: and here we &lt;strong&gt;go back to day one&lt;/strong&gt;. The needs are many, but we can reduce them to two. Quality assurance and error debugging.&lt;/p&gt;

&lt;p&gt;Nothing different from what we would do with traditional software development. Languages ​​and environments change, but not the paradigm. There are numerous configurations of agents, models, etc., but the way to &lt;strong&gt;subject them to quality testing&lt;/strong&gt; is always the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 5 • Prototype to Production
&lt;/h3&gt;

&lt;p&gt;The first thing you should think about is CI/CD. It doesn’t matter what the programming language, framework, or development environment. The same goes for agents. So far, I’ve assumed &lt;strong&gt;we’re talking about Python&lt;/strong&gt;, but Google has made the ADK accessible for use with Go and Java as well.&lt;/p&gt;

&lt;p&gt;Everything I’ve talked about so far applies to the &lt;a href="https://a2a-protocol.org/" rel="noopener noreferrer"&gt;Agent2Agent (A2A) Protocol&lt;/a&gt;. An ecosystem that allows tools and agents to communicate with each other, regardless of the model used and the domain in which &lt;strong&gt;they were instantiated&lt;/strong&gt;. A kind of MCP for agents: instead of retrieving information and tools for users, it does it for them.&lt;/p&gt;

&lt;p&gt;This brings us to the concept of AgentOps. Sooner or later, going back to day one, we’ll have &lt;strong&gt;agents that update themselves&lt;/strong&gt;. Until then, deployment operations will require human intervention: this means that specialized process management professionals will be needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capstone Project
&lt;/h2&gt;

&lt;p&gt;This is completely optional, but I decided to participate because, being ADHD, it gives me the opportunity to &lt;strong&gt;focus on a project&lt;/strong&gt; for the next sixteen days. Honestly, I don’t care about finishing in the top three. I just need to be able to create something from start to finish.&lt;/p&gt;

&lt;p&gt;I could choose between four different categories: I opted for &lt;em&gt;Enterprise Agents&lt;/em&gt;, because at my age I really struggle not to &lt;strong&gt;think about business opportunities&lt;/strong&gt; when I’m developing something. I work for a company that specializes in customer service, and it’s the industry I know best.&lt;/p&gt;

&lt;p&gt;Well, to be honest, it would be more intriguing to throw myself into something different than usual, but &lt;strong&gt;I have limited time&lt;/strong&gt; and for once I want to get something done. I have several options and I need to commit to the most useful one. I think I’ve already identified which one it is, but I’ll let you know when I’m done.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>agents</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>How to Onboard a New Team Member in a Tech Company the Right Way</title>
      <dc:creator>Federico Moretti</dc:creator>
      <pubDate>Mon, 03 Nov 2025 18:36:35 +0000</pubDate>
      <link>https://forem.com/fedtti/how-to-onboard-a-new-team-member-in-a-tech-company-the-right-way-i5h</link>
      <guid>https://forem.com/fedtti/how-to-onboard-a-new-team-member-in-a-tech-company-the-right-way-i5h</guid>
      <description>&lt;p&gt;&lt;em&gt;I’m coming out: I’m a terrible trainer. Or rather, I think I would need to devote all my time to it in order to do it well. Otherwise, I can only achieve poor results for the learner. That’s why &lt;strong&gt;I want to draw up some guidelines&lt;/strong&gt; that you might find useful. The first rule is never falling in love with your study method.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  All People Are Different
&lt;/h2&gt;

&lt;p&gt;I know it’s trivial, but truly accepting that we are all different is not at all obvious. I’m probably neurodivergent and have &lt;strong&gt;suffered from this problem for years&lt;/strong&gt;, but that doesn’t mean I haven’t behaved the same way towards others. What applies to me doesn’t necessarily apply to others.&lt;/p&gt;

&lt;p&gt;This means that, even though I tend to be independent in my learning process, others may have different needs. I think &lt;strong&gt;I failed with the last colleague who joined&lt;/strong&gt; my team, even though I wasn’t responsible for him, because I applied what would have worked for me. I don’t want to repeat myself.&lt;/p&gt;

&lt;p&gt;I’m not a trainer by profession. I occasionally have to train new employees, but I have no formal training as an educator, so what I do is &lt;strong&gt;showing them how things work&lt;/strong&gt;. And even that is wrong, because it should be done by a professional: being the son of a middle school teacher does not help.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document All the Code You Write
&lt;/h3&gt;

&lt;p&gt;Even if it seems silly, it must become a mantra: &lt;strong&gt;document all the code you write&lt;/strong&gt;. The only reason you would not do so is if you have already resigned: it’s not professional, but I can understand why. In all other cases, you have no excuse and should consider it part of the job.&lt;/p&gt;

&lt;p&gt;Neither project managers nor the sales department will like it, but writing documentation &lt;strong&gt;should be included in your estimates&lt;/strong&gt;. You are a developer, and the quality of your work also depends on the quality of the documentation you produce. If you do it quickly and poorly, you are not a good developer.&lt;/p&gt;

&lt;p&gt;Why would being a good developer have anything to do with onboarding a new colleague? Simple, if you’re not, everything will go wrong. You can’t &lt;strong&gt;teach someone else what you don’t do&lt;/strong&gt; yourself. So, becoming a better professional helps you be a better teacher as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Clear Guidelines (and Follow Them)
&lt;/h3&gt;

&lt;p&gt;Big companies already have their rules, or at least they should. This is not always the case, and problems may arise in &lt;strong&gt;the case of corporate mergers&lt;/strong&gt;. For example, a new company in the group was using Mercurial. We’ve always used Git here, but in the past, they switched from Bitbucket to GitHub.&lt;/p&gt;

&lt;p&gt;The merger was also an opportunity to &lt;a href="https://dev.to/fedtti/how-to-test-github-actions-locally-without-third-party-tools-4mka"&gt;review the tools used for CI/CD&lt;/a&gt;. Specifically, we moved from Lerna to GitHub Actions: the key, in my opinion, is to &lt;strong&gt;maintain a consistent ecosystem&lt;/strong&gt;. It makes no sense to use tools that belong to different suites, often competing on the market.&lt;/p&gt;

&lt;p&gt;Of course, this doesn’t just apply to DVCS. The choice between Amazon Web Services, Microsoft Azure, and Google Cloud Platform should also be consistent. To be completely honest, I would choose &lt;strong&gt;a business email provider&lt;/strong&gt; with the same logic. I don’t see the point, for example, in having Microsoft Teams and using Zoom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provide Tools to Stay on Track
&lt;/h3&gt;

&lt;p&gt;Many, if not all, development teams typically equip themselves with tools, such as IDE extensions, to &lt;strong&gt;normalize their code&lt;/strong&gt;. Ours has never done that, and it’s something we’re trying to change, but it’s not that simple. Especially when team members come from different companies.&lt;/p&gt;

&lt;p&gt;My boss has an IntelliJ IDEA license, while &lt;a href="https://dev.to/fedtti/why-github-copilot-and-jsdoc-are-a-dynamic-duo-on-vs-code-4dbk"&gt;I use Visual Studio Code&lt;/a&gt; like most of my colleagues. The newest member, however, has a laptop with Ubuntu, and &lt;strong&gt;we’re on MacBooks with macOS&lt;/strong&gt;. I still haven’t figured out what the next company computer setup will be, and that’s a bad thing.&lt;/p&gt;

&lt;p&gt;However, when speaking of tools, &lt;strong&gt;I am referring rather to linters&lt;/strong&gt; and extensions for more or less automatically producing inline documentation of the code. Here too, very often everyone uses what they prefer. I think this is also an area that needs improvement, because in the long run it can become a problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transform Best Practices Into Imperatives
&lt;/h3&gt;

&lt;p&gt;Last but not least, best practices shouldn’t just stay that way: &lt;a href="https://dev.to/fedtti/why-using-emojis-in-logs-and-status-messages-is-a-good-idea-1bac"&gt;they should become a must&lt;/a&gt;. We need to take everything that has proven positive, document it, and make it mandatory. There should be &lt;strong&gt;no room for “creativity”&lt;/strong&gt; unless there is a discussion and a finding that an alternative is better.&lt;/p&gt;

&lt;p&gt;It’s right to propose new ideas, but not when these involve a disadvantage. There is also the opposite problem, which is making &lt;strong&gt;the mistake of falling in love&lt;/strong&gt; with what you think is right for you. You may be handling a situation poorly and not even realize it. You have to find the right balance.&lt;/p&gt;

&lt;p&gt;It happened to me with vibe coding. I would never have wanted to adopt it in my company, but, within certain limits, it can be helpful. The important thing is not to make it &lt;strong&gt;the first solution to problems&lt;/strong&gt;, because the risk is that productivity will worsen. I’ll let you know how it goes.&lt;/p&gt;




&lt;p&gt;You won’t believe it, but where I work, people do things in Python that have already been done in JavaScript, and vice versa. It’s &lt;strong&gt;just a challenge&lt;/strong&gt; to see who can do it better. But we are talking about product development teams that should not be antagonistic. I find it quite childish.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;If you like, follow me on &lt;a href="https://bsky.app/profile/fedtti.bsky.social" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and/or &lt;a href="https://github.com/fedtti" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for more contents. I enjoy networking.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
