<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Javier Rodeiro, AI &amp; Analytics Developer</title><description>Articles by Javier Rodeiro on analytics, AI agents and MCP, and the Puppets &amp; Scripts newsletter.</description><link>https://javierrodeiro.com/</link><language>en</language><item><title>OmniZenit: the analytics debugger nobody asked me to build</title><link>https://javierrodeiro.com/blog/omnizenit-the-analytics-debugger-i-built-on-my-own/</link><guid isPermaLink="true">https://javierrodeiro.com/blog/omnizenit-the-analytics-debugger-i-built-on-my-own/</guid><description>A product case study of a Chrome extension I started on my own to check analytics events for one Inditex brand, and how it became the debugger used across the group.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OmniZenit is a Chrome extension that shows, validates and explains the analytics events a page sends to Zenit, Inditex’s in-house analytics tool. Nobody asked for it. I started it in June 2025 because checking events by hand was the slowest part of my job, and I ran it as a product until I left in February 2026: one owner, real users, releases, and features I decided not to ship.&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;
&lt;p&gt;I was working at Ayesa as a digital data analyst for PULL&amp;amp;BEAR. Every release meant confirming that the site still sent the right events with the right fields. The only instrument was the browser’s network tab: find the request, expand the payload, and compare it against the specification by eye.&lt;/p&gt;
&lt;p&gt;That works for one event. It does not work for a checkout flow, on several markets, the day before a release. Mistakes were found late, and reporting one meant pasting raw JSON into a ticket and explaining where to look.&lt;/p&gt;
&lt;h2 id=&quot;who-it-is-for&quot;&gt;Who it is for&lt;/h2&gt;
&lt;p&gt;The market is small and I know it by name: the digital analysts who implement and check analytics on the group’s sites. That shaped every decision. A tool for one team of specialists does not need onboarding flows or a landing page. It needs to be correct, to be fast, and to be in the place where they already work, which is Chrome DevTools.&lt;/p&gt;
&lt;h2 id=&quot;what-it-does&quot;&gt;What it does&lt;/h2&gt;
&lt;p&gt;OmniZenit adds a panel to DevTools. While you browse, it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lists every event as it is sent&lt;/strong&gt;, grouped into readable sections instead of raw JSON.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validates each event against the specification&lt;/strong&gt; and marks what is missing or wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suggests the fix&lt;/strong&gt;, so the person reading the error does not need to know the specification by heart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compares two events side by side&lt;/strong&gt;, to see what changed between two pages or two releases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Records a journey&lt;/strong&gt;, so a sequence of steps can be replayed and checked again later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exports&lt;/strong&gt; an event as JSON or as a full screenshot, ready to attach to a ticket.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs in the browser of whoever is testing. There is nothing to deploy and nothing to ask for.&lt;/p&gt;
&lt;h2 id=&quot;how-it-grew&quot;&gt;How it grew&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;June 2025.&lt;/strong&gt; First commit. It only understood PULL&amp;amp;BEAR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;August 2025.&lt;/strong&gt; Version 1.4.0, the first release labelled official: copy and paste of events, and the side-by-side comparator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;November 2025.&lt;/strong&gt; Journey recording and a tab that shows how a visit is attributed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;December 2025.&lt;/strong&gt; A redesign, and a report extractor for Power BI and Looker Studio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;January 2026.&lt;/strong&gt; Full-payload screenshots and validation errors that come with the suggested fix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Analysts from other brands started asking for it, and each brand had its own domains and small differences. I rewrote the detection so one extension covers all eight brands of the group.&lt;/p&gt;
&lt;h2 id=&quot;four-product-decisions&quot;&gt;Four product decisions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Distribution is a feature.&lt;/strong&gt; The first versions were a zip file that each person loaded by hand, which meant most people ran an old version. I moved it to the Chrome Web Store as an unlisted extension: it does not appear in search, anyone with the link installs it in one click, and updates arrive on their own. Adoption stopped depending on me sending files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I cut the feature I liked most.&lt;/strong&gt; I built an assistant on Chrome’s built-in AI model to explain events in plain language. It worked on my machine. It also required a browser flag, about 22 GB of free disk for the model download and a recent laptop. On corporate hardware that is a barrier almost nobody would cross, so I hid it instead of shipping something most users could not turn on. I archived the code for the day the requirements drop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features came from conversations, not from a roadmap.&lt;/strong&gt; I asked the people using it what slowed them down, and they started asking me: could it do this, would that be possible. Each request got an honest answer about whether it was viable, and the ones that were went into the next release. If I could not name the person a feature was for, I did not build it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No noise.&lt;/strong&gt; There was no project, no budget and no meeting to approve it. The need was obvious, so I built it on my own, kept it out of everyone’s way, and let it be judged by whether people installed it.&lt;/p&gt;
&lt;h2 id=&quot;adoption&quot;&gt;Adoption&lt;/h2&gt;
&lt;p&gt;While I ran it, OmniZenit reached 19 weekly users. Its only users are the group’s digital analysts, so that figure is measured against one team, not against a market: most of the team opened it every week.&lt;/p&gt;
&lt;p&gt;It also outgrew me. Before I left, dedicated teams had joined in to refine the extension. What one analyst built alone to cover an obvious gap became the seed of a tool that dedicated teams took on.&lt;/p&gt;
&lt;h2 id=&quot;what-changed&quot;&gt;What changed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Validation happens while testing&lt;/strong&gt;, not after the data is already in a report.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every analyst looks at the same panel&lt;/strong&gt;, so a bug report is a screenshot instead of an argument about a payload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New people are productive sooner&lt;/strong&gt;, because the tool carries the specification for them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One tool for every brand&lt;/strong&gt;, instead of each team keeping its own checklist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-i-took-from-it&quot;&gt;What I took from it&lt;/h2&gt;
&lt;p&gt;Start with a problem you have every week; you are the first user and the first tester. Treat installation and updates as part of the product, because a tool nobody can update is a tool nobody trusts. And count the cost of a feature for the user with the worst laptop, not for yourself.&lt;/p&gt;
&lt;p&gt;The code is internal to Inditex and stays private.&lt;/p&gt;
</content:encoded></item><item><title>How I Built an AI-Native Software for my Macro Pad</title><link>https://javierrodeiro.com/blog/how-i-built-an-ai-native-software-for-my-macro-pad/</link><guid isPermaLink="true">https://javierrodeiro.com/blog/how-i-built-an-ai-native-software-for-my-macro-pad/</guid><description>How I built the software for my AJAZZ macro pad by having four AI assistants work on it at the same time, with a CLI and an MCP server on top.</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;!-- embed: https://www.linkedin.com/embeds/publishingEmbed.html?articleId=8535840351309141098&amp;li_theme=light --&gt;
&lt;p&gt;Last week, I needed a software tool for my AJAZZ macro pad, a little device that lets me customize keyboard shortcuts or macros. Instead of sitting down to code it myself (not even tried, of course 😅), I decided to try something different: I had four AI assistants work on it together at the same time. Here is how it went in plain language.&lt;/p&gt;
&lt;h2 id=&quot;why-i-tried-working-with-multiple-ais&quot;&gt;Why I Tried Working With Multiple AIs&lt;/h2&gt;
&lt;p&gt;I have been a data analyst for years, so I am used to create problems where there are not any until I dig in. But coding solo with a simple single AI can feel slow, especially when you hit a tricky technical detail. I wondered: what if I could have different AI helpers tackle different pieces simultaneously? Not to replace my judgment, but to see if their combined speed could beat my solo pace. For a small side project like this, it was worth a try.&lt;/p&gt;
&lt;h2 id=&quot;my-ai-team-and-their-roles&quot;&gt;My AI Team and Their Roles&lt;/h2&gt;
&lt;p&gt;I did not just give them the same task. I assigned each a clear role based on what they are known for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; wrote the main Python code, which is the part that makes the macro pad talk to my computer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windsurf&lt;/strong&gt; reviewed Claude’s code for mistakes, security risks, or overly complex parts. It was in charge of leveraging the project’s Pydantic models and Ruff configuration to ensure code quality and type safety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lovable&lt;/strong&gt; built the project website and the first steps demonstration. They offered a free trial for a day, so I used it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perplexity&lt;/strong&gt; researched technical details, like how the macro pad actually communicates with the computer or what similar tools exist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-the-workflow-actually-felt-like&quot;&gt;What the Workflow Actually Felt Like&lt;/h2&gt;
&lt;p&gt;Instead of waiting for one AI to finish before starting with the next, I gave them overlapping tasks. It felt less like relay racing and more like having a group conversation where everyone chimes in with their specialty.&lt;/p&gt;
&lt;p&gt;Here is a real example from the morning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I told Claude, “Start coding the part that detects when I plug in the macro pad.”&lt;/li&gt;
&lt;li&gt;At the same time, I asked Perplexity, “Look up the exact technical specs for how AJAZZ macro pads send signals.”&lt;/li&gt;
&lt;li&gt;When Perplexity sent back the protocol details, I immediately said to Claude, “Use this info to finish the detection code.”&lt;/li&gt;
&lt;li&gt;While Claude was implementing that, I had Windsurf review his early code for any red flags.&lt;/li&gt;
&lt;li&gt;Lovable was simultaneously building the website, so when Claude added a new feature like generating icons with AI, I told Lovable to showcase it, and Perplexity helped condensing all the job done into brief, clear content for the website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This meant no waiting. If Perplexity found a better way to do something at 10 AM, Claude could try it by 11 AM. If Windsurf spotted a confusing error message at 2 PM, Lovable could update the website instructions before I went for some water.&lt;/p&gt;
&lt;h2 id=&quot;one-example-making-it-work-with-wsl2&quot;&gt;One Example: Making It Work With WSL2&lt;/h2&gt;
&lt;p&gt;A tricky part was getting the tool to work if you are using WSL2 (Windows Subsystem for Linux), a way to run Linux tools inside Windows. Normally, this involves fiddling with USB settings, which frustrates a lot of users.&lt;/p&gt;
&lt;p&gt;Here is how the team handled it, step by step:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perplexity&lt;/strong&gt; found Microsoft’s official tool for sharing USB devices, usbipd, and noted where people usually get stuck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt; wrote the exact PowerShell commands needed to make the macro pad visible to WSL2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windsurf&lt;/strong&gt; suggested adding clear error messages if the USB sharing fails so users are not left guessing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lovable&lt;/strong&gt; turned those steps into simple instructions with terminal animations reflecting the user journey.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result was a feature that actually works smoothly because several different AI eyes looked at it from different angles.&lt;/p&gt;
&lt;h2 id=&quot;how-mcp-and-cli-work-together-making-it-ridiculously-easy&quot;&gt;How MCP and CLI Work Together: Making It Ridiculously Easy&lt;/h2&gt;
&lt;p&gt;The magic happens when you combine the CLI with MCP. Here is how they make managing your macro pad effortless:&lt;/p&gt;
&lt;p&gt;From Your Terminal (CLI)&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Add a new button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ajazz&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; button&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --label&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Terminal&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --command&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;xterm&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Generate an AI icon for it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ajazz&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --generate&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;terminal command line icon&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See all your buttons&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ajazz&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; button&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;From Claude Code (MCP)&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Claude Code can do the same thing programmatically&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button(button_id=1, label=&quot;Terminal&quot;, command=&quot;xterm&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button_image_from_prompt(button_id=1, prompt=&quot;terminal command line icon&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-real-power-both-work-together&quot;&gt;The Real Power: Both Work Together&lt;/h2&gt;
&lt;p&gt;When you use the CLI, your changes are saved to buttons.yaml and the daemon picks them up automatically. When you use Claude Code with MCP, it is the same thing but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster for bulk changes:&lt;/strong&gt; “Add 5 buttons for these tools”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perfect for automation:&lt;/strong&gt; “Set up buttons based on my project structure”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI powered:&lt;/strong&gt; “Generate icons that match what each button does”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;example-setting-up-development-environment&quot;&gt;Example: Setting Up Development Environment&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CLI approach:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz button set 1 --label &quot;VS Code&quot; --command &quot;code&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz button set 2 --label &quot;Terminal&quot; --command &quot;xterm&quot; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz button set 3 --label &quot;Browser&quot; --command &quot;firefox&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz image set 1 --generate &quot;code editor icon blue&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz image set 2 --generate &quot;terminal black and green&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ajazz image set 3 --generate &quot;firefox orange fox&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MCP approach:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Claude Code can read your project structure and set up buttons automatically&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button(1, &quot;VS Code&quot;, &quot;code&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button(2, &quot;Terminal&quot;, &quot;xterm&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button(3, &quot;Browser&quot;, &quot;firefox&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button_image_from_prompt(1, &quot;code editor icon blue&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button_image_from_prompt(2, &quot;terminal black and green&quot;) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;set_button_image_from_prompt(3, &quot;firefox orange fox&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Claude Code terminal calling the ajazz-deck MCP tools set_button and set_button_image_from_prompt to create button 11, a clock.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/how-i-built-an-ai-native-software-for-my-macro-pad-1.png&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Demonstration of AJAZZ-DECK custom MCP&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLI&lt;/strong&gt;: Perfect for quick changes, testing, and manual setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt;: Perfect for AI agents to configure, automate, and integrate with your workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Both&lt;/strong&gt;: Use the same configuration file (buttons.yaml) so they never conflict.&lt;/p&gt;
&lt;p&gt;You can switch between them anytime. Use CLI when you want quick manual control, use Claude Code when you want AI powered automation. It is not one or the other; it is both working together to make managing your macro pad ridiculously easy.&lt;/p&gt;
&lt;h2 id=&quot;then-what-i-actually-did-my-human-role&quot;&gt;…Then, What I Actually Did?: My Human Role&lt;/h2&gt;
&lt;p&gt;I was not writing code; I was the connector and translator. My job was to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep everyone on the same page, telling Claude what Perplexity found or what Lovable promised on the website.&lt;/li&gt;
&lt;li&gt;Turn Windsurf’s warnings into specific fixes for Claude to make.&lt;/li&gt;
&lt;li&gt;Step in when the AIs talked past each other, which happened more than I would like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It felt less like coding and more like making sure the conversation between the AIs did not go off the rails.&lt;/p&gt;
&lt;h2 id=&quot;the-outcome&quot;&gt;The Outcome&lt;/h2&gt;
&lt;p&gt;What should have taken me a weekend of solo work got done in a single afternoon. More importantly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windsurf caught a silly yet complex oversight in Claude’s early code that I would have missed completely.&lt;/li&gt;
&lt;li&gt;Perplexity’s research made us simplify the setup process.&lt;/li&gt;
&lt;li&gt;Having Windsurf build the documentation and testing in parallel meant the documentation evolved with the code, not weeks after. Also, I followed the approach of having two CHANGELOG files: one for the public, and an internal one for AI agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-tendency-in-2026&quot;&gt;The Tendency in 2026&lt;/h2&gt;
&lt;p&gt;Using multiple AI tools like this is not experimental anymore; it is becoming standard for side projects and prototypes. What is striking is how specialized they have become:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AIs that write code&lt;/strong&gt; like Claude are getting better at overall structure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Research AIs&lt;/strong&gt; like Perplexity surface niche technical documentation incredibly fast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website builders&lt;/strong&gt; like Lovable makes everyone able to create website stupidly easy (at least, for small projects like this).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic IDEs&lt;/strong&gt; like Windsurf act as the bridge between CLI agents and the IDE itself, but also AI powered.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But crucially, building CLI systems and MCP servers has become an everyday commodity, with the MCP raising concerns about its high token consumption. Teams now routinely use AI assistants to handle these tasks, freeing humans to focus on higher level design and integration.&lt;/p&gt;
&lt;h2 id=&quot;lessons-for-trying-this-yourself&quot;&gt;Lessons for Trying This Yourself&lt;/h2&gt;
&lt;p&gt;If you want to experiment with parallel AI work on your own project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give each AI a clear, separate task (for example: Research X, Write Y, Review Z).&lt;/li&gt;
&lt;li&gt;Keep your main code folder as the single source of truth; everyone must work from those exact files.&lt;/li&gt;
&lt;li&gt;Be the translator: take what one AI finds and turn it into a specific request for another.&lt;/li&gt;
&lt;li&gt;Never trust the output from one AI blindly; use another to verify key points before moving forward. Or even better: your own judgement. You will probably come up with better ideas than an AI. Originality is key.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It will not replace your judgment, but it can turn a lonely session into a collaborative task. My little macro pad works better because four different perspectives looked at it. This is not because any single AI is perfect, but because their strengths covered each other’s blind spots.&lt;/p&gt;
&lt;p&gt;If you are curious, you can check out the full project here: &lt;strong&gt;AJAZZ Deck on GitHub&lt;/strong&gt; (&lt;a href=&quot;https://github.com/jrodeiro5/ajazz-deck&quot;&gt;https://github.com/jrodeiro5/ajazz-deck&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note on Vendored Code &amp;amp; Icon Display&lt;/strong&gt;: This project includes vendored code from the Mirabox StreamDock SDK (located in sdk/). Icon display on the AKP153 device is still under investigation. While icon generation works reliably, the actual rendering on the device’s display may vary based on firmware version and device state.&lt;/p&gt;
&lt;h2 id=&quot;glossary&quot;&gt;Glossary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI (Command Line Interface):&lt;/strong&gt; A text format used to give commands to a computer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP (Model Context Protocol):&lt;/strong&gt; A standard that lets AI apps safely access data and tools on your local computer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WSL2 (Windows Subsystem for Linux):&lt;/strong&gt; A feature that lets you run a Linux environment inside Windows without needing a separate virtual machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;usbipd:&lt;/strong&gt; A Microsoft tool that shares USB devices between Windows and WSL2, allowing Linux programs to access hardware like keyboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Honest note: this post was partially written by an AI, supervised by me.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Building a Personal Brand Audit Tool with Firecrawl, Gemini and Lovable</title><link>https://javierrodeiro.com/blog/building-a-personal-brand-audit-tool-with-firecrawl-gemini-and-lovable/</link><guid isPermaLink="true">https://javierrodeiro.com/blog/building-a-personal-brand-audit-tool-with-firecrawl-gemini-and-lovable/</guid><description>A tool that searches the web for your name, scrapes the results and scores your digital presence, built with Firecrawl, Gemini and Lovable.</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I built &lt;a href=&quot;https://personal-brand-audit.lovable.app/&quot;&gt;Personal Brand Audit (BrandAudit)&lt;/a&gt;, a tool that tells you what the internet says about you. Enter your name and job title, and it searches the web, scrapes the results, and gives you a score.&lt;/p&gt;
&lt;p&gt;The idea came from a simple question: what do recruiters, investors, and clients actually see when they Google your name?&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Brand audit result card for Javier Rodeiro: score 100, grade S, 5 of 5 categories passed. Deep scan results: brand uniqueness 50 of 100, AI readiness 50 of 100, 1 name collision found.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/brand-audit.png&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-stack&quot;&gt;The Stack&lt;/h2&gt;
&lt;p&gt;The app runs on three services:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lovable&lt;/strong&gt; handles the frontend and backend. I built the React app and Supabase Edge Functions entirely through prompts. Lovable also provides an AI Gateway for accessing models like Gemini.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firecrawl&lt;/strong&gt; handles web intelligence. I use three endpoints: &lt;code&gt;/search&lt;/code&gt; to find mentions of your name, &lt;code&gt;/scrape&lt;/code&gt; to probe personal domains (automatically checking firstname+lastname.com/.es/.io), and &lt;code&gt;/agent&lt;/code&gt; to run deeper analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gemini&lt;/strong&gt; handles the analysis — scoring, grading, and category evaluation. It uses &lt;code&gt;gemini-2.0-flash&lt;/code&gt; with user-provided keys, with automatic fallback to &lt;code&gt;gemini-3-flash-preview&lt;/code&gt; via Lovable’s AI Gateway when quota limits are hit. Your digital presence is evaluated across five categories: visibility, authority, consistency, recency, and personal domain ownership.&lt;/p&gt;
&lt;h2 id=&quot;the-basic-audit&quot;&gt;The Basic Audit&lt;/h2&gt;
&lt;p&gt;When you submit your name, the edge function calls Firecrawl’s &lt;code&gt;/search&lt;/code&gt; endpoint:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;https://api.firecrawl.dev/v1/search&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  method: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Authorization&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`Bearer ${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;FIRECRAWL_KEY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Content-Type&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  body: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    query: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`&quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot; ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    limit: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    scrapeOptions: { formats: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;markdown&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One call returns search results with full page content as markdown. For personal domains, the app probes possible URLs (firstname+lastname.com, .es, .io) with &lt;code&gt;/scrape&lt;/code&gt;. If a valid site exists, it boosts the score.&lt;/p&gt;
&lt;p&gt;The markdown content goes to Gemini for analysis. You start at 100 points and lose points for each category where issues are found (penalties range from -10 to -20 per category). Users with minimal digital presence see a special “ghost” state encouraging them to build their online footprint.&lt;/p&gt;
&lt;h2 id=&quot;the-deep-scan&quot;&gt;The Deep Scan&lt;/h2&gt;
&lt;p&gt;The basic audit tells you what exists. The Deep Scan tells you how defensible your name is.&lt;/p&gt;
&lt;p&gt;This feature uses Firecrawl’s &lt;code&gt;/agent&lt;/code&gt; endpoint:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;https://api.firecrawl.dev/v2/agent&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  method: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Authorization&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`Bearer ${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;FIRECRAWL_KEY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Content-Type&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  body: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    prompt: agentPrompt,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    schema: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;object&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      properties: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        interference_score: { type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;number&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        collision_count: { type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;number&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        personal_website: { type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        has_schema: { type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;boolean&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    model: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;spark-1-mini&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The agent uses Firecrawl’s &lt;code&gt;spark-1-mini&lt;/code&gt; model internally (not Gemini) and runs autonomously: searching, navigating, and extracting structured data. It analyzes name collisions, detects personal websites, checks for Schema.org markup, and returns actionable recommendations.&lt;/p&gt;
&lt;p&gt;Deep Scans use approximately 10–15 Firecrawl credits per run (agent jobs are more expensive than simple searches). There’s a 24-hour cooldown between scans, which is bypassed if you provide your own Firecrawl key.&lt;/p&gt;
&lt;h2 id=&quot;the-ai-layer&quot;&gt;The AI Layer&lt;/h2&gt;
&lt;p&gt;The app uses your Gemini key first (&lt;code&gt;gemini-2.0-flash&lt;/code&gt;) to keep costs on your free tier. If your quota is exceeded (429/403 errors), it falls back to Lovable’s AI Gateway, which happens to run a newer model (&lt;code&gt;gemini-3-flash-preview&lt;/code&gt;), but exists primarily as a reliability safety net:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;https://ai.gateway.lovable.dev/v1/chat/completions&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  method: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Authorization&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`Bearer ${&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;LOVABLE_API_KEY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    &apos;Content-Type&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  body: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    model: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;google/gemini-3-flash-preview&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    messages: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { role: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;system&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, content: systemPrompt },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { role: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, content: userPrompt },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;getting-started-with-the-stack&quot;&gt;Getting Started with the Stack&lt;/h2&gt;
&lt;p&gt;If you want to build something similar, here is how to get set up.&lt;/p&gt;
&lt;h2 id=&quot;lovable&quot;&gt;Lovable&lt;/h2&gt;
&lt;p&gt;Lovable is an AI app builder. You describe what you want, and it generates a full-stack app with React frontend and Supabase backend.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://lovable.dev/invite/QG4YN1U&quot;&gt;lovable.dev&lt;/a&gt; and sign up&lt;/li&gt;
&lt;li&gt;Create a new project and describe your app&lt;/li&gt;
&lt;li&gt;Lovable generates the code and deploys it automatically&lt;/li&gt;
&lt;li&gt;Use the built-in editor to refine through prompts&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For backend functions, Lovable creates Supabase Edge Functions. The AI Gateway is available through &lt;code&gt;ai.gateway.lovable.dev&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;google-ai-studio-gemini&quot;&gt;Google AI Studio (Gemini)&lt;/h2&gt;
&lt;p&gt;Google AI Studio provides free access to Gemini models.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://aistudio.google.com/apikey&quot;&gt;aistudio.google.com/apikey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sign in with your Google account&lt;/li&gt;
&lt;li&gt;Click “Create API Key”&lt;/li&gt;
&lt;li&gt;Copy the key (starts with &lt;code&gt;AIza&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The free tier includes 1,500 requests per day.&lt;/p&gt;
&lt;h2 id=&quot;firecrawl&quot;&gt;Firecrawl&lt;/h2&gt;
&lt;p&gt;Firecrawl turns websites into structured data for AI.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://firecrawl.link/javier&quot;&gt;firecrawl.dev&lt;/a&gt; and sign up&lt;/li&gt;
&lt;li&gt;Navigate to the API Keys section in your dashboard&lt;/li&gt;
&lt;li&gt;Create a new key (starts with &lt;code&gt;fc-&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Copy the key&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The free tier includes 500 credits per month. A &lt;code&gt;/search&lt;/code&gt; call uses about 10 credits. Deep Scan agent jobs use 10-15 credits per run.&lt;/p&gt;
&lt;h2 id=&quot;reliability-features&quot;&gt;Reliability Features&lt;/h2&gt;
&lt;p&gt;The backend includes retry logic with exponential backoff for transient network errors, automatic fallback to the Lovable AI Gateway when user Gemini keys hit quota limits, and a ghost state for users with minimal digital presence.&lt;/p&gt;
&lt;h2 id=&quot;why-this-stack&quot;&gt;Why This Stack&lt;/h2&gt;
&lt;p&gt;Lovable removes the boilerplate. You focus on the product, not the infrastructure.&lt;/p&gt;
&lt;p&gt;Firecrawl removes the parsing. You get clean markdown from &lt;code&gt;/search&lt;/code&gt; and structured JSON from &lt;code&gt;/agent&lt;/code&gt;. No HTML cleanup. No brittle selectors.&lt;/p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;/h2&gt;
&lt;p&gt;The tool is free. You just need your own API keys from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://firecrawl.link/javier&quot;&gt;Firecrawl&lt;/a&gt; (500 credits/month free)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aistudio.google.com/apikey&quot;&gt;Google AI Studio&lt;/a&gt; (1,500 requests/day free)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Affiliate disclosure: The Firecrawl link is an affiliate link.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>You might not care about this: my 2025 ending credits.</title><link>https://javierrodeiro.com/blog/my-2025-ending-credits/</link><guid isPermaLink="true">https://javierrodeiro.com/blog/my-2025-ending-credits/</guid><description>A human-written look back at 2025: technical marketers, “Neanderthalism” in the year of AI, n8n-style automation and the times AI left me speechless.</description><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;But I´ll write anyways. 100% human generated. I don´t feel like using AI for writing tasks, as I believe it is one of the worst use cases for this kind of personal reflections. It destroys your own brand, your identity, your train of thought… And yes, I use AI every single day of my life and some would say my usage goes beyond what is considered “healthy”. I partially agree. “You are right, I see the issue”.&lt;/p&gt;
&lt;p&gt;But I feel like displaying some humanity here today.&lt;/p&gt;
&lt;p&gt;So, while I´m writing this I have Claude Code on the other screen carrying out a repository analysis so as to help me optimize a Python desktop app, which searches and analyses any kind of files across my downloads and desktop folders, leveraging local AI models. In the beginning of 2025, this would have sounded impossible to me or, at least, too complex or difficult to be working with this type of side projects&lt;/p&gt;
&lt;p&gt;This year I came up with too many reflections, thoughts and inner debates which sometimes made me question myself if I was on the right track. The truth is that only 2 years ago we saw a callous Will Smith swallowing pasta like if it was a sleep paralysis nightmare. Nowadays, even that I consume AI slop content more than I would like (although Messi and CR7 AI generated videos are hilarious), sometimes it is hard to distinguish between a Sora video or the reality.&lt;/p&gt;
&lt;p&gt;What is the right track then? Closing 2025, I see a huge, enormous gap between the ones who never went beyond using Chat GPT and the ones who are trying every new tool, keep being informed about the most recent news, talking with your peers about those… However, keeping up with the news is quite demanding.&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Two guys on a bus meme: the sad passenger facing the rock wall is labelled “the ones who know too much about AI tools”, the happy one facing the sunny valley “the ones who are ignorant about AI tools”.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/my-2025-ending-credits-1.jpg&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;And I don´t refer only to the tech market, neither using AI like it was life or death for any kind of activity: my point of view reflect saving time, effort and feeling comfortable using your trustworthy stack that, in the majority of cases, you don´t know that it exists or that you can do it with a known tool. However, you can increase your chances of finding it by applying the mindset I previously highlighted. At least, this is what made me grow this year: cutting the noise out and focusing on the valuable assets.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Let´s start covering more directly some debates or some recurrent topics that have been resonating in LinkedIn which I would like to give it a spin, completely unordered and improvised while I watch Claude do magic tricks:&lt;/p&gt;
&lt;h2 id=&quot;1-if-you-are-a-marketer-and-you-are-not-technical-at-all-you-lose&quot;&gt;1. If you are a marketer and you are not technical at all, you lose.&lt;/h2&gt;
&lt;p&gt;“But I am a creative! I can create marketing campaigns!”. Of course. But I consider that the cliché that associated IT jobs with being nerds or geeks is over. It is more likely that a Software Engineer comes up with a great business idea and a great marketing campaign than a marketer creating a professional full-stack application. And I don´t mean a Lovable app. Just think of all of these tech startup founders: they are doing marketing by showing their expertise, the quality of the product and posting a lot in social media about the progress they are making. Seeing what´s inside the kitchen is a great way to engage with the community.&lt;/p&gt;
&lt;p&gt;To me, there is no choice but to know our limits, understand the technical fundamentals of the digital marketing field and leverage AI to be less scared of seeing code on the screen. I was never that easy to start playing with some GitHub repositories or to build your own portfolio website -safely-. Avoid complicated things at first.&lt;/p&gt;
&lt;p&gt;Hence: everyone can have a good idea, but I do also believe that creativity is something that you are born with, being displayed in many ways: humor, solving technical problems, math, languages… You aren´t more creative than these people by right. Creativity is also solving ugly problems, not just creating beautiful content or art. But creative Data Scientists, Software Engineers or Quant Engineers… these guys have both the soft and hard skills, leveraged by AI. AI won´t take their job. They know what they are doing regarding complex technical comprehension plus the AI superpowers. Human creativity will never be replaced. But creative humans who can deliver things will replace the ones who not and just think.&lt;/p&gt;
&lt;h2 id=&quot;2-neanderthalism-in-the-year-of-ai&quot;&gt;2. “Neanderthalism” in the year of AI.&lt;/h2&gt;
&lt;p&gt;These folks were the ones who became famous by building their own tools, although earlier species like Homo Habilis did it already. Now I feel like a Neanderthal using rocks and fire to build my own custom tools.&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Illustration of a Neanderthal typing on a laptop, next to flint cores, fine-grained stone blades and a tablet showing ChatGPT.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/my-2025-ending-credits-2.jpg&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;This year it has been stupidly easy to create value by developing tailored tools, and not all tools should be posted in LinkedIn or shared because these may not have value for all people, but can save plenty of time and add a bit of spark to your days by fostering creativity. The interesting fact is that I invest the 70% of the time investigating, benchmarking and hunting for inspiration across GitHub repositories so as to give the AI the full picture. The other 10% could be running tests and debugging and the final 10% consists of the AI agent creating the code.&lt;/p&gt;
&lt;p&gt;I truly enjoy carrying out these kind of projects and then see the actual usefulness they provide. Not everything is soulless and brainless “vibe coding”. In fact, loads of project managers, CEOs and manager roles do like a vibe coding approach with their employees. Have their brain activity decreased recently by doing that? Who knows. But it is not fair to demonize an asset that can materialize people´s ideas almost instantly. Of course, AI must not take control over your personal decisions or opinions, specially with chatbots like Claude, which are great workers but too obliging. Gemini is more stubborn and honest.&lt;/p&gt;
&lt;p&gt;My take: in 2026, multitasking will be a highly valued skill which lies between hard and soft skill.&lt;/p&gt;
&lt;h2 id=&quot;3-like-excel-is-a-standard-for-working-with-tables-and-cells-n8n-esque-tools-will-become-one-regarding-automations&quot;&gt;3. Like Excel is a standard for working with tables and cells, n8n-esque tools will become one regarding automations.&lt;/h2&gt;
&lt;p&gt;There is no question that n8n might be one of the tools that exploded with the boom of generative. While present for many years, it has become a reference in 2025 by the wide variety of use cases. It is so groundbreaking that I´m sure it will be taught in many bachelors degrees, masters or bootcamps. Yes, I know that by pure coding you can achieve the same, but the existence of templates, documentation and moderate learning curve serve as an invitation to test it out first rather than trying to run the same workflow in Python. I tried both approaches for different side projects, and in some n8n was falling behind and in others n8n was much more convenient.&lt;/p&gt;
&lt;p&gt;Workflows are here to stay and we are seeing many SaaS replicating this formula. And it will be a very valuable proposal for digital marketing agencies which needs new business opportunities. Every digital marketing branch need some complex automation, not just a simple Zapier Zap (no offense, Zapier fans). So learning how n8n, Make, Zapier, Opal or any other tool like this is a must for digital marketing.&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;AI-generated image of a man in a supermarket holding broccoli and a doughnut, each surrounded by a workflow diagram. Thought bubble: “My n8n workflow for dinner is more complicated than my actual job”.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/my-2025-ending-credits-3.jpg&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-the-times-when-i-was-left-speechless-by-ai-this-year&quot;&gt;4. The times when I was left speechless by AI this year.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Claude Desktop using MCP servers: Seeing how Claude could access my Desktop folder and create a simple app was mind-blowing. I was one of the first of my circle to first try this new technology and it was thanks to Reddit. As in Spain we are, on average 6, months of progress behind other countries like the US regarding AI related news (partially because rigid European regulations), Reddit was a game-changer in terms of accessing grounded opinions by edgy experts. That way, on 6th of January I was already building with it in stealth mode, like Gollum with the precious ring. Months after, I saw posts about the MCP servers, the DeepSeek phenomena… everyone kept posting the same thing! It was like seeing clones posting the same news again and again. I really like LinkedIn despite these issues, but it is what it is I guess. Some raw proofs here, in Spanish slang format:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;WhatsApp messages from 6 January 2025: “Por cierto, estoy flipando con Claude si le metes el MCP server filesystem” and “Y también le metí la API de Brave search”.&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;../../../assets/articles/my-2025-ending-credits-4.jpg&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Midjourney image quality: by the way, is Midjourney still alive? Did Nano Banana or Sora kill it? Seriously, it was amazing on its peak of popularity.&lt;/li&gt;
&lt;li&gt;Notebook LM multimedia: specially infographics and video presentation. Quick, precise and good looking.&lt;/li&gt;
&lt;li&gt;Chinese AI models pricing: I could not believe my eyes when I was using DeepSeek´s popular model R1 very hard, like… abusing it. But my wallet never suffered. If I had done it with Claude Sonnet, my wallet would have holes like an emmental cheese. Quality models with ridiculous price.&lt;/li&gt;
&lt;li&gt;Claude Code: the truly agentic peer. You can run it in the CLI, in your favourite IDE… This product is insanely good which uses a spectacular model. It has become my go-to alongside Zed for building things. The thinking and the tricky questions are carried out by Gemini on its interface so as to make Claude Code truly focus. I merely supervise both and act like the angry impulsive CEO.&lt;/li&gt;
&lt;li&gt;LinkedMash: I have more than 3.000 posts saved on LinkedIn. This tool allows Claude or any other client to search across your bookmarks, classify them… It saved me 100 of hours. If you have the same problem, I suggest you to check it out. Link in comments.&lt;/li&gt;
&lt;li&gt;Google ADK: making a brief recapitulation of MCP, in June we saw Google announcing this repository. If MCP were good, this was like the cherry on the top. You could build almost any tool you came up with. Creating tags on GTM, scanning GA4 reports… Just insane. The problem: the tokens of these APIs are scarce. The most current problem: a system filled with 100 of tools is not efficient. That´s why many companies like Vercel are encouraging and implementing agentic systems with broad capabilities so as to be smart enough to activate the tools needed in certain models by a previous orchestration strategy. Only the tools needed for specific tasks at certain times.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;For that reason, I have been working hard since July to develop a platform that solves these kind of issues and boost the known capabilities of these frameworks to the next levels. No promises to be able to deliver it, but the path I followed to reach the position to where I am now was worth it. Failing is a possibility and it is daunting to think that I have been wasting my time, but at least I don´t have that sentiment.&lt;/p&gt;
&lt;p&gt;Nonetheless, I have been able to publish Addocu, which is my most humble “spread” contribution, published both in GitHub and in the Google Marketplace. Without the AI, it would have been impossible to do it that quick: 3 months with official website included. I hope I find some time to finish the product, as there are pending enhancements.&lt;/p&gt;
&lt;p&gt;That being said: if you have an idea, start building. There are less barriers than ever. If you want to learn as there was no AI whispering from your shoulder, you can also do it! AI is the best teacher, available 24/7. But the temptation to use AI is there. We all know it.&lt;/p&gt;
&lt;p&gt;I’m not sharing this to list my achievements or failures. I’m sharing this to make you reflect: &lt;strong&gt;What would you have thought one year ago if you had discovered all the new tech that came to light this year?&lt;/strong&gt; If you want to be different and have your own opinion and knowledge, test, test and test.&lt;/p&gt;
&lt;p&gt;Source: a guy who likes AI and building, this time feeling clumsy writing organically a post of this length. I hope you liked it and happy New Year.&lt;/p&gt;
</content:encoded></item></channel></rss>